谷歌地图叠加层

7
我正在寻找一种能够从KML和/或KMZ数据生成Google Maps叠加层的东西,最好是自由开源软件。
去年我们在一个活动网站上工作时需要容纳约16,000个地点标记,今年可能会再次增加。去年,完成该网站的公司直接将KML数据提供给gMaps API,并让它在客户端放置所有标记。显然,这成为了性能方面的噩梦,并倾向于使旧浏览器“冻结”(或者至少看起来冻结几分钟)。
理想情况下,这个服务器端脚本将获取KML、地图的lat/lon中心和地图缩放级别,并将所有可见的地点标记合并成单个GIF或PNG叠加层。
任何关于此事的指导或建议将不胜感激。 2008年10月8日更新 - 我在这里和其他地方找到的大部分信息似乎表明,减少地图上的点数是正确的方法(即,在从更高的高度/缩放级别查看时,使用一个标记来代表多个标记)。虽然在某些情况下这可能是一个好方法,但在这里不起作用。我们正在寻找有成千上万个标记的美国地图的视觉效果。我探索的一个选项是一个名为PushPin的服务,当被(可能是)KML提供时,将创建一个覆盖层,其中所有可见点(基于中心纬度/经度和缩放级别)渲染到单个图像上,因此,我们将所有这些标记合并到单个图像中,而不是在客户端执行几千次DOM操作,服务器端进行单个DOM操作。PushPin服务非常出色,如果没有相关费用,肯定会起作用。我们真正寻找的是一些自由开源软件,可以在服务器端运行以生成我们自己的覆盖层。
5个回答

4
你可以考虑使用类似于GeoserverMapserver的工具。它们是谷歌地图的仿制品,更加强大。
你可以生成自己喜欢的覆盖层,Geoserver(我认为Mapserver也可以)可以输出KML、PDF、png等格式,方便你将地图混合在一起,或者你也可以自己生成整个地图,但这需要耗费时间。

这些看起来很有趣,我会看看它们是否适合我们的目的。 - theraccoonbear
1
我们一定会研究GeoServer和GeoWebCache! - Mesh

2
不确定为什么您想要使用GIF/PNG叠加,您可以直接在KML中完成这个操作。我假设大部分性能问题是由于用户当前视图外的点导致的,即用户正在查看纽约,但您有在洛杉矶的点浪费了内存,因为它们不可见。如果您确实有16,000个点都同时对典型情况下可见,那么您需要采取不同的策略。

如果上述适用,则以下是步骤:

  1. 确定地图的中心和范围
  2. 鉴于您应该能够计算出地图左上角和右下角的纬度/经度。
  3. 遍历您的点数据库,并将每个位置与两个角进行检查。经度需要大于(有符号!)左上角经度且小于右下角经度。纬度需要小于左上角纬度(有符号!)且大于右下角纬度。这里只需要简单比较,不需要复杂的计算。
  4. 将匹配的点输出到临时KML文件供用户使用。
  5. 您可以直接将KML输入Google Maps并让其映射,或者您可以使用Javascript maps API通过KML加载点。
这可能不能直接解决你的问题,但对于相关问题,你也可以考虑使用Google静态地图API。它允许你创建一个带有标记的静态图片文件,加载速度非常快,但不具备常规 Google 地图的交互性。然而,由于 API 的设计方式,它也无法处理近 16,000 个点,因此你仍需要将其过滤到视图范围内。

计划是提供一个全国范围的视图,展示完整的数据集,因此,是的,我们确实需要同时显示所有点。我们将允许缩放,并且可以使用缩放级别视图半径来使用较小的KML数据集,以便用户深入挖掘,但我们需要能够显示全部。 - theraccoonbear
我会采用一种策略,找到可以缩减为国家地图上一个图钉的事件群集,然后超链接到仅显示该城市的视图。方法类似,但需要使用Haversine公式的一个版本来查找在“x”英里内的点。 - Tim Farley

1

我不知道你的项目进展如何,但也许你可以看一下GeoDjango?这个修改版的Django包含了各种工具来存储位置、转换坐标和显示地图,非常方便。当然,你需要一些Python经验和一个服务器来运行它,但一旦你掌握了Django,它就能快速高效地工作。

如果你只是想要解决问题,那么尝试在较低的缩放级别下对结果进行分组,一个很好的实现例子可以在这里找到。


我不知道Django/Python是否会成为一个障碍,但我以前从未使用过这两种技术。根据客户的要求,该网站的核心将在Drupal中完成,因此PHP后端将是理想的选择。不过我会考虑这个选项的。 - theraccoonbear

0

这是一个棘手的问题。你可以使用Google Maps自定义图块集,但你仍然需要一些方法来生成图块(除了手动)。

恐怕这就是我所能提供的了 =/


是的,我确实考虑过使用覆盖层,但我特别希望有一些服务器端的东西,可以基于KML、中心纬度/经度和缩放级别生成覆盖层。 - theraccoonbear

0

OpenLayers是一款非常好的JavaScript前端,可以与多个地图服务或您自己的地图服务器配合使用。最新发布的2.7版本增加了一些相当惊人的功能和控件。


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