Java / Andriod / MapBox - Как удалить символ с моей карты - PullRequest
0 голосов
/ 16 марта 2020

В настоящее время я создаю карту, которая обновляется на основе выбора пользователей и отображает 5 ближайших к ним мест. Это работает, однако, когда пользователь меняет свой выбор, карта обновляется и отображает 5 НОВЫХ местоположений, а также 5 СТАРЫХ местоположений.

Я не уверен, как удалить старые символы, кто-нибудь может помочь, пожалуйста?

Спасибо,

publi c void displayResults (ArrayList allLocation) {

    SymbolManager sm = new SymbolManager(mapView,map,styleMap);

    sm.deleteAll();
    SymList.clear();


        sm.setIconAllowOverlap(true);
        sm.setIconIgnorePlacement(true);

    int count = 1;

    for (LocationDetails a : allLocation
    ) {
        // gets the distance from user to Location
        double LocationLat = Double.parseDouble(a.getLatitude());
        double LocationLng = Double.parseDouble(a.getLongitude());
        float[] disResult = new float[1];
        Location.distanceBetween(lat, lng, LocationLat, LocationLng, disResult);
        results.append(count + ": " + a.getName() + " " + "\n");
        distanceResults.append(Math.round(disResult[0]) + "m" + "\n");

        SymbolOptions symbolOptions = new SymbolOptions()
                .withLatLng(new LatLng(LocationLat, LocationLng))
                .withIconImage("marker-11")
                .withTextField(""+count)
                .withIconColor("black")
                .withIconSize(2.5f);

        SymList.add(symbolOptions);

        count++;
    }

    LatLngBounds latLngBounds = new LatLngBounds.Builder()
            .include(SymList.get(0).getLatLng())
            .include(SymList.get(1).getLatLng())
            .include(SymList.get(2).getLatLng())
            .include(SymList.get(3).getLatLng())
            .include(SymList.get(4).getLatLng())
            .build();

    map.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 50), 2000);

    for(SymbolOptions a : SymList){
        sm.create(a);
    }

    SymList.clear();
}

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Я использую mapbox уже 3 месяца. После нескольких часов исследований я обнаружил, что на Android единственный способ удалить Символ или любой элемент на карте - это перезагрузить все элементы с нуля. К сожалению, в настоящее время нет способа удалить один элемент. Поэтому я предлагаю вам создать контейнерный класс для сохранения ваших предметов.

0 голосов
/ 25 марта 2020

Если в вашем случае использования требуется отображать на карте только около пяти маркеров одновременно, может быть проще использовать собственные источники и SymbolLayer с, чем полагаться на абстракцию, предоставленную SymbolManager.

Например, этот значок обновляется на основе ответа API Android demo , показывает, как добавить источник Geo JSON и соответствующий слой на карту, а затем обновить указанный источник до получить другой визуальный результат. В основном все необходимые вам логи c заключены здесь, но ваш Geo JSON будет представлять собой FeatureCollection из множества (а именно, 5) функций, а не только одну точку.

Итак, вы можете настроить ваши символы аналогично тому, как это делается в связанном примере:

private void initSpaceStationSymbolLayer(@NonNull Style style) {
  style.addImage("space-station-icon-id",
  BitmapFactory.decodeResource(
  this.getResources(), R.drawable.iss));

  style.addSource(new GeoJsonSource("source-id"));

  style.addLayer(new SymbolLayer("layer-id", "source-id").withProperties(
    iconImage("space-station-icon-id"),
    iconIgnorePlacement(true),
    iconAllowOverlap(true),
    iconSize(.7f)
  ));
}

, а затем обновите Geo JSON источника до новых мест, ближайших к позиции пользователя, аналогично updateMarkerPostion Метод:

private void updateMarkerPosition(LatLng position) {
  // This method is where we update the marker position once we have new coordinates. First we
  // check if this is the first time we are executing this handler, the best way to  do this is
  // check if marker is null;
  if (map.getStyle() != null) {
    GeoJsonSource spaceStationSource = map.getStyle().getSourceAs("source-id");
    if (spaceStationSource != null) {
      spaceStationSource.setGeoJson(FeatureCollection.fromFeature(
      Feature.fromGeometry(Point.fromLngLat(position.getLongitude(), position.getLatitude()))));
    }
  }

  // Lastly, animate the camera to the new position so the user
  // wont have to search for the marker and then return.
  map.animateCamera(CameraUpdateFactory.newLatLng(position));
}

Конечно, потребуется внести несколько изменений, но эта опция может быть более прямой для вашей реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...