Google Maps API v3: как убрать все маркеры?


429

В Google Maps API v2, если бы я хотел удалить все маркеры карты, я мог бы просто сделать:

map.clearOverlays();

Как мне сделать это в Google Maps API v3 ?

Глядя на Reference API , мне неясно.


3
Я нашел некоторый код по ссылке ниже, но святая корова - это много кода, имитирующего предыдущую 1 строку кода в v2 API. lootogo.com/googlemapsapi3/markerPlugin.html
mp_

2
помните, что карты 3.0 должны быть ОЧЕНЬ легкими для того, чтобы мобильные устройства могли использовать их с минимальной задержкой ...
Petrogad

1
Предлагаемые здесь решения, по-видимому, нарушены по состоянию на 2010/07/29. Я хотел бы иметь рабочую версию, чтобы предложить вместо.
Джонатан Хэнсон

9
Самый высокий рейтинг неверен. Посмотрите исходный код этого примера, чтобы узнать, как это сделать: google-developers.appspot.com/maps/documentation/javascript/…
Себ Эштон,

Пожалуйста, посмотрите на эту страницу gmaps-utility-library.googlecode.com/svn/trunk/markermanager/…
Джунаид Кадир

Ответы:


487

Просто сделайте следующее:

I. Объявите глобальную переменную:

var markersArray = [];

II. Определить функцию:

function clearOverlays() {
  for (var i = 0; i < markersArray.length; i++ ) {
    markersArray[i].setMap(null);
  }
  markersArray.length = 0;
}

ИЛИ

google.maps.Map.prototype.clearOverlays = function() {
  for (var i = 0; i < markersArray.length; i++ ) {
    markersArray[i].setMap(null);
  }
  markersArray.length = 0;
}

III. Вставьте маркеры в 'markerArray' перед вызовом следующего:

markersArray.push(marker);
google.maps.event.addListener(marker,"click",function(){});

Внутривенно ПозвонитеclearOverlays(); или map.clearOverlays();функцию, где это необходимо.

Это оно!!


32
для ... в цикле с массивом? это не может быть хорошо, конечно ..? ..see: stackoverflow.com/questions/500504/…
Зак

4
В качестве альтернативы вы можете скрыть маркеры с помощью marker.setVisible (ложь)
NBK

12
Маркеры все еще хранятся в массиве, поэтому он будет расти все больше и больше. Рекомендовал бы также очистить массив после цикла
Ami

5
вы всегда можете установить markersArrayпустой массив вместо установки его длины, что я нахожу markersArray = [];
довольно

11
Я хотел бы использовать whileподход для обработки массива: while(markersArray.length) { markersArray.pop().setMap(null); }. После этого не нужно очищать массив.
YingYang

84

Та же проблема. Этот код больше не работает.

Я исправил это, изменил метод clearMarkers следующим образом:

set_map (null) ---> setMap (null)

google.maps.Map.prototype.clearMarkers = function() {
    for(var i=0; i < this.markers.length; i++){
        this.markers[i].setMap(null);
    }
    this.markers = new Array();
};

Документация была обновлена ​​и теперь содержит подробные сведения по этой теме: https://developers.google.com/maps/documentation/javascript/markers#remove.


1
В итоге я получил возможность перебирать коллекцию маркеров, в которой я их хранил, и использовать setMap (null)
Себастьян,

4
Но очищает ли это маркеры от памяти? Я понимаю, что JavaScript имеет автоматическую сборку мусора, но откуда мы знаем, что API Google не содержит ссылку на маркер при вызове setMap (null)? В моем приложении я добавляю и «удаляю» тонну маркеров, и я бы не хотел, чтобы все эти «удаленные» маркеры занимали память.
Ник

@Nick: добавить 'удалить this.markers [i];' после бита setMap (null).
DaveS

4
На этот вопрос сейчас есть ответы в документации. code.google.com/apis/maps/documentation/javascript/…
lashleigh

1
Кто вообще пользуется new Array();?
Рихардс

47

Похоже, что в V3 такой функции еще нет.

Люди предлагают сохранить в массиве ссылки на все маркеры, которые есть на карте. И затем, когда вы хотите удалить их все, просто выполните цикл через массив и вызовите метод .setMap (null) для каждой из ссылок.

Смотрите этот вопрос для получения дополнительной информации / кода.

Моя версия:

google.maps.Map.prototype.markers = new Array();

google.maps.Map.prototype.getMarkers = function() {
    return this.markers
};

google.maps.Map.prototype.clearMarkers = function() {
    for(var i=0; i<this.markers.length; i++){
        this.markers[i].setMap(null);
    }
    this.markers = new Array();
};

