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 网站上查了一些例子,似乎是正确的。但是,Symbol
在Line
下面,我怎样才能把它放在上面呢?
尽管 SymbolManager
s 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 SymbolLayer
s 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 也是如此。
我正在使用 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 网站上查了一些例子,似乎是正确的。但是,Symbol
在Line
下面,我怎样才能把它放在上面呢?
尽管 SymbolManager
s 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 SymbolLayer
s 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 也是如此。