带有孔洞的多边形在高倍率下表现不当(消失)
Polygon with holes in it act improperly (disappear) on high zoom
有任务开发世界地图覆盖多边形的应用程序,某些区域应该是 "enabled"。为此,我在 "world" 多边形中创建了孔。
这是 Android 使用 google 地图
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()
and add holes polygons only near that area, but with as many points on borders as possible due performance. You can use SphericalUtil.interpolate()
to add additional points on each hole polygone segment. Also you need code like in answers for this 问题以找到孔多段线段的交点。无论如何,您始终可以创建自定义的基于 MapView
的组件并在 canvas 上手动绘制重叠的多边形。
有任务开发世界地图覆盖多边形的应用程序,某些区域应该是 "enabled"。为此,我在 "world" 多边形中创建了孔。
这是 Android 使用 google 地图
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()
and add holes polygons only near that area, but with as many points on borders as possible due performance. You can use SphericalUtil.interpolate()
to add additional points on each hole polygone segment. Also you need code like in answers for this 问题以找到孔多段线段的交点。无论如何,您始终可以创建自定义的基于 MapView
的组件并在 canvas 上手动绘制重叠的多边形。