Удалить маркер из GoogleMap

124

В новом API Карт Google для Android мы можем добавить маркер , но нет способа (легко) удалить его.

Мое решение - оставить маркеры на карте и перерисовать карту, когда я хочу удалить маркер, но это не очень эффективно.

private final Map<String, MarkerOptions> mMarkers = new ConcurrentHashMap<String, MarkerOptions>();

private void add(String name, LatLng ll) {
  final MarkerOptions marker = new MarkerOptions().position(ll).title(name);
  mMarkers.put(name, marker);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.addMarker(marker);
    }
  });
}

private void remove(String name) {
  mMarkers.remove(name);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.clear();

      for (MarkerOptions item : mMarkers.values()) {
        mMap.addMarker(item);
      }
    }
  });
}

Есть ли у кого-нибудь идеи получше?

Jonas
источник
Почему вы используете Runnable () для добавления маркеров?
user3927312 03
Сделать это в ветке пользовательского интерфейса
Джонас
используйте mMap.clear (), чтобы очистить все маркеры
Бахаа Салахельдин 01

Ответы:

260

Сигнатура метода для addMarker:

public final Marker addMarker (MarkerOptions options)

Поэтому, когда вы добавляете маркер к GoogleMap, указав параметры для маркера, вы должны сохранить Markerвозвращаемый объект (вместо MarkerOptionsобъекта, который вы использовали для его создания). Этот объект позволяет вам позже изменить состояние маркера. Когда вы закончите с маркером, вы можете позвонить, Marker.remove()чтобы удалить его с карты.

Кстати, если вы хотите только временно скрыть его, вы можете переключить видимость маркера, позвонив Marker.setVisible(boolean).

Энтони
источник
1
У меня это не работает. marker.setVisible (false), marker.remove (), даже markerManager.remove (маркер) не влияет на карту. Маркеры еще остались. какие-нибудь намеки?
Totalys
1
См. Мой комментарий ниже о том, как удерживать маркер, хотя от него мало пользы после того, как он был удален с карты, если вы решите проверить его значения. Метод Remove устанавливает значение тега равным null ...
Speckpgh
Умная! Спасибо!
Таслим Осени
32

Добавьте маркер на карту вот так

Marker markerName = map.addMarker(new MarkerOptions().position(latLng).title("Title"));

Затем вы сможете использовать метод удаления, он удалит только этот маркер

markerName.remove();
Eclipse22
источник
25

очистить все каракули на карте используйте

map.clear()
Федерико Верчес
источник
14
Это очищает все наложения на карте, а не только маркер, как предполагает вопрос.
Emzor
4

если маркер существует, удалите последний маркер. если маркер не существует, создать текущий маркер

Marker currentMarker = null;
if (currentMarker!=null) {
    currentMarker.remove();
    currentMarker=null;
}

if (currentMarker==null) {
    currentMarker = mMap.addMarker(new MarkerOptions().position(arg0).
    icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
}
Дор Шарони
источник
3

Если вы используете язык Kotlin, просто добавьте этот код:

Создание глобальных переменных GoogleMapи Markerтипов.

Я использую маркер переменной, чтобы значение маркера переменной могло изменяться напрямую

private lateinit var map: GoogleMap
private lateinit var marker: Marker

И я использую эту функцию / метод, чтобы добавить маркер на свою карту:

private fun placeMarkerOnMap(location: LatLng) {
    val markerOptions = MarkerOptions().position(location)
    val titleStr = getAddress(location)
    markerOptions.title(titleStr)
    marker = map.addMarker(markerOptions)
}

После создания функции я помещаю этот код на, onMapReady()чтобы удалить маркер и создать новый:

map.setOnMapClickListener { location ->
        map.clear()
        marker.remove()
        placeMarkerOnMap(location)
    }

Это бонус, если вы хотите отображать местоположение адреса при нажатии на маркер, добавьте этот код, чтобы скрыть и показать адрес маркера, но вам нужен метод для получения местоположения адреса. Я получил код из этого сообщения: Как получить полный адрес по широте и долготе?

map.setOnMarkerClickListener {marker ->
        if (marker.isInfoWindowShown){
            marker.hideInfoWindow()
        }else{
            marker.showInfoWindow()
        }
        true
    }
Фаиз Азхар Ристья Нуграха
источник
2

используйте следующий код:

 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
       @Override
       public boolean onMarkerClick(Marker marker) {

           marker.remove();
           return true;
       }
   });

как только вы нажмете на «маркер» , вы можете удалить его.

Куо Чанг
источник
2

Просто ПРИМЕЧАНИЕ, то, на что я потратил часы сегодня вечером ...

Если по какой-то причине вы решили удерживать маркер после УДАЛЕНИЯ его с карты ... getTag вернет NULL, даже если оставшиеся значения get вернутся со значениями, которые вы установили для них при создании маркера. ,

Значение TAG устанавливается в NULL, если вы когда-либо удаляете маркер, а затем пытаетесь ссылаться на него.

Мне кажется, что это ошибка ...

Speckpgh
источник
1

1. Если вы хотите удалить маркер, вы можете сделать это. В качестве marker.remove(); альтернативы вы также можете скрыть маркер, а не удалять его как

 marker.setVisible(false);

и сделать его видимым позже, когда это необходимо.
2. Однако, если вы хотите удалить все маркеры с карты, используйте map.clear();
Примечание: map.clear(); также удалит Polylines, Circlesи т. Д.
3. Если вы не хотите удалять Polylines, Circlesи т. Д., Используйте цикл по длине маркера (если у вас несколько маркеров), чтобы удалить их. Посмотрите пример здесь ИЛИ установите их Visible false И не используйте map.clear();в таком случае.

Инзимам Тарик IT
источник
1

Сделайте глобальную переменную для отслеживания маркера

private Marker currentLocationMarker;

// Удаляем старый маркер

            if (null != currentLocationMarker) {
                currentLocationMarker.remove();
            }

// Добавляем обновленный маркер и перемещаем камеру

            currentLocationMarker = mMap.addMarker(new MarkerOptions().position(
                    new LatLng(getLatitude(), getLongitude()))
                    .title("You are now Here").visible(true)
                    .icon(Utils.getMarkerBitmapFromView(getActivity(), R.drawable.auto_front))
                    .snippet("Updated Location"));

            currentLocationMarker.showInfoWindow();
Хитеш Саху
источник
0

Создать массив со всеми маркерами при добавлении на карту.

Позже используйте:

Marker temp = markers.get(markers.size() - 1);
temp.remove();
Элтон да Коста
источник
0

Для тех, кто следит за примером в этом проекте GoogleMaps - MapWithMarker , вы можете удалить маркер, сделав это.

override fun onMapReady(googleMap: GoogleMap?) {
    googleMap?.apply {

        // Remove marker
        clear()

        val sydney = LatLng(-33.852, 151.211)
        addMarker(
            MarkerOptions()
                .position(sydney)
                .title("Marker in Sydney")
        )
        moveCamera(CameraUpdateFactory.newLatLng(sydney))
    }
}
Наим Джамаллудин
источник