【问题标题】:KML file loads but doesn't display - why not?KML 文件加载但不显示 - 为什么不呢?
【发布时间】:2009-07-06 16:00:55
【问题描述】:

我有一个 google-maps mashup 可以很好地处理“小”测试文件 - 我生成的每个文件,即使是 60 英里的行程,也不到 16k。

然后,昨天,一位用户向我发送了一个他们遇到问题的 KML 文件 - 它的大小超过 360k,虽然它可以上传,但当我调用 GGeoXML() 时,它似乎可以加载到 Google 地图中,但是没有地图出现,并且日志中出现错误“脚本错误。(main.js,0)”。这既发生在我自己的应用程序中,也发生在我尝试将 kml 文件提供给谷歌的“代码游乐场”时——但文件在谷歌地球中加载良好。如果我将 Google 地球中的文件重新保存为 kmz 格式,那也可以使用 - 但由于文件不再是 XML,我失去了 mashup 的一些“附加值”功能。

我已经扫描了 Google 文档,但找不到任何有关 kml 文件最大文件大小的参考。

有什么建议吗?

这是导致代码游乐场出现问题的代码片段:

var map;
function zoomToGeoXML(geoXml) {
    var center = geoXml.getDefaultCenter();
    var span = geoXml.getDefaultSpan();
    var sw = new GLatLng(center.lat() - span.lat() / 2,
                    center.lng() - span.lng() / 2);
    var ne = new GLatLng(center.lat() + span.lat() / 2,
                    center.lng() + span.lng() / 2);
    var bounds = new GLatLngBounds(sw, ne);
    map.setCenter(center);
    map.setZoom(map.getBoundsZoomLevel(bounds));
}

function initialize() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map_canvas"));
    var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml",
                function() { zoomToGeoXML(geoXml); });
    map.addOverlay(geoXml);
  }
}

【问题讨论】:

    标签: javascript google-maps


    【解决方案1】:

    如果您从 Mike 的示例中重新排列几行,则可以消除“在放大到 kml 文件定义的区域之前,地图最初将是整个地球的副作用”。

    var map;
    
    function loadMapAndZoomToGeoXML(geoXml) {
        center = geoXml.getDefaultCenter();
        var span = geoXml.getDefaultSpan();
        var sw = new GLatLng(center.lat() - span.lat() / 2, center.lng() - span.lng() / 2);
        var ne = new GLatLng(center.lat() + span.lat() / 2, center.lng() + span.lng() / 2);
        var bounds = new GLatLngBounds(sw, ne);
        map = new GMap2(document.getElementById("map_canvas"));
        map.setCenter(center);
        map.setZoom(KmlMap.getBoundsZoomLevel(bounds));
        map.addOverlay(geoXml);
        map.enableScrollWheelZoom();
        map.setUIToDefault();
        map.addControl(new GLargeMapControl());
    }
    
    function initialize() {
        if (GBrowserIsCompatible()) {
            var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml", function() { loadMapAndZoomToGeoXML(geoXml); });
        }
    }
    

    不幸的是,它将加载地图的业务与缩放和居中联系起来,但这可以进一步重构。我想尽可能地坚持 Mike 给出的例子。

    【讨论】:

      【解决方案2】:

      事实证明,真正的问题不是文件大小,而是片段

      map = new GMap2(document.getElementById("map_canvas"));
      var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml",
                  function() { zoomToGeoXML(geoXml); });
      map.addOverlay(geoXml);
      

      根据 Google Map 文档,您必须在构建新地图后立即调用 setCenter()。我没有这样做,因为 zoomToGeoXML() 会这样做。

      不幸的是,这显然在谷歌地图代码中设置了竞争条件。更改要读取的代码:

      map = new GMap2(document.getElementById("map_canvas"));
      map.setCenter(new GLatLng(0,0));
      var geoXml = new GGeoXml("http://(my base url)/files/gps/expr.kml",
                  function() { zoomToGeoXML(geoXml); });
      map.addOverlay(geoXml);
      

      显然正确地解决了问题。但是,它的副作用是,在放大到 kml 文件定义的区域之前,地图最初将是整个地球的地图。

      【讨论】:

      • +1 通过提供代码 sn-p 来完成您的问题。我也在为此苦苦挣扎。
      • “它的副作用是地图在放大到 kml 文件定义的区域之前最初是整个地球的”。实际上比这更糟糕。如果您重置地图,它也会返回到全局视图。
      【解决方案3】:

      在 Rafe 的代码中改变这个:

      map.setZoom(KmlMap.getBoundsZoomLevel(bounds));

      到这里

      map.setZoom(map.getBoundsZoomLevel(bounds));

      【讨论】:

        【解决方案4】:

        看起来GGeoXml的大小限制是3MB,所以KML文件本身可能有问题。

        查看 Pamela 的帖子 here。

        【讨论】:

        • 谢谢 - 我一直在审查小组,我将在那里发布相同的消息。我怀疑用户跟踪日志中的点数可能存在问题 - 我测试的 GPS 每隔几百码记录一个位置,他的记录似乎是该分辨率的 8-16 倍。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 2012-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多