任何方式,我可以加载KML数据从谷歌地图(再次)通过JS API

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

本文关键字:谷歌地图 再次 通过 JS 数据 API 加载 何方 任何方 我可以 KML      更新时间:2023-09-26

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

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

一切正常。直到事实并非如此。由于实现了最近对API的更改(特别是关于KML的内容),我的请求返回KMZ(压缩的KML)数据。当然,无论是YQL转换还是我的Ember应用程序都不能处理现在的二进制数据。

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

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

至少可以通过改变地图的嵌入url来加载KML层,从而使请求传递KML数据。

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

https://maps.google.com/maps/ms?ie=UTF8& msa = 0,输出= kml& msid = {msid}

对于最近嵌入的带有mid参数的url,使用:

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

这些url可以用来创建一个kmlLayer对象使用谷歌地图的JavaScript API,像这样:

// 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 Maps创建的每个自定义地图作为KML/KMZ数据源来定义您可以使用JS API在单个画布上显示和切换的地图视图。对我的案子有用

你可以使用KmlLayer

查看这个Google开发人员示例

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

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

一样:

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

似乎不想加载omnivore。