我一直在研究一个小的ember应用程序,该应用程序从本地报纸API加载文章并以一种不错的布局进行展示。由于这些文章都是关于旅行目的地的,因此导航基于在页面背景中带有标记的大地图。
最初我是从传单地图开始的。为每篇文章添加标记是没有问题的,因为我知道它们的坐标,因为它们随每篇文章一起保存并可通过API访问。

当我意识到一些作者将精美的站点,条形图等标记嵌入到他们的副本中时,情况变得更加复杂。由于我不想在单张地图上显示Google地图,因此我在寻找方法从Google地图获取标记数据,并在我的Leaflet中使用它。我最终使用的解决方案非常疯狂,但是却实现了我所希望的:我意识到对Google地图嵌入网址的HTTP请求(请求参数“输出”设置为“ kml”)使我得到了一个KML / XML文件地图使用的KML层的所有数据。为了规避跨域请求的问题,我通过Yahoo的YQL服务间接请求了KML数据,该服务也将数据也转换为JSON。

一切都很好。直到不是那样。由于实施了对API的最新更改(尤其是有关KML的东西),我的请求返回了KMZ(压缩的KML)数据。当然,YQL转换和我的Ember应用程序都无法处理现在的二进制数据。

似乎没有任何方法可以让我再次接触未压缩的数据。是否至少有一种方法可以使我的主地图(现在也是Google地图)从嵌入网址所标识的另一张地图中加载kml图层?任何提示都是值得欢迎的,并且真的很感激。谢谢!

最佳答案

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

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

对于具有msid参数的旧版嵌入网址,请使用:

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

对于带有中间参数的最新嵌入网址,请使用:

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

然后,这些网址可用于使用Google Map的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 Maps创建的每个自定义地图用作KML / KMZ数据源,以定义可以使用JS API在单个画布上显示和切换的地图视图。为我的情况工作。

关于javascript - 我可以通过JS API从Google map (再次)加载KML数据吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30458329/

10-12 15:41