我可以通过 JS API 从 Google 地图(再次)加载 KML 数据吗?

Any way I can load KML data from Google maps (again) via JS API?

我开发一个 ember 小应用已经有一段时间了,它可以加载当地报纸 API 的文章,并以漂亮的布局呈现。由于这些文章都是关于旅游目的地的,因此导航基于页面背景中带有标记的大地图。 最初我是从传单地图开始的。为每篇文章添加一个标记没有问题,因为我知道它们的坐标,因为它们与每篇文章一起保存并且可以通过 API 访问。

当我意识到一些作者将小的 Goolge 地图嵌入到他们的副本中并带有标记好的网站、酒吧等时,事情变得更加复杂。因为我不想让 Google 地图显示在传单地图,我正在寻找从 Google 地图获取标记数据并将其用于我的传单地图的方法。我最终使用的解决方案非常疯狂,但实现了我所希望的:我意识到对 Google 地图嵌入 url 的 HTTP 请求的请求参数“output”设置为“kml”给我一个 KML/XML 文件,其中包含与地图一起使用的 KML 图层的所有数据。为了避免跨域请求的问题,我通过 Yahoo 的 YQL 服务间接请求了 KML 数据,该服务也将数据转换为 JSON。

一切都很好。直到它不是。自从实施最近对 API 的更改(尤其是关于 KML 内容)后,我请求 return KMZ(压缩的 KML)数据。当然,YQL 转换和我的 Ember 应用程序都不能处理现在的二进制数据。

似乎没有办法再次获得未压缩的数据。至少有一种方法可以让我的主地图——现在也是 Google 地图——从另一个由嵌入 url 标识的地图加载 kml 层吗?欢迎任何提示,非常感谢。谢谢!

您可以使用 KmlLayer

查看此 google 开发人员示例

https://developers.google.com/maps/documentation/javascript/examples/layer-kml

我自己找到了解决方案。由于 Google 仅提供压缩的 KML 数据 (KMZ),因此似乎没有任何方法可以获取实际的原始图层数据以从头开始动态构建地图,同时能够访问和操作每个标记等.

至少可以通过更改地图的嵌入 url 使请求传送 KMZ 数据来加载 KML 图层。

对于带有 msid 参数的旧嵌入 urls 使用:

https://maps.google.com/maps/ms?ie=UTF8&msa=0&output=kml&msid={MSID}

最近使用 mid 参数嵌入 urls:

https://www.google.com/maps/d/u/0/kml?mid={中}

然后可以使用这些 urls 使用 Google 地图的 JavaScript API 创建一个 kmlLayer 对象,如下所示:

// set up map
var map = new google.maps.Map(document.getElementById('map-canvas'),{ … });

// create kmlLayer object from URL
var kmlUrl = 'https://www.google.com/maps/d/u/0/kml?mid=zWcxp2-PLDWQ.k8l5tfHg76WQ';
var kmlLayer = new google.maps.KmlLayer({ url: kmlUrl });

// add layer to map
kmlLayer.setMap(map);

这将设置视图并加载与您的自定义地图一起保存的所有标记和叠加层,由 url 标识。因此,您可以使用使用 Google 地图创建的每个自定义地图作为 KML/KMZ 数据源来定义地图视图,您可以使用 JS API。为我的案子工作。

使用 MSID/MIDs 和 google 我的地图时,我注意到当您被要求导出图层时,它会为您提供接收 KML 的选项。 使用 MID link 或 msid,它给你一个 kmz,你所要做的就是添加 &forcekml=1 接收 kml。

像这样:

https://www.google.com/maps/d/u/0/kml?mid={MID}&forcekml=1

但是似乎不想加载杂食动物。