添加自托管矢量切片到和android mapbox

时间:2018-06-15 17:27:03

标签: android mapbox mapbox-gl mapbox-android

我正在尝试使用我的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)
})

是否有其他方法/回调我应该进行初始化?如何确保我的图层将被绘制?

1 个答案:

答案 0 :(得分:2)

问题来自于我在onMapReady回调中设置了一个新样式的url(根据显示的内容动态加载)。 我在地图初始化之前移动mapView.setStyleUrl(mapboxStyle)

mapView.setStyleUrl(mapboxStyle);
binding.contestMapView.onCreate(savedInstanceState);
binding.contestMapView.getMapAsync(mapboxMap -> {
    // vector source and layer initialization
});