其中带有孔的多边形在高倍放大时不正确地作用(消失)

问题描述 投票:0回答:1

有开发带有多边形覆盖的世界地图的应用程序的任务,应启用某些区域。为此,我在“世界”多边形中创建了孔。

这是使用Google地图的Android系统

    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()))
            }
        }
    }

此后,我们得到这个结果

World Polygon with hole

当我缩放到最后2个缩放级别时,问题开始。根据地图的不同,心情孔可以用多边形填充或多边形填充消失。

Whole world in redPolygon fill gone

在所有缩放级别上,实际结果都应该是这样的。enter image description here

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

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

android google-maps zoom polygon
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.