【问题标题】:Drawing The Shortest Line Between Points In A KML Track On Google Maps在 Google 地图上绘制 KML 轨迹中点之间的最短线
【发布时间】:2015-09-09 20:46:35
【问题描述】:

更新:Google 已于 2016 年 3 月 6 日修复了此错误 https://code.google.com/p/gmaps-api-issues/issues/detail?id=8003&q=apitype%3AJavascript3%20type%3ADefect&sort=-stars&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Internal%20Stars

当最短线穿过国际日期变更线时,我无法显示两点之间的最短线。有一个问题的说明:http://cars-suck.com/Test(放大和缩小显示谷歌在做什么。)

旧金山和东京之间的一条线应该穿过太平洋,因为那是最短的路径。相反,谷歌在北美、大西洋、亚洲等地划了一条线。

我应该改变什么以获得我想要的线路?

这是 .kml 文件的相关块:

<Placemark>
<styleUrl>#multiTrack</styleUrl>
<gx:Track>
    <altitudeMode>clampToGround</altitudeMode>
    <when>2014-09-17T07:25:06.875-07:00</when><gx:coord>-122.4167 37.7833 0</gx:coord>
    <when>2014-09-18T12:06:42.745-07:00</when><gx:coord>139.6833 35.6833 0</gx:coord>
</gx:Track>

这是显示地图的脚本:

    <script>
  function initialize() {
    var mapCanvas = document.getElementById('map_canvas');
    var mapOptions = {
      center: new google.maps.LatLng(21.3114, -179.9999),
      zoom: 2,
      mapTypeId: google.maps.MapTypeId.TERRAIN,
      preserveViewport: true,
    }
    var map = new google.maps.Map(mapCanvas, mapOptions);
    var kmlUrl = 'http://cars-suck.com/Test/Assets/gps_history.kml';
    loadKmlLayer(kmlUrl, map);
  }

  function loadKmlLayer(src, map) {
    var kmlLayer = new google.maps.KmlLayer(src, {
      suppressInfoWindows: false,
      preserveViewport: true,
      map: map
    });
  }

  google.maps.event.addDomListener(window, 'load', initialize);

</script>

完整的 .kml 文件在这里:cars-suck.com/Test/Assets/gps_history.kml

我可能已经失去了理智,但我相信这在 1 月份就可以正常工作。也许我依赖的东西已被弃用,或者我只是认为它有效。

更新:我并没有失去理智。有人在这里报告了类似的问题:productforums.google.com/forum/#!topic/maps/kQo4IcDRysk

错误报告:https://code.google.com/p/gmaps-api-issues/issues/detail?id=8003&q=apitype%3AJavascript3%20type%3ADefect&sort=-stars&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Internal%20Stars

在 stackoverflow 上:Google Maps mangling KML

还没有解决办法。

【问题讨论】:

    标签: google-maps kml google-earth


    【解决方案1】:

    当 Google 地球中的几何图形需要跨越国际日期变更线时,您可以指定不同的度数坐标以“提示”预期方向。来自谷歌KML specification

    指定边界框西边的经度,单位为 从 0 到 ±180 的十进制度。对于与经线重叠的叠加层 经度为 180°,值可以超出该范围。

    在您的情况下,KML 将是:

    <Placemark>
        <styleUrl>#multiTrack</styleUrl>
        <gx:Track>
            <altitudeMode>clampToGround</altitudeMode>
            <when>2014-09-17T07:25:06.875-07:00</when><gx:coord>-122.4167 37.7833 0</gx:coord>
            <when>2014-09-18T12:06:42.745-07:00</when><gx:coord>-220.3167 35.6833 0</gx:coord>
        </gx:Track>
    </Placemark>
    

    附言感谢提供.kml 文件,调试起来非常方便!

    【讨论】:

    • 感谢亚当!我永远不会在 KML 文档中找到该段落。使长坐标“超过”-180 肯定会让这条线朝着正确的方向前进,但是当我使用你的更改时,如发布的那样,看看它到达日期线时会发生什么:(cars-suck.com/Test)
    • 我在 Google 地球中测试了我提出的方法。 Maps Javascript API 实际上并不支持完整的 KML 规范。您可以看到它支持herehere 的哪些KML 元素。值得注意的是缺少对gx:Track 的支持。
    • 再次感谢亚当。我删除了 gx:Track 标签,改用 LineString。没有改变任何东西。我将结果添加到cars-suck.com/Test
    • 看起来地图有几何问题的历史,跨越 180 度子午线。 (参见this questionthis question)您可能会在这些线程中找到一些解决方法,例如将其分成两行。
    【解决方案2】:

    这是 google maps javascript API 中的一个错误。该错误于 2015 年 5 月引入。Here's the bug report。添加您的投票可能会加快修复速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2015-02-22
      • 2018-09-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多