google.maps.Marker.prototype._setMap = google.maps.Marker.prototype.setMap;

google.maps.Marker.prototype.setMap = function(map) {
    if (map) {
        map.markers[map.markers.length] = this;
    }
    this._setMap(map);
}

Код отредактированной версии этого кода http://www.lootogo.com/googlemapsapi3/markerPlugin.html Я убрал необходимость вызывать addMarker вручную.

Pros

  • Делая так, вы сохраняете код компактным и в одном месте (не загрязняет пространство имен).
  • Вам больше не нужно отслеживать маркеры самостоятельно, вы всегда можете найти все маркеры на карте, вызвав map.getMarkers ()

Cons

  • Использование прототипов и оболочек, как я сделал сейчас, делает мой код зависимым от кода Google, и если они сделают мэром изменение в своем источнике, это сломается.
  • Если вы не понимаете этого, вы не сможете это исправить, если он сломается. Вероятность того, что они изменят что-то, что сломает это, невелика, но все же ..
  • Если вы удалите один маркер вручную, его ссылка останется в массиве маркеров. (Вы можете отредактировать мой метод setMap, чтобы исправить это, но ценой зацикливания массива ринговых маркеров и удаления ссылки)

1
+1 От меня. Но ваш ответ будет лучше, если вы включите обертку для автоматического вызова addMarker!
Эндрю

Я полагаю, вы на самом деле имеете в виду ответ Эндрюса. Покажите ли вы с кодом, что вы делаете по-другому и почему. Спасибо
mp_

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

Спасибо, Майку. Хотя я не понимаю - как мне добавить новый маркер в вашем примере. Опять же большое спасибо!
mp_

1
Я пытался использовать setMap (null), но у меня был скрипт автообновления, и каждый раз, когда я устанавливал все 50 или около того моих маркеров на нулевую карту, у меня все еще оставалась куча маркеров без карты, плавающих где-то в DOM. Это продолжало вызывать сбой страницы, потому что каждые 30 секунд она добавляла 50 новых маркеров в DOM, и это распространялось бесконечно, потому что страница оставалась открытой 24/7 на видеостене. Мне пришлось использовать верхний ответ и полностью очистить все наложения карты из DOM, прежде чем создавать новые. Надеюсь, это кому-нибудь поможет; мне потребовалось много времени, чтобы понять, почему моя страница зависала! :(
InterfaceGuy

23

Это было самое простое из всех решений, первоначально опубликованных YingYang Mar 11 '14 в 15: 049 под первоначальным ответом пользователя на оригинальный вопрос.

Я использую его то же решение через 2,5 года с Google Maps v3.18, и он работает как шарм

markersArray.push(newMarker) ;
while(markersArray.length) { markersArray.pop().setMap(null); }

// No need to clear the array after that.

21
google.maps.Map.prototype.markers = new Array();

google.maps.Map.prototype.addMarker = function(marker) {
    this.markers[this.markers.length] = marker;
};

google.maps.Map.prototype.getMarkers = function() {
    return this.markers
};

google.maps.Map.prototype.clearMarkers = function() {
    for(var i=0; i<this.markers.length; i++){
        this.markers[i].setMap(null);
    }
    this.markers = new Array();
};

Я не думаю, что есть один в V3, поэтому я использовал вышеуказанную пользовательскую реализацию.

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


+1 От меня. Я бы добавил обертку вокруг конструктора google.maps.Marker (или метода setMap, так как я думаю, что конструктор вызывает его внутренне), который автоматически вызывает addMarker, но все же хороший ответ :).
Майку Мори

@Maiku Mari, покажи с кодом, что ты делаешь иначе и почему. Спасибо
mp_

Как это не решение? Вы удаляете маркеры, используя set_map (null) на конкретном маркере, который хотите очистить, если вы хотите очистить все, затем циклически используйте эту функцию. Если вы хотите что-то еще, запросите это здесь: code.google.com/p/gmaps-api-issues/issues/…
Petrogad

Я полагаю, что это пришло отсюда lootogo.com/googlemapsapi3/markerPlugin.html
Майку Мори

6
-1 Плохой стиль. Создан только один массив маркеров, но по одному на карту после clearMarkers (причина различий get / set с прототипами). Противные ошибки с несколькими объектами карты.
Томас

18

На новой версии v3 рекомендовано хранить в массивах. следующим образом.

Смотрите пример в оверлейном обзоре .

var map;
var markersArray = [];

