7

我正在尝试找到可以从 KML 和/或 KMZ 数据生成 Google 地图叠加层的东西,最好是 F/OSS。

我们正在开发一个活动网站,去年需要容纳约 16,000 个地点标记,今年可能至少还会有这么多。去年,完成该网站的公司只是将 KML 数据直接提供给 gMaps API,并让它放置所有的标记客户端。显然,这变成了一场性能噩梦,并倾向于使旧版浏览器“冻结”(或至少一次冻结几分钟)。

理想情况下,此服务器端脚本将采用 KML、地图的纬度/经度中心和地图缩放级别,并将所有可见的地点标记适当地合并到单个 GIF 或 PNG 覆盖中。

对此的任何指导或建议将不胜感激。

2008 年 10 月 8日更新- 我在这里和其他地方遇到的大多数信息似乎表明减少地图上的点数是可行的方法(即,从更高的高度/缩放级别)。虽然在某些情况下这可能是一个好方法,但在这里行不通。我们正在寻找带有数千个标记的美国地图的视觉冲击力。我探索过的一个选项是一个名为PushPin的服务,当输入(大概)KML 将在服务器端创建一个叠加层,该叠加层将所有可见点(基于中心纬度/经度和缩放级别)渲染到单个图像上,而不是在客户端执行数千个 DOM 操作,我们将所有这些标记合并到单个图像服务器端,并在客户端执行单个 DOM 操作。PushPin 服务真的很灵巧,如果没有相关成本,肯定会工作。我们真的在寻找可以在服务器端运行以自己生成覆盖的 F/OSS。

4

5 回答 5

4

您可能想查看GeoserverMapserver 之类的东西。它们是谷歌地图的复制品,还有更多。

您可以生成您喜欢的叠加层,Geoserver(我认为 mapserver 也可以)可以为您提供 KML、PDF、png 和其他输出来混合您的地图,或者您可以自己生成整个地图,但这需要时间.

于 2008-10-06T14:49:58.933 回答
2

不确定为什么要转到 GIF/PNG 叠加层,您可以直接在 KML 中执行此操作。我假设您的大部分性能问题是由用户当前视图之外的点引起的,即用户正在查看纽约,但您在洛杉矶有一些点正在浪费内存,因为它们不可见。如果您真的有 16,000 个点对于典型的一次都可见,那么是的,您需要采取不同的策略。

如果上述情况适用,则程序如下:

  1. 确定地图的中心和范围
  2. 鉴于您应该能够计算地图左上角和右下角的纬度/经度。
  3. 遍历您的点数据库并根据两个角检查每个位置。经度需要大于(有符号!)左上经度且小于右下经度。纬度需要小于左上纬度(有符号!)并且大于右下纬度。只是简单的比较,这里不需要花哨的计算。
  4. 将匹配点输出到用户的临时 KML。
  5. 您可以将KML 直接输入谷歌地图并让它映射,或者您可以使用Javascript 地图 API通过 KML 加载点。

它可能无法在这里解决您的确切问题,但对于相关问题,您也可以查看Google Static Maps API。这允许您创建一个带有地标的静态图像文件,该文件将非常快速地加载,但不会具有常规 Google 地图的交互性。然而,由于 API 的设计方式,它也无法处理接近 16,000 个点的任何地方,因此您仍然必须过滤到视图。

于 2008-10-06T15:29:04.020 回答
1

我不知道你的项目有多好,但也许你可以看看GeoDjango?这个修改后的 Django 版本包括各种存储位置的工具;转换坐标和显示地图,简单的方法。当然,您需要一些 Python 经验和运行它的服务器,但是一旦您掌握了 Django 的窍门,它就会运行得又快又好。

如果您只是想为您的问题找到一个解决方案,请尝试以较低的缩放级别对结果进行分组,可以在此处找到此实现的一个很好的示例。

于 2008-10-06T14:57:33.570 回答
0

这是困难的一个。您可以在 Google Maps 中使用自定义图块集,但您仍然需要一些方法来生成图块(手动除外)。

恐怕这就是我所拥有的一切=/

于 2008-10-06T14:47:57.817 回答
0

OpenLayers是多个地图服务或您自己的地图服务器的出色 javascript 前端。2.7 版刚刚发布,它添加了一些非常棒的功能和控件。

于 2008-10-06T15:26:10.907 回答