ChatGPT解决这个技术问题 Extra ChatGPT

Google Maps API v3:如何删除所有标记?

在 Google Maps API v2 中,如果我想删除所有地图标记,我可以简单地执行以下操作:

map.clearOverlays();

如何在 Google Maps API v3 中执行此操作?

看着Reference API,我不清楚。

我在下面的链接中找到了一些代码,但是圣牛 - 有很多代码来模拟 API v2 中的前 1 行代码。 lootogo.com/googlemapsapi3/markerPlugin.html
请记住,地图 3.0 旨在非常轻便,以便移动设备以尽可能少的延迟使用它...
截至 2010 年 7 月 29 日,此处建议的解决方案似乎已被破坏。我希望我有一个工作版本来建议。
评分最高的答案是错误的。查看此示例的源代码以了解如何操作:google-developers.appspot.com/maps/documentation/javascript/…

8
8 revs, 8 users 58% anon

只需执行以下操作:

一、声明一个全局变量:

var markersArray = [];

二、定义一个函数:

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;
}

三、在调用以下命令之前,在“markerArray”中推送标记:

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

四。在需要时调用 clearOverlays();map.clearOverlays(); 函数。

而已!!


带有数组的 for..in 循环?这肯定不好..? ..见:stackoverflow.com/questions/500504/…
或者,您可以使用 marker.setVisible(false) 隐藏标记
标记仍然保留在数组中,因此它会变得越来越大。建议在循环之后也清除数组
您始终可以将 markersArray 设置为一个空数组,而不是设置它的长度,我觉得这有点奇怪:markersArray = [];
我会使用 while 方法来处理数组:while(markersArray.length) { markersArray.pop().setMap(null); }。之后无需清除数组。
m
mooreds

同样的问题。此代码不再起作用。

我已经更正了,以这种方式更改 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


我最终让它工作的方式是遍历我存储它们的标记集合并使用 setMap(null)
但这会清除记忆中的标记吗?我意识到 JavaScript 具有自动垃圾收集功能,但我们如何知道 Google 的 API 在调用 setMap(null) 时不包含对标记的引用?在我的应用程序中,我添加和“删除”了大量标记,我讨厌所有那些“已删除”的标记占用内存。
@Nick:添加“删除 this.markers[i];”在 setMap(null) 位之后。
这个问题现在在文档中得到了回答。 code.google.com/apis/maps/documentation/javascript/…
谁甚至使用 new Array();
C
Community

V3好像还没有这个功能。

人们建议将地图上所有标记的引用保存在数组中。然后当你想全部删除它们时,只需循环遍历数组并在每个引用上调用 .setMap(null) 方法。

See this question for more info/code.

我的版本:

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 的需要。

优点

这样做可以使代码紧凑并集中在一个地方(不会污染命名空间)。

您不必再自己跟踪标记,您始终可以通过调用 map.getMarkers() 找到地图上的所有标记

缺点

像我现在这样使用原型和包装器会使我的代码依赖于谷歌代码,如果他们在源代码中进行重大更改,这将会中断。

如果您不了解它,那么如果确实损坏了,您将无法修复它。他们改变任何会打破这一点的可能性很小,但仍然......

如果您手动删除一个标记,它的引用仍将位于标记数组中。 (您可以编辑我的 setMap 方法来修复它,但代价是循环槽标记数组并删除引用)


+1来自我。但是,如果您包含自动调用 addMarker 的包装器,您的答案会更好!
我假设您实际上指的是安德鲁斯的回答。你会用代码展示你会做什么不同以及为什么。谢谢
对不起,我很抱歉延迟发布代码,因为我无法快速测试它。
谢谢麦库。不过,我不明白 - 如何在您的示例中添加新标记。再次,非常感谢!
我尝试使用 setMap(null),但我有一个自动更新脚本,每次我将所有 50 个左右的标记设置为空地图时,我仍然有一堆无地图标记在 DOM 某处浮动。这一直导致页面崩溃,因为它每 30 秒向 DOM 添加 50 个新标记,并且由于页面在视频墙上 24/7 保持打开状态,这种情况无休止地传播。在创建新地图之前,我必须使用最佳答案并完全清除 DOM 中的所有地图叠加层。希望这对某人有所帮助;我花了很长时间才弄清楚为什么我的页面崩溃了! :(
r
rolinger

这是 YingYang 2014 年 3 月 11 日 15:049 在对用户原始问题的原始回复下最初发布的所有解决方案中最简单的一个

2.5 年后,我在谷歌地图 v3.18 中使用了他的相同解决方案,它就像一个魅力

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

// No need to clear the array after that.

G
Guido
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,你会用代码展示你会做什么不同的事情以及为什么。谢谢
这怎么不是解决方案?您可以通过在要清除的特定标记上使用 set_map(null) 来删除标记,如果要清除所有标记,则使用此函数循环。如果您想要更多内容,请在此处请求:code.google.com/p/gmaps-api-issues/issues/…
-1 糟糕的风格。只创建了一个标记数组,但在 clearMarkers 之后每个地图一个(由于原型的 get/set 差异)。带有多个地图对象的讨厌的错误。
J
Jirapong

在新版本 v3 上,他们建议保留数组。如下。

请参阅 overlay-overview 处的示例。

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;
  }
}

S
SphynxTech

解决方案非常简单。您可以使用方法:marker.setMap(map);。在这里,您可以定义图钉将出现在哪个地图上。

因此,如果您在此方法 (marker.setMap(null);) 中设置 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 developer 或关于 google developer web site 的完整文档。


