Как добавить / удалить маркеры с помощью MAPBOX android SDK

Я добавляю маркеры рекомендованным способом, добавляя маркер к стилю карты как новый слой

    List<Feature> symbolLayerIconFeatureList .....

    @Override
    public void onMapReady(@NonNull final MapboxMap mapboxMap) {

        symbolLayerIconFeatureList = new ArrayList<>();
        symbolLayerIconFeatureList.add(Feature.fromGeometry(
                Point.fromLngLat(-57.225365, -33.213144)));
        symbolLayerIconFeatureList.add(Feature.fromGeometry(
                Point.fromLngLat(-54.14164, -33.981818)));
        symbolLayerIconFeatureList.add(Feature.fromGeometry(
                Point.fromLngLat(-56.990533, -30.583266)));

        mapboxMap.setStyle(new Style.Builder().fromUri("mapbox://styles/mapbox/cjf4m44iw0uza2spb3q0a7s41")

        // Add the SymbolLayer icon image to the map style
                .withImage(ICON_ID, BitmapFactory.decodeResource(
                        MainActivity.this.getResources(), R.drawable.red_marker))

        // Adding a GeoJson source for the SymbolLayer icons.
                .withSource(new GeoJsonSource(SOURCE_ID,
                        FeatureCollection.fromFeatures(symbolLayerIconFeatureList)))

        // Adding the actual SymbolLayer to the map style. An offset is added that the bottom of the red
        // marker icon gets fixed to the coordinate, rather than the middle of the icon being fixed to
        // the coordinate point. This is offset is not always needed and is dependent on the image
        // that you use for the SymbolLayer icon.
                .withLayer(new SymbolLayer(LAYER_ID, SOURCE_ID)
                        .withProperties(PropertyFactory.iconImage(ICON_ID),
                                iconAllowOverlap(true),
                                iconOffset(new Float[]{0f, -9f}))
                ), new Style.OnStyleLoaded() {
            @Override
            public void onStyleLoaded(@NonNull Style style) {

        // Map is set up and the style has loaded. Now you can add additional data or make other map adjustments.


            }
        });
    }

Я хотел бы добавить или удалить один из маркеров по желанию во время выполнения, предположим, что это происходит после вызова api. Я пробовал это:

 markerCoordinates.remove(Feature.fromGeometry(
                        Point.fromLngLat(-57.225365, -33.213144)));
 mapView.invalidate();

Но это не работает. Другие варианты предлагали удалить слой, но это не сработало. Какие-либо предложения?


person Steve Kamau    schedule 18.09.2019    source источник


Ответы (2)


Это можно сделать в несколько шагов:

  1. Получите источник слоя с GeoJsonSource source = mapboxMap.getSourceAs(SOURCE_ID);
  2. Обновите свой список функций symbolLayerIconFeatureList, добавляя или удаляя любую функцию, которую вы хотите.
  3. Дайте вашему source список новых функций source.setGeoJson(FeatureCollection.fromFeatures(symbolLayerIconFeatureList));

И вам хорошо идти.

person iboalali    schedule 19.09.2019
comment
Это правильный ответ. Исправлена ​​моя проблема. Но сможет ли он обрабатывать несколько координат? - person Steve Kamau; 24.09.2019
comment
В свой список symbolLayerIconFeatureList вы можете добавить любое количество координат, система слоев Mapbox может обрабатывать большие объемы данных. Или я просто не понял твоего вопроса? - person iboalali; 24.09.2019

вы можете удалить маркер по sourceId. например: - mapStyle.removeSource(sourceId)

person Govind Prajapati    schedule 18.09.2019
comment
Я пробовал это new Handler().postDelayed(() -> { style.removeSource("marker-source");}, 10000 );, но мой маркер все еще виден на карте. - person Steve Kamau; 18.09.2019
comment
Я ушел и перешел на карты Google. Mapbox, похоже, не справился с этим. - person Steve Kamau; 19.01.2020