有开发带有多边形覆盖的世界地图的应用程序的任务,应启用某些区域。为此,我在“世界”多边形中创建了孔。
这是使用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()))
}
}
}
此后,我们得到这个结果
当我缩放到最后2个缩放级别时,问题开始。根据地图的不同,心情孔可以用多边形填充或多边形填充消失。
我尝试过使用不同的地图阶梯,没有地图阶梯,以不同的方式创建覆盖多边形的世界...。
当我创建较小的多边形时,没有问题。
可能是因为孔多边形的点远离可见区域。您应该获得可见区域map.getProjection().getVisibleRegion()
,并仅在该区域附近添加孔多边形,但应尽可能提高边界上的点数。您可以使用map.getProjection().getVisibleRegion()
在每个孔多边形段上添加其他点。另外,您还需要类似SphericalUtil.interpolate()
问题的答案中的代码,以找到孔折线段的交集。而且无论如何,您始终可以创建基于SphericalUtil.interpolate()
的自定义组件,并在画布上手动绘制重叠的多边形。