【问题标题】:Adding many markers kills my google maps - how do I do this?添加许多标记会杀死我的谷歌地图 - 我该怎么做?
【发布时间】:2009-05-11 06:53:48
【问题描述】:

我又被困在这里了。我有一个包含超过 120 000 个坐标的数据库,我需要将其显示在我的应用程序中集成的谷歌地图上。事情是这样的,我发现简单地遍历所有坐标并为每个坐标创建一个单独的标记并使用 addOverlay 函数添加它会杀死浏览器。所以这肯定是错误的方法 - 我已经阅读了一些关于集群或缩放级别聚束的内容 - 我确实理解渲染所有标记没有意义,特别是如果它们中的大多数不会被看到地图的非渲染部分,除了我不知道如何让它工作。

如何在此处解决此问题。请大家帮我帮忙:(

【问题讨论】:

    标签: php google-maps


    【解决方案1】:

    这里有各种技术的很好的比较http://www.svennerberg.com/2009/01/handling-large-amounts-of-markers-in-google-maps/

    但是,鉴于您的标记数量,您肯定需要一种仅渲染应在当前视图中看到的标记的技术(假设该数量适中 - 如果没有,则链接中有用于做明智事情的技术)

    【讨论】:

    • 感谢您的链接-几分钟前我偶然发现了clusterer,但您发布的网址有很多选择-再次感谢
    【解决方案2】:

    如果您确实有超过 120,000 个项目,那么任何客户端集群器或管理器都无法正常工作。您将需要在服务器端处理标记。 有一个很好的讨论 here 有一些可能对你有帮助的选项。

    更新:我之前在 SO 上发布过这个,但this tutorial 描述了 PHP 中的服务器端集群方法。它旨在与静态地图 API 一起使用,但我已经构建了它,以便在视图更改时它会返回聚集标记。它工作得很好,尽管每当视图更改时传输标记会有延迟。不幸的是,我还没有尝试过超过 3,000 个标记 - 我不知道它处理 120,000 个标记的效果如何。祝你好运!

    【讨论】:

    • 我的想法是一样的——在每个缩放级别左右,我都必须解析我的位置并只输出那些在可见屏幕范围内可见的位置或位置集群。问题是我希望有某种代码或开放项目可以帮助我开始使用它:(。
    • Chris B:我的教程中涉及的计算量很大。如果您有 120k 标记,您可能应该预先计算每个缩放级别的集群。否则缩放会变得很慢。我有兴趣查看您的代码。你在网上的某个地方有它吗?
    • Chris B:哦,忘了说只获取当前视口中的标记/集群是个好主意。您的数据是在数据库中还是仅在 KML 文件中?
    • @Mike - 我用 20,000 个随机标记构建了一个测试地图,存储在数据库中。每当视图更改时,我将边界发送到服务器,服务器获取边界内的标记,运行您的聚类算法,并将一组聚类标记和/或单个标记发送回客户端。它工作得很好,除了当所有标记都填充视图时 - 大约需要 4 秒才能聚集。不幸的是,它目前不公开。
    • @Mike - 大约 1 秒 :)
    【解决方案3】:

    我没有专门使用 Google 地图做过任何工作,但很多个月前,我参与了一个项目,该项目为一家大型电信公司管理移动劳动力。

    他们有类似的功能,因为他们有地图,他们可以放大他们分配的工作(在机器本地而不是通过网络),我们解决了一个类似的问题,听起来很像你的问题。地图上的兴趣点称为地标,并由地图上称为地标指针的小标记指示,工作人员可以选择这些标记以获得文字描述。

    在最小缩放时,会有过多的地标指针,使地图无用。我们做出了一个命令决定,将地标指针限制为较小的数字(400)。为了做到这一点,无论缩放级别如何,地图都被划分为一个 20x20 的矩阵,这给了我们 400 个矩阵元素。

    然后,如果一个地标与另一个地标共享相同的矩阵元素,则应用程序将它们组合并生成一个地标指针,其描述性文本包含该矩阵元素中所有地标的文本。

    这样一来,地标指针就不会超过 400 个。随着 minion 的放大,地标指针被重新生成,并且地标可能最终出现在不同的矩阵元素中 - 在这种情况下,它们不再与其他地标组合。

    同样,缩小有时会将两个或多个地标合并为一个地标指针。

    这听起来像是您试图通过“聚类或缩放级别聚合”实现的目标,但正如我所说,我对 Google 地图本身没有什么经验,所以我不确定这是否可行。但考虑到 Google 的声誉,我怀疑确实如此。

    【讨论】:

      【解决方案4】:

      我建议您将标记管理器类such as this one 与现有代码一起使用。标记管理器类允许您管理数千个标记并优化内存使用。标记管理器有很多种(不止一种),我建议你谷歌一下。

      【讨论】:

        【解决方案5】:

        如果您想快速显示数百甚至数千个标记,这是一个非集群解决方案。您可以结合使用 OverlayView 和 DocumentFragment。

        http://nickjohnson.com/b/google-maps-v3-how-to-quickly-add-many-markers

        【讨论】:

          【解决方案6】:

          如果有比 JS 更强大的东西……

          够讽刺了:)。

          您是否使用过 Flash Maps API? Kevin Macdonald 成功地使用它来聚类不是 120K 标记,而是 1,000,000 个标记。查看百万标记图: http://www.spatialdatabox.com/million-marker-map/million-marker-map.html

          地图响应在此解决方案中几乎不受影响。如果你有兴趣可以在这里联系他:http://www.spatialdatabox.com/sdb-contact-sales.html

          【讨论】:

          • 发现以上任何一项有用吗?
          【解决方案7】:

          试试这个:

          http://googlegeodevelopers.blogspot.com/2009/04/markerclusterer-solution-to-too-many.html

          这是一个老问题,已经得到了很多答案,但 Stackoverflow 更多的是作为参考,我希望这对搜索相同问题的人有所帮助。

          【讨论】:

            【解决方案8】:

            有一个相当简单的解决方案 - 使用 HTML5 画布,虽然听起来很奇怪,但它是加载多达 10,000 个标记和标签的最快方法,如果它是普通标记,肯定没有浏览器可以处理。不是传统标记,而是轻型标记。

            【讨论】:

            • 感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion。另请注意,每次链接到自己的网站/产品时,都要求发布免责声明。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-12
            • 1970-01-01
            • 1970-01-01
            • 2021-02-23
            相关资源
            最近更新 更多