我正在尝试使用我的Android应用程序中的Mapbox在地图上显示自定义矢量图层。使用最新的mapbox版本。
当我按以下方式包含图层时:
//DOES NOT WORK
binding.mapView.getMapAsync(mapboxMap -> {
map = mapboxMap;
VectorSource source = new VectorSource("source-id", new TileSet("2.1.0", baseUrl + "/{z}/{x}/{y}.mvt"));
mapboxMap.addSource(source);
LineLayer layer = new LineLayer("zones-outline", "source-id");
layer.setSourceLayer("zones");
layer.setProperties(
PropertyFactory.lineWidth(2f),
PropertyFactory.lineColor(getResources().getColor(R.color.md_blue_500))
);
mapboxMap.addLayer(layer);
})
它没有显示任何内容(没有登录到android或我的服务器,就像mapbox甚至不知道这个层)。
但是如果我把addsource和addlayer代码放在runnable中,让我们说延迟100毫秒,它确实显示了我的图层。显然这看起来与某种并发或“初始化顺序”相关,并且延迟起作用,但它不是一个好的和正确的解决方案(我想在旧设备上加载地图可能需要超过100毫秒,也许它不会工作)。
//WORKS
binding.mapView.getMapAsync(mapboxMap -> {
final Handler handler = new Handler();
handler.postDelayed(() -> {
map = mapboxMap;
VectorSource source = new VectorSource("source-id", new TileSet("2.1.0", baseUrl + "/{z}/{x}/{y}.mvt"));
mapboxMap.addSource(source);
LineLayer layer = new LineLayer("zones-outline", "source-id");
layer.setSourceLayer("zones");
layer.setProperties(
PropertyFactory.lineWidth(2f),
PropertyFactory.lineColor(getResources().getColor(R.color.md_blue_500))
);
mapboxMap.addLayer(layer);
}, 100)
})
是否有其他方法/回调我应该进行初始化?如何确保我的图层将被绘制?
答案 0 :(得分:2)
问题来自于我在onMapReady回调中设置了一个新样式的url(根据显示的内容动态加载)。
我在地图初始化之前移动mapView.setStyleUrl(mapboxStyle)
:
mapView.setStyleUrl(mapboxStyle);
binding.contestMapView.onCreate(savedInstanceState);
binding.contestMapView.getMapAsync(mapboxMap -> {
// vector source and layer initialization
});