You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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图层,这样能更精准控制层级:

  1. 先在类中添加变量保存图层和数据源:
private var markerSource: GeoJsonSource? = null
private var markerLayer: FillLayer? = null
  1. 修改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")
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:15:35