Android MapBox:如何将多边形标记绘制在图层上方?
解决MapBox多边形标记被图层遮挡的问题
问题原因
你当前用mapboxMap.addPolygon()添加的多边形属于Annotation层,MapBox默认将Annotation层置于所有Style自定义图层的下方,所以会被你添加的FillExtrusionLayer遮挡。下面提供两种可行的解决方案:
方案一:调整Annotation层的层级
直接修改Annotation层的绘制顺序,让它位于目标图层上方:
fun drawMarker(lat: Double, lon: Double) { if (null != curBluedot) { mapboxMap.removePolygon(curBluedot!!) } if (null != mapboxMap) { curBluedot = mapboxMap.addPolygon(generatePerimeter( LatLng(lat, lon), 0.0005, 1000 )!!) // 将Annotation层放到名为"symbol"的FillExtrusionLayer上方 mapboxMap.setAnnotationLayerAbove("symbol") } }
方案二:将多边形转为Style图层(更推荐)
放弃Annotation系统,把多边形做成独立的Style图层,这样能更精准控制层级:
- 先在类中添加变量保存图层和数据源:
private var markerSource: GeoJsonSource? = null private var markerLayer: FillLayer? = null
- 修改
loadStyle方法,初始化标记的数据源和图层,并确保它在目标图层上方:
private fun loadStyle(featureCollection: FeatureCollection) { mapboxMap.setStyle(Style.Builder() .fromUri(Style.MAPBOX_STREETS) .addSource(GeoJsonSource("symbol", featureCollection)) // 移除FillExtrusionLayer中无效的图标属性(该图层不支持图标配置) .addLayer(FillExtrusionLayer("symbol", "symbol") .withProperties( fillExtrusionColor(Color.RED), fillExtrusionHeight(1.5f), fillExtrusionBase(1.0f), fillExtrusionOpacity(1.0f) )) // 添加标记的数据源和图层 .addSource(GeoJsonSource("marker-source")) .addLayer(FillLayer("marker-layer", "marker-source") .withProperties(fillColor(Color.BLUE))) ) { style -> markerSource = style.getSourceAs("marker-source") markerLayer = style.getLayerAs("marker-layer") // 强制将标记图层放在"symbol"图层上方 style.addLayerAbove(markerLayer!!, "symbol") } }
- 修改
drawMarker方法,通过更新数据源来绘制标记:
fun drawMarker(lat: Double, lon: Double) { markerSource?.let { source -> val polygonOpts = generatePerimeter(LatLng(lat, lon), 0.0005, 1000) val polygonGeometry = Polygon.fromLngLats(polygonOpts?.latLngs) val markerFeature = Feature.fromGeometry(polygonGeometry) source.setGeoJson(FeatureCollection.fromFeatures(listOf(markerFeature))) } }
内容的提问来源于stack exchange,提问作者user3239558
相关产品推荐
相关产品推荐

