KML文件加载但不显示 - 为什么不呢?

时间:2009-07-06 16:00:55

标签: javascript google-maps

我有一个google-maps mashup,与“小”测试文件相当不错 - 我生成的每个文件,即使是60英里的行程,都不到16k。

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

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

有什么建议吗?

这是导致Code Playground中出现问题的代码片段:

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);
  }
}

4 个答案:

答案 0 :(得分: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 :(得分:2)

如果你从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); });
    }
}

不幸的是,它将加载地图的过程与缩放和中心化相关联,但这可以进一步重构。我想尽可能坚持迈克给出的榜样。

答案 2 :(得分:1)

在Rafe的代码中更改此内容:

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

到此

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

答案 3 :(得分:0)

看起来GGeoXml的大小限制为3MB,因此KML文件本身可能存在问题。

见Pamela的帖子here