Javascript KML文件加载但不加载';为什么不呢?

Javascript KML文件加载但不加载';为什么不呢?,javascript,google-maps,Javascript,Google Maps,我有一个GoogleMaps mashup,它可以很好地处理“小”测试文件——我生成的每个文件,即使是60英里的路程,也不到16k 然后,昨天,一个用户向我发送了一个他们遇到问题的KML文件-它的大小超过360k,当它上传正常时,当我调用GGeoXML()时,它似乎加载到Google Maps中正常,但没有出现地图,并且错误“Script error.(main.js,0)”出现在日志中。这在我自己的应用程序中都会发生,如果我尝试将kml文件提供给Google的“代码游乐场”——但该文件在Goo

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

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

我已经扫描了谷歌文档,但找不到任何关于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);
  }
}

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


请参阅Pamela的帖子。

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


参见Pamela的帖子。

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

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);
根据谷歌地图文档,在构建新地图后,必须立即调用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文件定义的区域之前,地图最初是整个地球的。

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

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);
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); });
    }
}
根据谷歌地图文档,在构建新地图后,必须立即调用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文件定义的区域之前,地图最初是整个地球的。

如果您重新排列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给出的示例。

如果您重新排列Mike示例中的几行,您将消除“副作用,即地图最初是整个地球的,然后再缩放到kml文件定义的区域。”


不幸的是,它将加载地图与缩放地图和将地图居中联系在一起,但这可以进一步重构。我希望尽可能多地坚持迈克给出的例子。

在Rafe的代码中更改这一点:

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

map.setZoom(map.getBoundsZoomLevel(bounds)); map.setZoom(map.getBoundsZoomLevel(bounds));
在Rafe的代码中更改此项:

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

map.setZoom(map.getBoundsZoomLevel(bounds)); map.setZoom(map.getBoundsZoomLevel(bounds));
谢谢-我一直在回顾这个小组,我将在那里发布同样的消息。我怀疑用户跟踪日志中的点数可能有问题-我测试的GPS每隔几百码记录一个位置,他的记录似乎是该分辨率的8-16倍。谢谢-我一直在查看组,我将在那里发布相同的消息。我怀疑用户跟踪日志中的点数可能有问题-我测试的GPS每隔几百码记录一个位置,他的记录似乎是该分辨率的8-16倍。+1通过提供代码片段来完成您的问题。我也在努力解决这个问题,“它有一个副作用,那就是地图在放大到kml文件定义的区域之前,最初是整个地球的”。事实上比这更糟。如果重置映射,它也会返回到全局视图。+1用于通过提供代码片段来完成问题。我也在努力解决这个问题,“它有一个副作用,那就是地图在放大到kml文件定义的区域之前,最初是整个地球的”。事实上比这更糟。如果重置贴图,它也会返回到全局视图。