谷歌地图API 3从MySQL从当前位置加载标记


Google Maps API 3 Load Markers from MySQL from current position

我正试图用谷歌地图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"功能每毫秒下载该区域的每个缓存,还下载我已经下载的缓存,所以你可能会在那里看到每个标记一千次。

有人能帮我吗?:)

可能有不同的方法,例如

  1. 总是请求给定边界的所有标记,并删除所有先前添加的标记

  2. 只请求你还没有得到的给定边界的标记。因此,您必须收集视图中已经绘制的标记(例如ID),并将此列表作为参数传递给PHP脚本,以便该脚本可以使用该列表来过滤查询中的标记(注意:您最好通过POST发送数据,否则您将很快达到URL长度的限制)

与删除不在视图中的标记相关:
当你真的必须移除视图之外的标记时,我没有比迭代所有标记并移除(将map属性设置为null)不在地图范围内的标记(可以通过LatLngBounds.contains()确定)更好的主意了

侦听器的另一个问题是:您最好侦听映射的idle-事件