我正在尝试使用此处找到的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
}
答案 0 :(得分:2)
最好的strategy是将地址离线地进行地理编码(使用geocoding web service),将坐标存储在数据库中,然后使用它们来显示标记,这样可以减少加载页面的时间由于地理编码器受到速率限制和配额限制。