Удалить маркер из 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);
      }
    }
  });
}

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


Почему вы используете 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();

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, если вы когда-либо удаляете маркер, а затем пытаетесь ссылаться на него.

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


1

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

 marker.setVisible(false);

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


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))
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.