j
jmbertucci

谷歌的演示库有一个关于他们如何做到的演示:

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

您可以查看源代码以了解它们如何添加标记。

长话短说,他们将标记保存在一个全局数组中。当清除/删除它们时,它们会遍历数组并在给定的标记对象上调用“.setMap(null)”。

但是,此示例显示了一个“技巧”。本示例中的“清除”意味着将它们从地图中移除但将它们保留在数组中,这允许应用程序快速将它们重新添加到地图中。从某种意义上说,这就像“隐藏”它们。

“删除”也会清除数组。


f
freefaller
for (i in markersArray) {
  markersArray[i].setMap(null);
}

只在IE上工作。

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

在chrome,firefox上工作,即...


请阅读有关 formatting of code on SO 的帮助
A
Adam Starrh

罗林格答案的干净和简单的应用。

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) ;
    }

G
GregN

两个答案中发布的“set_map”功能似乎不再适用于 Google Maps v3 API。

我不知道发生了什么

更新:

Google 似乎更改了他们的 API,使得“set_map”不是“setMap”。

http://code.google.com/apis/maps/documentation/v3/reference.html


C
Crisoforo Gaspar

在这里您可以找到如何删除标记的示例:

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 = [];
}

G
Guido

Anon 的以下作品完美无缺,尽管在反复清除叠加层时会出现闪烁。

只需执行以下操作:

一、声明一个全局变量:

var markersArray = [];

二、定义一个函数:

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

三、在调用以下命令之前,在“markerArray”中推送标记:

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

四。在需要时调用 clearOverlays() 函数。

而已!!

希望对您有所帮助。


for(in in markersArray){} 可能不符合您的预期。如果 Array 在代码中的其他任何地方扩展,它也会迭代这些属性,而不仅仅是索引。它的 javascript 版本是 markersArray.forEach(),并非所有地方都支持。您最好使用 for(var i=0; i<markersArray.length; ++i){ markersArray.setMap(null); }
C
Craig Fruin

我发现在 google-maps-utility-library-v3 项目中使用 markermanager 库是最简单的方法。

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。要清除标记,您只需调用 MarkerManger 的 clearMarkers() 函数

mgr.clearMarkers();

拉入该库以清除标记似乎有点矫枉过正。 clearMarkers 所做的只是遍历调用 marker.setMap(null) 的标记(我检查了源代码)。将它们放在一个数组中并自己做会减少工作量。
C
Crisoforo Gaspar

你也可以这样做:

function clearMarkers(category){ 
  var i;       

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

M
Mimo

最简洁的方法是遍历地图的所有特征。标记(连同多边形、折线等)存储在地图的 data layer 中。

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

在通过 drawing manager 添加标记的情况下,最好创建一个全局标记数组或在创建时将标记推入数据层,如下所示:

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 类方法。


b
bokor

我刚刚用 kmlLayer.setMap(null) 尝试过这个并且它有效。不确定这是否适用于常规标记,但似乎可以正常工作。


F
Fraser

清除所有覆盖层,包括多边形、标记等...

只需使用:

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"));
}

这不会也重置地图吗?假设用户是否将地图拖到了新区域?
O
Ogglas

这是 Google 自己在至少一个示例中使用的方法:

var markers = [];

// Clear out the old markers.
markers.forEach(function(marker) {
  marker.setMap(null);
});
markers = [];

查看 Google 示例以获取完整的代码示例:

https://developers.google.com/maps/documentation/javascript/examples/places-searchbox


R
Rock Star

要从地图中删除所有标记,请创建如下函数:

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 = [];
      }

F
Felipe Miosso

我不知道为什么,但是当我使用 DirectionsRenderer 时,将 setMap(null) 设置为我的标记对我不起作用。

在我的情况下,我也必须将 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);
    }
});

k
kaiser

只需走过标记并将它们从地图中删除,然后清空地图标记数组:

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

R
RejoylinLokeshwaran

只需清除 Googlemap

mGoogle_map.clear();

G
Geka P

我已经尝试了所有提出的解决方案,但是当我的所有标记都在一个集群下时,没有任何东西对我有用。最后我只是把这个:

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();

A
Adil

顶部投票最多的答案是正确的,但如果您一次只有一个标记(就像我的情况一样)并且每次您需要杀死该标记的先前位置并添加一个新位置时,您就不需要需要创建整个标记数组并在每次推送和弹出时对其进行管理,您只需创建一个变量来存储标记的先前位置,并可以在创建新位置时将其设置为空。

// 保存标记位置的全局变量。

var previousMarker;

//同时添加一个新的标记

    if(previousMarker != null)
previousMarker.setMap(null);

var marker = new google.maps.Marker({map: resultsMap, position: new google.maps.LatLng(lat_, lang_)});
previousMarker = marker;

R
RobertoN

您的意思是删除它们是隐藏它们还是删除它们?

如果隐藏:

function clearMarkers() {
            setAllMap(null);
        }

如果您想删除它们:

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

请注意,我使用数组标记来跟踪它们并手动重置它。


A
Adhum

您需要将 map null 设置为该标记。

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);
   }

a
aleXela

我找到了简单的解决方案(我认为):

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

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

m
mgm8870

如果您使用 gmap V3 插件:$("#map").gmap("removeAllMarkers");

见:http://www.smashinglabs.pl/gmap/documentation#after-load


U
Uchenna Nnodim

我使用一种能很好地完成工作的速记。做就是了

    map.clear();