function initialize() {
  var haightAshbury = new google.maps.LatLng(37.7699298, -122.4469157);
  var mapOptions = {
    zoom: 12,
    center: haightAshbury,
    mapTypeId: google.maps.MapTypeId.TERRAIN
  };
  map =  new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

  google.maps.event.addListener(map, 'click', function(event) {
    addMarker(event.latLng);
  });
}

function addMarker(location) {
  marker = new google.maps.Marker({
    position: location,
    map: map
  });
  markersArray.push(marker);
}

// Removes the overlays from the map, but keeps them in the array
function clearOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
  }
}

// Shows any overlays currently in the array
function showOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(map);
    }
  }
}

// Deletes all markers in the array by removing references to them
function deleteOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
    markersArray.length = 0;
  }
}

6

В демонстрационной галерее Google есть демонстрация того, как они это делают:

http://code.google.com/apis/maps/documentation/javascript/examples/overlay-remove.html

Вы можете просмотреть исходный код, чтобы увидеть, как они добавляют маркеры.

Короче говоря, они хранят маркеры в глобальном массиве. При очистке / удалении они перебирают массив и вызывают «.setMap (null)» для данного объекта маркера.

Тем не менее, этот пример показывает один «трюк». «Очистить» в этом примере означает удаление их с карты, но сохранение их в массиве, что позволяет приложению быстро добавить их на карту. В некотором смысле это действует как «сокрытие» их.

«Удалить» также очищает массив.



6

Решение довольно простое. Вы можете использовать метод:marker.setMap(map); . Здесь вы определяете, на какой карте появится значок.

Таким образом, если вы установите nullв этом методе ( marker.setMap(null);), контакт исчезнет.


Теперь вы можете написать функцию-ведьму, заставляя исчезать все маркеры на вашей карте.

Вы просто добавляете ваши контакты в массив и объявляете их, markers.push (your_new pin)например, следующим кодом:

// Adds a marker to the map and push to the array.
function addMarker(location) {
  var marker = new google.maps.Marker({
    position: location,
    map: map
  });
  markers.push(marker);
}

Это функция, которая может устанавливать или скрывать все маркеры вашего массива на карте:

// Sets the map on all markers in the array.
  function setMapOnAll(map) {
    for (var i = 0; i < markers.length; i++) {
      markers[i].setMap(map);
    }
  }

Чтобы удалить все ваши маркеры, вы должны вызвать функцию с помощью null:

// Removes the markers from the map, but keeps them in the array.
  function clearMarkers() {
    setMapOnAll(null);
  }

И, чтобы удалить и исчезнуть все ваши маркеры, вы должны сбросить массив маркеров следующим образом:

// Deletes all markers in the array by removing references to them.
  function deleteMarkers() {
    clearMarkers();
    markers = [];
  }

Это мой полный код. Это самое простое, что я мог бы уменьшить. Будьте внимательны, вы можете заменить YOUR_API_KEYв коде свой ключ Google API:

<!DOCTYPE html>
<html>
  <head>
  <title>Remove Markers</title>
  <style>
     /* Always set the map height explicitly to define the size of the div
     * element that contains the map. */
     #map {
       height: 100%;
       }
  </style>
</head>
<body>

<div id="map"></div>
<p>Click on the map to add markers.</p>
<script>

  // In the following example, markers appear when the user clicks on the map.
  // The markers are stored in an array.
  // The user can then click an option to hide, show or delete the markers.
  var map;
  var markers = [];

  function initMap() {
    var haightAshbury = {lat: 37.769, lng: -122.446};

    map = new google.maps.Map(document.getElementById('map'), {
      zoom: 12,
      center: haightAshbury,
      mapTypeId: 'terrain'
    });

    // This event listener will call addMarker() when the map is clicked.
    map.addListener('click', function(event) {
      addMarker(event.latLng);
    });

    // Adds a marker at the center of the map.
    addMarker(haightAshbury);
  }

   // Adds a marker to the map and push to the array.
  function addMarker(location) {
    var marker = new google.maps.Marker({
      position: location,
      map: map
    });
    markers.push(marker);
  }

  // Sets the map on all markers in the array.
  function setMapOnAll(map) {
    for (var i = 0; i < markers.length; i++) {
      markers[i].setMap(map);
    }
  }

  // Removes the markers from the map, but keeps them in the array.
  function clearMarkers() {
    setMapOnAll(null);
  }

  // Shows any markers currently in the array.
  function showMarkers() {
    setMapOnAll(map);
  }

  // Deletes all markers in the array by removing references to them.
  function deleteMarkers() {
    clearMarkers();
    markers = [];
  }

</script>
   <script async defer
    src="https://maps.googleapis.com/maps/api/js key=YOUR_API_KEY&callback=initMap">
   </script>
</body>
</html>

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


