Видаліть маркер із 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 () для додавання маркерів?
користувач3927312

Щоб зробити це на потоці інтерфейсу користувача
Jonas

використовувати mMap.clear (), щоб очистити всі маркери
Bahaa Salaheldin

Відповіді:


260

Підпис методу для addMarker:

public final Marker addMarker (MarkerOptions options)

Отже, додаючи маркер до а GoogleMap, задаючи параметри маркера, слід зберегти Markerповернутий об’єкт (замість MarkerOptionsоб'єкта, який ви створили). Цей об’єкт дозволяє згодом змінити стан маркера. Коли ви закінчите з маркером, ви можете зателефонувати, Marker.remove()щоб видалити його з карти.

На відміну, якщо ви хочете лише приховати його тимчасово, ви можете переключити видимість маркера, зателефонувавши Marker.setVisible(boolean).


1
Це не працює для мене. marker.setVisible (false), marker.remove (), навіть markerManager.remove (marker) не впливає на карту. Маркери все ще залишаються. якісь підказки?
Тоталіс

1
Дивіться мій коментар нижче про тримання маркера, але він не має користі після його видалення з карти, якщо ви вирішите вивчити його значення. Метод Remove встановить значення тегу на нуль ...
Speckpgh

Розумний! Дякую!
Таслім Осені

32

Додайте маркер до такої карти

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

Тоді ви зможете скористатися методом видалення, він видалить лише той маркер

markerName.remove();

25

щоб очистити всі писанки у використанні карти

map.clear()

14
Це знімає всі накладки на карті, а не лише маркер, як підказує питання.
Емзор

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, хоча решта значень отримання повернуться зі значеннями, які ви встановили їм під час створення маркера. .

Значення 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.