【问题标题】:Add new unique markers to existing set of markers (Google Maps)将新的唯一标记添加到现有标记集(谷歌地图)
【发布时间】:2011-12-07 16:06:12
【问题描述】:

我有一个谷歌地图,它通过 JSON 从 PHP 脚本中检索标记的信息(LatLng 等)。有一个 Google Maps 侦听器可以删除所有现有标记,检索 bounds_changed 上的标记并将它们添加到地图中。

问题:由于在地图上绘制了大量标记,每次用户更改地图边界(拖动、缩放...)时,ALL标记被删除,检索并再次添加,导致相当大的延迟,主要是由于绘制新标记(我认为)。很多时候,用户只是稍微改变了边界,导致重新添加了大约 75% 的标记。

为了加快速度,我决定在bounds_changed 事件中,地图应该只清除地图边界中现在绑定的标记,然后下载并添加现在在地图边界内的新标记。如何做到这一点?

附加信息:我确实有一个数组markers[],其中所有新创建的标记都是pushed 进入

【问题讨论】:

    标签: javascript google-maps google-maps-api-3


    【解决方案1】:

    我建议你看看MarkerManager Library

    这应该可以帮助您,并且您将避免推出自己的解决方案。

    【讨论】:

    • 如果您决定预先加载所有标记,MarkerManager 库是正确的方法。如果您改为查询服务器(通过 ajax),那么您将需要使用哈希方法,在该方法中保留地图上已经存在的标记集合,然后循环并删除不再需要的标记(即删除那些不在从服务器返回的新查询中的那些)并添加那些不在地图上的那些(这样你就没有重复的标记)
    【解决方案2】:

    首先,当用户平移地图时,bounds_changed 事件会持续触发。你应该在事件处理程序中做这样的事情:

    if(reloadTimer){
      clearTimeout(reloadTimer);
    }
    reloadTimer = setTimeout(function(){
      // fetch new data
    }, 400);
    

    其次,如果您可以通过在客户端缓存一些数据来最大限度地减少请求的数量,那么用户界面可能会响应更快。您可以在客户端缓存大量标记,并且仍然保持出色的性能。请记住,如果标记超出可见范围,则应将其从地图中移除,因为它们会影响性能。

    您可以通过多种方式在客户端缓存数据,主要取决于您的用户以及他们如何使用您的应用程序。实现缓存的最快方法是在一个请求中从服务器传输所有数据,并在 javascript 中创建一个数据结构,地图将从该数据结构中获取标记。此数据结构将存在于页面范围内,并使地图操作更快。如果您可以将过期标头设置为一定的时间,服务器响应也可能会缓存在浏览器中。

    如果您的用户返回到您的应用程序,您可以使用 HTML5 将数据结构保存到 localStorage 或 sessionStorage。也许您可以在用户在您的页面上闲置时定期更新数据。

    更多关于本地存储:http://diveintohtml5.info/storage.html

    PS!您还应该遵循 skarE 的建议,使用空闲事件而不是 bounds_changed。

    PPS! 在地图中显示标记时,MarkerManager 是一个好主意。如果您想将标记密度高的区域中的标记组合成集群组,我还推荐使用 MarkerClusterer (http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/docs/reference.html)。

    【讨论】:

    • 你能详细说明一下缓存吗?我不熟悉缓存标记,谢谢!
    • 监听 'idle' 事件,而不是 bounds_changes。
    猜你喜欢
    • 2018-10-11
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2014-12-08
    • 2013-06-02
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多