5

Чистое и простое применение ответа Ролингера.

function placeMarkerAndPanTo(latLng, map) {
      while(markersArray.length) { markersArray.pop().setMap(null); }
      var marker = new google.maps.Marker({
        position: latLng,
        map: map
      });
      map.panTo(latLng);

      markersArray.push(marker) ;
    }


4

Здесь вы можете найти пример того, как удалить маркеры:

https://developers.google.com/maps/documentation/javascript/examples/marker-remove?hl=es

// Add a marker to the map and push to the array.
function addMarker(location) {
  var marker = new google.maps.Marker({
    position: location,
    map: map
  });
  markers.push(marker);
}

// Sets the map on all markers in the array.
function setAllMap(map) {
  for (var i = 0; i < markers.length; i++) {
    markers[i].setMap(map);
   }
}

// Removes the markers from the map, but keeps them in the array.
function clearMarkers() {
  setAllMap(null);
}

// Deletes all markers in the array by removing references to them.
function deleteMarkers() {
  clearMarkers();
  markers = [];
}

3

Следующее от Anon работает отлично, хотя с мерцаниями при многократной очистке оверлеев.

Просто сделайте следующее:

I. Объявите глобальную переменную:

var markersArray = [];

II. Определить функцию:

function clearOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
  }
}

III. Вставьте маркеры в 'markerArray' перед вызовом следующего:

markersArray.push(marker);
google.maps.event.addListener(marker,"click",function(){});

Внутривенно Вызывайте clearOverlays()функцию везде, где это необходимо.

Это оно!!

Надеюсь, что это поможет вам.


1
for(in in markersArray){}вероятно, не делает то, что вы ожидаете. Если Arrayон распространяется где-либо еще в коде, он будет перебирать и эти свойства, а не только индексы. Версия javascript, markersArray.forEach()которая поддерживается не везде. С вами будет лучшеfor(var i=0; i<markersArray.length; ++i){ markersArray.setMap(null); }
Кит Санд

3

Я нашел использование библиотеки markermanager в проекте google-maps-utility-library-v3 как самый простой способ.

1. Настройте MarkerManager

mgr = new MarkerManager(map);
google.maps.event.addListener(mgr, 'loaded', function () {
    loadMarkers();
});

2. Добавьте маркеры в MarkerManager

function loadMarkers() {
  var marker = new google.maps.Marker({
            title: title,
            position: latlng,
            icon: icon
   });
   mgr.addMarker(marker);
   mgr.refresh();
 }

3. Для очистки маркеров вам просто нужно вызвать clearMarkers()функцию MarkerManger

mgr.clearMarkers();

Кажется, что это слишком много, чтобы убрать эту библиотеку для очистки маркеров. ВсеclearMarkers нужно сделать, это перебрать маркеры вызова marker.setMap(null)(я проверил источник). Было бы меньше труда поместить их в массив и сделать это самостоятельно.
Кит Сунде

3

Вы также можете сделать это так:

function clearMarkers(category){ 
  var i;       

  for (i = 0; i < markers.length; i++) {                          
    markers[i].setVisible(false);        
  }    
}

2

Я только что попробовал это с kmlLayer.setMap (null), и это сработало. Не уверен, что это будет работать с обычными маркерами, но, кажется, работает правильно.


2

Чтобы убрать все наложения, включая полис, маркеры и т. Д.

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

map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);}

