Java 确定多边形是否在贴图边界内

Java 确定多边形是否在贴图边界内,java,android,geometry,google-maps-android-api-2,polygon,Java,Android,Geometry,Google Maps Android Api 2,Polygon,我有一个多边形的大列表(由谷歌地图多边形选项组成),我想在绘制它们之前检查它们是否在屏幕的范围内 如何确定多边形是否在屏幕边界内 大概是这样的: List<PolygonOptions> polygons = getPolygons(); LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; for (int l = 1; l <= polygons.siz

我有一个多边形的大列表(由谷歌地图多边形选项组成),我想在绘制它们之前检查它们是否在屏幕的范围内

如何确定多边形是否在屏幕边界内

大概是这样的:

   List<PolygonOptions> polygons = getPolygons();

    LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;

    for (int l = 1; l <= polygons.size(); l++) {
        if (bounds.Contains(polygons.get(l))) {
            map.addPolygon(polygons.get(l));
        }
    }
@Override
public void onMapReady(GoogleMap googleMap) {
    map = googleMap;
    map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            showPolygons();
        }
    });
    showPolygons();
}

private void showPolygons() {
    if (map == null) return;
    final LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;
    for (PolygonOptionsWrapper wrapper : wrappers) {
        if (wrapper.within(bounds)) {
            if (!wrapper.isAdded()) {
                wrapper.addTo(map);
            }
        } else {
            if (wrapper.isAdded()) {
                wrapper.removeFrom(map);
            }
        }
    }
}
List polygons=getPolygons();
LatLngBounds bounds=map.getProjection().getVisibleRegion().LatLngBounds;

对于(int l=1;l,我假设您不需要检查多边形中的每个点是否可见-您应该只检查四个易于计算的点:

每次用户移动地图时,您都应该在地图上放置多边形,其矩形边界位于可见边界内;类似这样:

   List<PolygonOptions> polygons = getPolygons();

    LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;

    for (int l = 1; l <= polygons.size(); l++) {
        if (bounds.Contains(polygons.get(l))) {
            map.addPolygon(polygons.get(l));
        }
    }
@Override
public void onMapReady(GoogleMap googleMap) {
    map = googleMap;
    map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            showPolygons();
        }
    });
    showPolygons();
}

private void showPolygons() {
    if (map == null) return;
    final LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;
    for (PolygonOptionsWrapper wrapper : wrappers) {
        if (wrapper.within(bounds)) {
            if (!wrapper.isAdded()) {
                wrapper.addTo(map);
            }
        } else {
            if (wrapper.isAdded()) {
                wrapper.removeFrom(map);
            }
        }
    }
}


您是否尝试过在例如
onCreate
方法中添加所有形状?在这种情况下是否存在性能问题?@Nikolai,我已经做了,但是一旦我将它们添加到OSMDroid贴图中,它在平移时会冻结约2秒。谷歌地图没有这个问题,我猜一旦多边形绘制GON时,您可以在不冻结的情况下平移没有问题。但是为了清晰起见,我需要在不同的缩放级别删除和添加一些形状。因为有这么多形状,在执行此操作时,它会冻结2-3秒。因此,我只想显示多边形和路径点,以便屏幕减少所需的工作。非常感谢您的参与看。我也尝试过道格拉斯·佩克算法,但没有什么不同。谢谢,你的一个图例。它可以被修改,这样即使地图上只有一部分多边形,它仍然会被绘制吗?目前,如果它的一小部分从地图上移走,多边形就会被删除,我不想让用户认为那里没有空域。那么如果上面图表中显示的点1、2、3、4在屏幕上,然后显示多边形。@Reafidy请看一看,这样更好,如果屏幕大小在形状内部,但形状的侧面仍然通过屏幕,则应显示形状。我在我的原始帖子中添加了两幅图像,以显示问题。此外:我怀疑如果我们最终在屏幕位于形状内部的位置绘制一些额外的形状,但形状的侧面没有穿过屏幕,这是否重要。否则,我猜数学将变得复杂。只有一个语句:。