Mapbox:如何纠正符号上的线重叠

Mapbox: How to correct Line overlapping over a Symbol

我正在使用 SymbolManager 在地图上显示两个符号。这是一个例子:

深色符号是因为我正在模拟器上测试项目,但线在符号下方,这是应该的。问题来自另一个符号(完成标志)。在我准备好绘制线条后,将调用以下代码块:

symbolManager = new SymbolManager(mapView,mMapboxMap,style);

symbolManager.setIconAllowOverlap(true);
symbolManager.setIconIgnorePlacement(true);

SymbolOptions symbolOptionsFinishFlag = new SymbolOptions()
              .withIconImage(IMAGE_FINISH_FLAG)
              .withIconSize(2.0f)
              .withLatLng(newLatLngs.get(newLatLngs.size()-1));

symbolManager.create(symbolOptionsFinishFlag);

LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.includes(newLatLngs);
LatLngBounds bounds = builder.build();

final CameraUpdate cu = new CameraUpdateFactory().newLatLngBounds(bounds,300);
mMapboxMap.easeCamera(cu,5000);

我在 Mapbox 网站上查了一些例子,似乎是正确的。但是,SymbolLine下面,我怎样才能把它放在上面呢?

尽管 SymbolManagers can be useful means for providing an abstraction over the methods needed to add symbols to a map, you may get some more flexibility by working with native SymbolLayers directly. This example shows how to add symbol layer icons to a map, and this example 展示了添加新图层时如何指定图层顺序。因此,通过为开始和结束图标添加两个符号层,并为它们之间的线添加一个线层,您可以使用 style.addLayerBelow(finishFlagLayer, "name_of_line_layer").

如果您使用 LineLayer,将其添加到地图时使用 style.addLayerBelow(lineLayer, symbolManager.layerId)

这个答案是关于如何在 Mapbox SDK v9 中做到这一点的。所有 AnnotationManager subclasses 都有一个构造函数,它允许你提到它应该在哪个 layerId 下面。

例如,在LineManager中,我们有这个构造函数

LineManager(MapView mapView, MapboxMap mapboxMap, Style style, java.lang.String belowLayerId)

这里需要的另一个方法是AnnotationManager class中的getLayerId方法,其中returns某层使用的id。

getLayerId

public java.lang.String getLayerId()

Returns a layer ID that annotations created by this manager are laid out on. This reference can be used together with Style#addLayerAbove(Layer, String) or Style#addLayerBelow(Layer, String) to improve other layers positioning in relation to this manager.

Returns:
underlying layer's ID

假设地图上有 3 个元素,一个圆,一条线和一个符号,我们需要在底部显示圆,然后在上面显示线,最后在最顶部显示符号。

所以我们将以这种方式创建我们的 AnnotationManagers -

val symbolManager = SymbolManager(mapView, map, map.style!!)
val lineManager = LineManager(mapView, map, map.style!!, symbolManager.layerId)
val fillManager = FillManager(mapView, map, map.style!!, lineManager.layerId)

我们在这里做的是,在创建 lineManager 对象时,我们传递了 symbolManager 的 layerId,以确保使用 LineManager 创建的线始终低于使用 SymbolManager 创建的符号。对于位于 lineManager 对象下方的 FillManager 也是如此。