【问题标题】:Any way I can load KML data from Google maps (again) via JS API?我可以通过 JS API(再次)从 Google 地图加载 KML 数据吗?
【发布时间】:2015-08-08 02:44:46
【问题描述】:

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

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

一切都很好。直到没有。自从对 API 进行了最近的更改(尤其是关于 KML 的内容),我的请求返回了 KMZ(压缩的 KML)数据。当然,无论是 YQL 转换还是我的 Ember 应用程序都无法处理现在的二进制数据。

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

【问题讨论】:

    标签: javascript google-maps google-maps-api-3 kml


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 您使用的这些 URL 是否记录在任何地方?如果它们没有记录在案,您可以期望它们随时更改,或者让 Google 阻止您使用它们等。这不是您想在生产网站上使用的东西。
    • 就是这样。两者都是/曾经是官方的方法。使用 msid 参数的 url 被转发到带有 mid 的 URL。意味着它是一种转换。 Google 似乎经常更改 embed/kml url 的格式(这里没有提到 mapengine 子域)。到目前为止,他们保留了旧的功能。但是,就像在没有另行通知的情况下将 vom KML 切换到 KMZ 一样,您不能完全确定是否坚持下去。因为当他们决定突然阻止从外部资源加载 KML 文件时,他们也不关心破坏数千个嵌入地图。
    【解决方案2】:

    您可以使用 KmlLayer

    查看这个谷歌开发者示例

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

    【讨论】:

    • 我的问题不是关于图层,而是关于如何从通过嵌入 url 识别的自定义地图加载 KmlLayers 并将它们显示在通过 Google Maps JS API 创建的地图画布上。不过,感谢您的尝试。 ;)
    【解决方案3】:

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

    像这样:

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2012-05-30
      • 2012-08-29
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多