【问题标题】:Google maps spiderfy function - more than one marker at the same point谷歌地图蜘蛛功能 - 在同一点多个标记
【发布时间】:2012-07-19 05:34:39
【问题描述】:

我正在尝试将 Overlapping Marker Spiderfier 用于此处的 Google Maps API v3。 (我的问题在这段文本/代码的底部)

https://github.com/jawj/OverlappingMarkerSpiderfier/blob/master/README.textile

我试图在其上实现它的页面与他们在源代码页面上使用的代码有点不同。他们初始化他们的页面并在初始化函数中实现所有的函数调用。我的页面初始化地图并加载一个点,然后稍后使用单独的函数(通过地理编码)添加其他点。

所以,基本上此时地图已经初始化,现在我调用我的数据库来获取要添加的新位置。

var cityArray= <?php echo json_encode($cityArray); ?>; //get the city
var title = <?php echo json_encode($title); ?>; //and the title to go on it's infowindow

  function plotMarkers(){ 
        for(var i = 0; i < <?php echo json_encode($length); ?>; i++){
            codeAddresses(cityArray[i],title[i]); //geocode the address
        }
  }

所以,上面的这个 sn-p 给了我两个数组;一个带有位置,另一个带有标题以进入信息窗口。

所以,现在是对地址进行地理编码并将该标记添加到地图的 codeAddresses 函数。从 plotMarkers 函数可以看出,数组是循环遍历并添加到 codeAddresses 函数中的。

function codeAddresses(address,title){
      geocoder.geocode( { 'address': address}, function(results, status) { 
              if (status == google.maps.GeocoderStatus.OK) {
                  marker = new google.maps.Marker({
                 map: map,
                 position: results[0].geometry.location
                });      
            google.maps.event.addListener(marker, 'click', (function(marker) {
              return function() {
                  infowindow.setContent(title);
                  infowindow.open(map, marker);
              }
            })(marker));
        }
    });
  }

我的问题是我应该将侦听器(在上面链接的页面上)添加到加载第一个点的第一个函数中,还是应该将它添加到 codeAddresses 函数中?

另外,我应该将它包含在我的 codeAddresses 函数中还是其他地方?如果它确实进入了 codeAddresses,这是否意味着我可以摆脱 for 循环,因为 codeAddresses 是从循环中触发的(并在每次迭代期间运行)?

 for (var i = 0; i < window.mapData.length; i ++) {
   var datum = window.mapData[i];
   var loc = new gm.LatLng(datum.lat, datum.lon);
   var marker = new gm.Marker({
   position: loc,
   title: datum.h,
   map: map
});
 marker.desc = datum.d;
 oms.addMarker(marker);  // <-- here
}

【问题讨论】:

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


    【解决方案1】:

    最好的strategy 是离线地理编码地址(使用geocoding web service),将坐标存储在数据库中,然后使用它们显示标记,这将减少加载页面的时间,因为地理编码器是受速率限制和配额限制。

    【讨论】:

    • 我仍然需要使用函数来绘制这些点(我正在从数据库中查找),对吗?我还能用这个spiderfy函数吗?我无法显示要显示的重叠点,这似乎比聚类更好。
    • 是的。但是将坐标存储在数据库中可以减少显示时间(您的用户不需要等待地理编码器返回结果)并且更可靠(地理编码器有时不会返回所需的结果,如果您将坐标存储在您的数据库,您可以更正它们)。这是一个 example,它从 xml 中绘制坐标,here is another 使用 MarkerClusterer(您几乎可以用蜘蛛程序替换 MarkerClusterer。
    • 您是否有机会提供一些使用markerclusterer 的示例代码(至于将点输入XML)?我没有太多运气让这个工作,所以我不知道如何去做。
    • 我在上一条评论中提供了a live example。除非您询问如何生成 xml,在这种情况下,请查看 the articles section of the documentation 以获取使用 PHP 和 MySQL 的示例。
    猜你喜欢
    • 2017-12-25
    • 2013-06-16
    • 2019-09-09
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多