Добавьте самостоятельные векторные плитки в картографический ящик Android.

Я пытаюсь отобразить пользовательский векторный слой на карте с помощью Mapbox в своем приложении для Android. Использование последней версии мапбокса.

Когда я включаю слой следующим образом:

//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 или на моем сервере, похоже, что слой даже не известен мапбоксу).

Но если я помещу код addsource и addlayer в исполняемый файл, скажем, с задержкой в ​​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)
})

Есть ли другой метод/обратный вызов, где я должен поместить эту инициализацию? Как убедиться, что мои слои будут нарисованы?


person PhilippeAuriach    schedule 15.06.2018    source источник


Ответы (1)


Проблема возникла из-за того, что я устанавливал, также в обратном вызове onMapReady, новый URL-адрес стиля (загружается динамически в зависимости от отображаемого содержимого). Я перемещаю mapView.setStyleUrl(mapboxStyle) перед инициализацией карты:

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