0

我正在尝试使用 Overlapping Marker Spiderfier for Google Maps API v3 found here。(我的问题在这个文本/代码块的底部)

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

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

所以,现在这里是对地址进行地理编码并将该标记添加到地图的 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
}
4

1 回答 1

2

最好的策略是离线对地址进行地理编码(使用地理编码网络服务),将坐标存储在数据库中,然后使用它们来显示标记,这将减少加载页面的时间,因为地理编码器受速率限制和配额。

于 2012-07-19T23:56:39.580 回答