Вот функция, которую я написал, чтобы сформировать меня в приложении карты:

  function clear_Map() {
    directionsDisplay = new google.maps.DirectionsRenderer();
    //var chicago = new google.maps.LatLng(41.850033, -87.6500523);
    var myOptions = {
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        center: HamptonRoads
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    directionsDisplay.setMap(map);
    directionsDisplay.setPanel(document.getElementById("directionsPanel"));
}

не сбросит ли это и карту? предположим, если пользователь перетащил карту в новую область?
Кичу

2

Чтобы удалить все маркеры с карты, создайте функции примерно так:

1.addMarker (location): эта функция используется для добавления маркера на карту.

2.clearMarkers (): эта функция удаляет все маркеры с карты, а не с массива

3.setMapOnAll (map): эта функция используется для добавления информации о маркерах в массив

4.deleteMarkers (): эта функция удаляет все маркеры в массиве, удаляя ссылки на них.

// Adds a marker to the map and push to the array.
      function addMarker(location) {
        var marker = new google.maps.Marker({
          position: location,
          map: map
        });
        markers.push(marker);
      }


// Sets the map on all markers in the array.
      function setMapOnAll(map) {
        for (var i = 0; i < markers.length; i++) {
          markers[i].setMap(map);
        }
      }



// Removes the markers from the map, but keeps them in the array.
  function clearMarkers() {
    setMapOnAll(null);
  }

// Deletes all markers in the array by removing references to them.
      function deleteMarkers() {
        clearMarkers();
        markers = [];
      }

2

Самый простой способ сделать это - перебрать все элементы карты. Маркеры (вместе с полигонами, полилиниями и т. Д.) Хранятся в слое данных карты.

function removeAllMarkers() {
  map.data.forEach((feature) => {
    feature.getGeometry().getType() === 'Point' ? map.data.remove(feature) : null
  });
}

В случае, если маркеры добавляются через менеджер чертежей , лучше всего создать глобальный массив маркеров или поместить маркеры в слой данных при создании следующим образом:

google.maps.event.addListener(drawingManager, 'overlaycomplete', (e) => {
    var newShape = e.overlay;
    newShape.type = e.type;

    if (newShape.type === 'marker') {
      var pos = newShape.getPosition()
      map.data.add({ geometry: new google.maps.Data.Point(pos) });

      // remove from drawing layer
      newShape.setMap(null);
    }
  });

Я рекомендую второй подход, поскольку он позволяет позже использовать другие методы класса google.maps.data.



0

Я не знаю почему, но установка setMap(null)на мои маркеры не работала для меня, когда я использую DirectionsRenderer.

В моем случае мне также пришлось позвонить setMap(null)своему DirectionsRenderer.

Что-то такое:

var directionsService = new google.maps.DirectionsService();
var directionsDisplay = new google.maps.DirectionsRenderer();

if (map.directionsDisplay) {
    map.directionsDisplay.setMap(null);
}

map.directionsDisplay = directionsDisplay;

var request = {
    origin: start,
    destination: end,
    travelMode: google.maps.TravelMode.DRIVING
};

directionsDisplay.setMap(map);
directionsService.route(request, function (result, status) {
    if (status == google.maps.DirectionsStatus.OK) {
        directionsDisplay.setDirections(result);
    }
});

0

Просто пройдите по маркерам и удалите их с карты, после чего пустой массив карт:

var markers = map.markers;
for(var i = 0; i < markers.length; i++) {
    markers[i].setMap(null);
}
map.markers = [];


0

Я перепробовал все предложенные решения, но у меня ничего не получалось, пока все мои маркеры были в кластере. В конце концов я просто положил это:

var markerCluster = new MarkerClusterer(map, markers,
    { imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m' });
agentsGpsData[agentGpsData.ID].CLUSTER = markerCluster;

//this did the trick
agentsGpsData[agentId].CLUSTER.clearMarkers();

Другими словами, если вы оборачиваете маркеры в кластере и хотите удалить все маркеры, вы вызываете:

clearMarkers();

-1

Вы имеете в виду удалить, как скрывая их или удаляя их?

если прячешься:

function clearMarkers() {
            setAllMap(null);
        }

если вы хотите удалить их:

 function deleteMarkers() {
            clearMarkers();
            markers = [];
        }

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


-1

Вам нужно установить нулевую карту на этот маркер.

var markersList = [];    

function removeMarkers(markersList) {
   for(var i = 0; i < markersList.length; i++) {
      markersList[i].setMap(null);
   }
}

function addMarkers() {
   var marker = new google.maps.Marker({
        position : {
            lat : 12.374,
            lng : -11.55
        },
        map : map
       });
      markersList.push(marker);
   }

-1

Я нашел простое решение (я думаю):

var marker = new google.maps.Marker();

function Clear(){
     marker.setMap(null);
}



-3

Я знаю, что это может быть простое решение, но это то, что я делаю

$("#map_canvas").html("");
markers = [];

Работает каждый раз для меня.


2
$ ( "# map_canvas") HTML ( ""). фактически уничтожит всю карту div, а также использует jQuery, поэтому ваш ответ будет и глупым, и бесполезным.
Сэм

Да, это правильно. Инициализировать карту и маркеры
крон

Но он не хочет повторно инициализировать карту, он хочет удалить существующие маркеры ....
Сэм

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

2
Весь смысл в желании удалить маркеры карты состоит в том, чтобы избежать повторной инициализации карты, ситуации, подобные моей, означали, что, поскольку я использовал библиотеку рисования googles для рисования на карте, если я очищаю ее и повторно инициализирую всю карту, все наложенные мной наложения исчезнуть единственный способ остановить это сохранить все наложения и повторно добавить их, что также является большой ненужной работой. Повторная инициализация карты не удаляет маркеры, она воссоздает ее заново, НЕ удаляет маркеры.
Сэм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.