添加太多标记会使我的谷歌地图崩溃 - 我该怎么办?

3
我又卡在这里了。我有一个包含超过120,000个坐标的数据库,需要在我的应用程序中显示在谷歌地图上。问题是,我通过循环遍历所有坐标,并为每个坐标创建单独的标记,然后使用addOverlay函数添加它,但我发现这样做会使浏览器崩溃。所以这绝对不是正确的方法-我已经看了一些关于聚类或缩放级别分组的内容-我确实理解,在非渲染部分的地图上,渲染所有标记没有意义,特别是如果大多数标记都看不到,但我不知道如何使其工作。
请问如何解决这个问题?拜托了,我需要帮助 :(
8个回答

8

谢谢提供链接 - 我几分钟前已经发现了Clusterer,但是你发布的URL有很棒的选项 - 再次感谢。 - Ali

3
如果你真的有超过120,000个项目,那么任何客户端聚类器或管理器都无法工作。你需要在服务器端处理标记。 这里有一个很好的讨论here,其中提供了一些可能对你有帮助的选项。
更新:我之前在SO上发布过这篇文章,但this tutorial介绍了一种PHP服务器端聚类方法。它是为静态地图API设计的,但我已经将其构建成每当视图更改时返回聚类标记的方式。它运行得很好,尽管在视图更改时传输标记存在延迟。不幸的是,我还没有尝试过使用超过3,000个标记 - 我不知道它能处理120,000个标记的情况。祝你好运!

我也在考虑同样的问题 - 随着每个缩放级别,我需要解析我的位置并仅输出那些可在可见屏幕范围内查看的位置或位置簇。问题是我希望有一些代码或开放项目可以帮助我入门 :(. - Ali
Chris B:我教程中涉及的计算相当繁重。如果你有120k个标记,你可能应该预先计算每个缩放级别的聚类。否则,缩放会变得非常缓慢。我很想看看你的代码。你有在线上的地方吗? - Mika Tuupola
Chris B:哦,我忘了提到只获取当前视口中的标记/聚类是个好主意。你的数据是在数据库中还是仅在KML文件中? - Mika Tuupola
@Mike - 我建立了一个包含20,000个随机标记的测试地图,并将其存储在数据库中。每当视图发生变化时,我会将边界发送到服务器,服务器获取边界内的标记,运行您的聚类算法,并将一组聚类标记和/或单个标记发送回客户端。它的效果相当不错,除非所有标记都填满了视图-这需要大约4秒钟来进行聚类。不幸的是,目前它还没有公开。 - Chris B
@Mike - 已经降到了约1秒钟 :) - Chris B

2
我之前没有专门使用过Google地图,但许多年前,我参与了一个为一家大型电信公司管理移动劳动力的项目。他们有类似的功能,可以放大其分配的工作地点(本地化而非通过网络),我们解决了一个听起来和你们很相似的问题。地图上的兴趣点称为"地标",并由小标记指示在地图上,工人可以选择以获取文本描述。
在最小缩放级别下,可能会有大量的地标指针,使地图无用。我们做出了一个命令性的决定,将地标指针限制在较小的数量(400个)内。为了实现这一点,不论缩放级别如何,地图都被划分成一个20x20的矩阵,这给我们提供了400个矩阵元素。
然后,如果一个地标与另一个共享相同的矩阵元素,则应用程序将它们合并,并生成一个带有描述性文本的单个地标指针,其中包含该矩阵元素中所有地标的文本内容。
这样就永远不会有超过400个地标指针。当用户缩放时,地标指针会重新生成,地标可能会出现在不同的矩阵元素中-在这种情况下,它们不再与其他地标合并。
类似地,缩小地图有时会将两个或更多的地标合并成一个单一的地标指针。这听起来就像你们试图通过"聚类或缩放级别分组"来实现的,尽管如我所说,我对Google地图本身没有太多经验,所以我不确定这是否可行。但考虑到Google的声誉,我认为这是可能的。

1

1

我建议您使用一个标记管理器类(例如此类)与您现有的代码一起使用。标记管理器类允许您管理数千个标记并优化内存使用。有各种各样的标记管理器(不只是一个),我建议您进行一些谷歌搜索。


0

有一个相当简单的解决方案- 使用HTML5画布,虽然听起来很奇怪,但这是加载多达10,000个标记以及标签的最快方法,我确信任何浏览器都无法处理普通标记。不是传统的标记而是轻量级的标记。


感谢您发布答案!请务必仔细阅读有关自我推广的FAQ。还请注意,每次链接到您自己的网站/产品时,必须发布免责声明。 - Andrew Barber

0

0

你觉得以上任何内容有用吗? - Nael El Shawwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接