【问题标题】:Polygon with holes in it act improperly (disappear) on high zoom带有孔的多边形在高缩放时行为不正确(消失)
【发布时间】:2020-04-08 08:17:34
【问题描述】:

有任务开发应用程序,世界地图上覆盖着多边形,并且某些区域应该“启用”。为此,我在那个“世界”多边形中创建了洞。

这是使用谷歌地图的安卓系统

    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    implementation 'com.google.android.gms:play-services-location:17.0.0'
override fun onMapReady(map: GoogleMap?) {
        if(map != null) {
            var holes: MutableList<MutableList<LatLng>> = mutableListOf()
            //Set coordinates for future hole on map
            var hole: MutableList<LatLng> = mutableListOf()
            hole.add(LatLng(47.438741, 16.868739))
            hole.add(LatLng(47.517742, 21.331959))
            hole.add(LatLng(40.517742, 21.331959))
            hole.add(LatLng(40.438741, 16.868739))
            holes.add(hole)
            //Adding world covering polygon
            map.addPolygon(
                createPolygonWithHoles(
                    holes,
                    applicationContext
                )
            )
        }
    }


    /**
     * Adding holes on map
     */
    private fun createPolygonWithHoles(holes: List<List<LatLng>>, context: Context): PolygonOptions {
       //Creating PolygonOptions of future world polygon
        val polyOptions = PolygonOptions()
            .addAll(createBoundsOfEntireMap())
            .strokeColor(resources.getColor(android.R.color.holo_blue_bright, null))
            .fillColor(resources.getColor(android.R.color.holo_red_dark, null))
            .strokeWidth(15f)
        //Adding holes to PolygoneOptions
        holes.forEach {
            polyOptions.addHole(it)
        }
       return polyOptions
    }

/**
     * Preparing and updating bounds on maps so that it looks like we have holes on it
     */
    private fun createBoundsOfEntireMap(): List<LatLng> {
        val delta = 0.00001f

        return object : ArrayList<LatLng>() {
            init {
                add(LatLng((90 - delta).toDouble(), (-180 + delta).toDouble()))
                add(LatLng(0.0, (-180 + delta).toDouble()))
                add(LatLng((-90 + delta).toDouble(), (-180 + delta).toDouble()))
                add(LatLng((-90 + delta).toDouble(), 0.0))
                add(LatLng((-90 + delta).toDouble(), (180 - delta).toDouble()))
                add(LatLng(0.0, (180 - delta).toDouble()))
                add(LatLng((90 - delta).toDouble(), (180 - delta).toDouble()))
                add(LatLng((90 - delta).toDouble(), 0.0))
                add(LatLng((90 - delta).toDouble(), (-180 + delta).toDouble()))
            }
        }
    }

之后我们就有了这个结果

当我缩放到最后 2 个缩放级别时,问题就开始了。根据地图情绪孔可以用多边形填充覆盖或多边形填充可以消失。

所有缩放级别的实际结果都应该是这样的。

我尝试了不同的地图阶梯,没有地图阶梯,不同的创建世界覆盖多边形的方式......

当我创建较小的多边形时没有问题。

【问题讨论】:

    标签: android google-maps zooming polygon


    【解决方案1】:

    这可能是因为孔多边形的点远离可见区域。您应该获得可见区域map.getProjection().getVisibleRegion() 并仅在该区域附近添加孔多边形,但由于性能,边界上的点尽可能多。您可以使用SphericalUtil.interpolate() 在每个孔多边形段上添加额外的点。您还需要类似this 问题答案中的代码来查找孔折线段的交点。无论如何,您始终可以创建自定义的基于MapView 的组件并在画布上手动绘制重叠的多边形。

    【讨论】:

    • @djevtic 你用哪个变体解决了这个问题?
    • 不幸的是,他们都没有。它们都是很好的解决方案,但不适用于我的用例。我制作了较小的多边形,它不覆盖整个世界,而只覆盖对我很重要的区域(欧洲和北美),并在其中打了洞。将多边形的边缘设置为透明并添加将覆盖世界其他地方的其他多边形。像往常一样添加孔只需要在已经存在的相同大小的孔的顶部添加额外的多边形才能创建边界。这种方法......值得怀疑,但它对我有用,并且没有对应用程序性能产生负面影响。
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多