代码之家  ›  专栏  ›  技术社区  ›  PhilippeAuriach

在android映射框中添加自承载的矢量平铺

  •  1
  • PhilippeAuriach  · 技术社区  · 7 年前

    我试图在我的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 回复  |  直到 7 年前
        1
  •  2
  •   PhilippeAuriach    7 年前

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

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