我正在尝试使用此处找到的Google Maps API v3的重叠标记Spiderfier。 (我的问题在此文本/代码块的底部)
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
}
最佳答案
最好的strategy是对地址进行离线地理编码(使用geocoding web service),将坐标存储在您的数据库中,然后使用它们显示标记,这将减少加载页面的时间,因为地理编码器需遵守费率限制和配额。