我有一个显示500个标记的地图,当用户滚动地图时会重绘它们。每个标记都非常复杂 - 它们被编号并且附加了点击,鼠标悬停和鼠标移除(以使它们动画化)事件。这会导致一些性能问题,因为删除和添加这些标记需要花费大量时间。我一直想知道是否可以为整个地图附加单击,鼠标悬停和鼠标移动事件处理程序,并捕获从那里的标记起泡的事件。这可能吗?它会改善表现吗?
我发现了这个 - How do I make a single event handler for all markers in Google Maps V3? - 它更好,但它仍然需要将处理程序分别附加到每个标记。
我还发现了Google地图数据图层 - https://developers.google.com/maps/documentation/javascript/datalayer#add_event_handlers - 看起来整个图层只附加了一个事件,但我不确定它是否不会将其附加到每个标记内部无论如何。我也不确定额外的抽象级别是否会降低速度。
还有其他解决方案吗?
答案 0 :(得分:0)
我遇到了这个问题并通过制作群集找到了解决方案:http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/docs/examples.html
这有很大帮助,实际上比将所有内容放入数组并将它们逐个推送到地图更快
您可以保留每个标记的事件并将它们分组+使其成为聚类。
答案 1 :(得分:0)
几年前我实施了一个房地产搜索引擎。想想一个覆盖着数百,数千,数万个标记的股票谷歌地图。
我们发现谷歌地图上方的平铺覆盖是性能最佳的解决方案。地图API支持叠加,可用于代替标记,以最小的延迟在地图上显示对象。它们可以很好地替代用例,否则需要大量的标记。
使用mapserver等工具可以非常轻松地生成切片。与tile一起使用时,您还需要编写一个自定义单击处理程序,并且可能需要一个Web服务,它将坐标解析为单个标记并返回该标记的数据。
答案 2 :(得分:0)
我做了一些测试,发现使用loadGeoJson
类的google.maps.Data
方法实际上比使用标准的jQuery AJAX调用更慢。
我使用JSON测试了大约7000个条目,为每个条目创建/绘制标记并在每个标记上绑定点击事件。
以下是Chrome中脚本编写时间的结果(平均10个请求):
平均值:3.156s |高:3.69s |低:2.75秒
平均值:1.795秒 |高:2.01s |低:1.66秒
现在如果加载500个标记真的很慢,您可能希望公开您的代码,以便我们知道您是如何做到的。也许在加载/重新加载/删除标记的方式上可以改进一些东西?
希望这有帮助!
答案 3 :(得分:0)
我们通过在标记上启用“优化”标记来解决所有问题。然后标记在地图画布上呈现,它们在DOM中不可见,这也意味着没有直接附加到它们的事件处理程序。我们通过在标记悬停时动态创建div元素来实现交互性。现在一切都比较顺畅了。