【问题标题】:Google Maps - How to locate a marker in a markers array?谷歌地图 - 如何在标记数组中定位标记?
【发布时间】:2011-09-06 00:52:32
【问题描述】:

如何检查谷歌地图标记是否已经在标记数组中?
即使在 markersArray.push(marker); 之后,条件 (marker in markersArray) 也是错误的。

【问题讨论】:

    标签: javascript google-maps google-maps-api-3 google-maps-markers


    【解决方案1】:
    var marker = new google.maps.Marker({
                                icon:icon,
                                position: position, 
                                map: map
                            });
    

    标记有自己的 ID。您可以通过

    获取此 ID
    var marker_id = marker.__gm_id;
    

    然后在地图上获取标记

    map.Hb.qa[marker_id];
    

    【讨论】:

      【解决方案2】:

      首先,(marker in markersArray) 是错误的,因为in 不会在数组中查找元素。
      它寻找属性。

      它对我的工作方式是

      for (var i=0; i<markersArray.length; i++) {
          if (markersArray[i].getPosition().equals(marker.getPosition())) {
      ...
      

      只要您需要比较的只是标记的坐标,这就会起作用。
      我们在这里使用 LatLng 类的 .equals 运算符。

      【讨论】:

        【解决方案3】:
        markersArray.indexOf(marker) > -1
        

        【讨论】:

        • 我不确定是否可以在我的情况下使用它,因为我必须创建一个标记实例才能进行比较,但是如果我创建它,那么该实例就不能真正在大批。我想我必须使用=== 运算符。
        【解决方案4】:

        您应该遍历数组以检查标记。

        for (var i=0; i<markersArray.length; i++) {
          if (markersArray[i] === marker) {
             //doSomething...
             break;
             }
          }
        

        【讨论】:

        • @rob,所以如果我在地图上有 1000 个标记,并且我正在平移地图一点点,所以所有标记仍然应该出现,我被告知没有删除并再次添加标记,但首先检查它们是否已经存在,这意味着对于 1000 个标记中的每一个,我必须平均通过数组的一半。在最坏的情况下,这可能会导致 500,000 次检查。删除所有 1000 个标记然后将它们重新添加回来会不会更省力?
        • 我怀疑删除并重新添加它们会更好,因为该过程存在相当多的开销。如果您遇到性能问题,一种选择是将标记单独存储在查找表中,因此您实际上不必迭代。如果每个标记上有任何唯一标识符,则可以将其用作对象中的成员名称。您可以使用多种其他方式来跟踪它们,因为您可能自己创建、添加和删除这些标记。
        • @Ash:在地图平移时,是否将标记添加到可见区域并隐藏不可见区域中的标记?
        • @Salman A,没有。当地图完成平移或缩放(空闲事件)时,我得到了视口边界的 lat,lng,通过 ajax 调用,我从 db 中只得到了这个视口边界内的坐标。
        • @Ash... 和我想的一模一样。在那种情况下,抢劫的评论(带有+1的评论)将是我的答案。您可能正在从 DB 中提取 lat/lng,并且可能与该 lat/lng 相关联的 PK。您需要做的就是 (i) markersArray = {} (ii) 而不是推送,而是执行 markersArray['x_' + id] = marker; - 这会创建一个属性,例如markersArray.x_1234 (iii) 检查它是否存在 if(typeof markersArray['x_' + id] == 'undefined')。访问对象的属性可能比迭代包含 1000 多个元素的数组要快得多。
        猜你喜欢
        • 2019-02-08
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 2011-04-27
        • 2011-03-14
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多