php - Google Maps API 3 从当前位置从 MySQL 加载标记

标签 php javascript ajax google-maps-api-3

我正在尝试使用 google map api 制作一张 map ,它显示来自 MySQL 数据库的大量标记。我几乎按照 Google Maps API 教程 ( https://developers.google.com/maps/articles/phpsqlajax_v3?hl=de ) 中的说明进行了所有操作。

我的问题:

我不想一次加载所有标记,而只想加载当前 View 边界之间的标记。

为此,我的“phpsqlajax_genxml.php”将我当前 View 的 4 个边作为 GET 变量获取。这工作正常,但我不知道如何处理 javascript 部分。

我的第一次尝试是插入一个处理程序,当边界发生变化时更新 map :

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

但是当我在 map 上滚动时,这会每毫秒更新一次 map 。我怎样才能每秒更新一次?

主要问题是如何仅将新的缓存插入到 map 中并删除那些在我的视野之外的缓存。我不知道该怎么做。

到目前为止,“DownloadUrl”函数每毫秒下载该区域中的每个缓存,并且还下载那些我已经下载过的缓存,因此您可能会在那里看到每个标记一千次。

有人可以帮我吗? :)

最佳答案

可能有不同的方法,例如

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

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

与删除不在 View 内的标记相关:
当您确实必须删除 View 之外的标记时,我没有比迭代所有标记并删除(将 map 属性设置为空)不在 map 范围内的标记更好的主意了(可以通过以下方式确定) LatLngBounds.contains())

监听器的另一个问题:你最好监听 map 的idle事件

关于php - Google Maps API 3 从当前位置从 MySQL 加载标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18608351/

相关文章:

javascript - 在 PHP 的 URL 中使用哈希后的值

javascript - 根据显示值选中或取消选中复选框?

javascript - 加载 JavaScript 或 CSS 而不执行它们的方法有哪些?

javascript - 如何从我的网页调用 Electron 中的函数/模块?

javascript - 如何使按钮同时具有打开和关闭功能?

javascript - Internet Explorer 中未显示 Facebook Connect 图标

jquery - C# - FormData 是什么对象类型

java - PHP 获取数据或与正在运行的 Java 进程交互。 (我认为与 PHP/Java 桥不同)

php - Laravel REST API 类型保护(例如如何防止将整数作为字符串发送)

php - Symfony2 : force stop code execution after sendiing Response headers