我正试图用谷歌地图api制作一个地图,它显示了MySQL数据库中的许多标记。我几乎完成了谷歌地图API教程中的所有内容(https://developers.google.com/maps/articles/phpsqlajax_v3?hl=de)。
我的问题:
我不想一次加载所有标记,只想加载那些在我当前视图边界之间的标记。
为此,我的"phpsqlajax_genxml.php"将当前视图的4条边作为GET变量。这很好,但我不知道如何处理javascript部分。
我的第一次尝试是插入一个处理程序,当边界改变时,它会更新地图:
google.maps.event.addListener(map, 'bounds_changed', function() {
var bounds = map.getBounds();
var swPoint = bounds.getSouthWest();
var nePoint = bounds.getNorthEast();
var swLat = swPoint.lat();
var swLng = swPoint.lng();
var neLat = nePoint.lat();
var neLng = nePoint.lng();
var qs = '&swLat=' + swLat + '&swLng=' + swLng + '&neLat=' + neLat + '&neLng=' + neLng;
downloadUrl("./includes/phpsqlajax_genxml.php?sess=<?php print session_id();
?>"+qs,function(data){
var xml = data.responseXML;
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute("name");
var address = markers[i].getAttribute("address");
var type = markers[i].getAttribute("type");
var point = new google.maps.LatLng(
parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var html = "<b>" + name + "</b> <br/>" + address;
var icon = customIcons[type] || {};
var marker = new google.maps.Marker({
map: map,
position: point,
icon: icon.icon,
shadow: icon.shadow
});
bindInfoWindow(marker, map, infoWindow, html);
}
});
但当我在地图上滚动时,这会每毫秒更新一次地图。我如何才能每秒更新一次?
主要的问题是如何只将新的缓存插入到映射中,并删除那些在我的视图之外的缓存。我不知道该怎么做。
到目前为止,"DownloadUrl"功能每毫秒下载该区域的每个缓存,还下载我已经下载的缓存,所以你可能会在那里看到每个标记一千次。
有人能帮我吗?:)
可能有不同的方法,例如
-
总是请求给定边界的所有标记,并删除所有先前添加的标记
-
只请求你还没有得到的给定边界的标记。因此,您必须收集视图中已经绘制的标记(例如ID),并将此列表作为参数传递给PHP脚本,以便该脚本可以使用该列表来过滤查询中的标记(注意:您最好通过POST发送数据,否则您将很快达到URL长度的限制)
与删除不在视图中的标记相关:
当你真的必须移除视图之外的标记时,我没有比迭代所有标记并移除(将map属性设置为null)不在地图范围内的标记(可以通过LatLngBounds.contains()
确定)更好的主意了
侦听器的另一个问题是:您最好侦听映射的idle
-事件