2009-07-06 220 views
0

我有一个与“小”测试文件很好地工作的谷歌地图混搭 - 即使对于60英里的旅行,我生成的每个文件都小于16k。加载KML文件但不显示 - 为什么不?

然后,昨天,用户发给我一个他们遇到问题的KML文件 - 它的大小超过了360k,并且上传时没问题,当我调用GGeoXML()时,它似乎可以加载到Google Maps中,但不会显示地图,并且日志中会显示错误“脚本错误。(main.js,0)”。这发生在我自己的应用程序中,并且如果我尝试将kml文件提供给Google的“Code Playground” - 但该文件在Google地球中正常加载。如果我将文件从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); 
    } 
} 

回答

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

不幸的是它关系了缩放,并围绕它加载地图的业务,但可以进一步重构。我想坚持Mike给出的例子。

0

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

查看Pamela的帖子here

+0

谢谢 - 我一直在检讨的组,我要发布同样的信息在那里。我怀疑用户轨迹记录中的点数可能存在问题 - 我测试的GPS每隔几百码就记录一个位置,他似乎以该分辨率的8-16倍记录。 – 2009-07-06 17:30:36

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

按照谷歌地图文档,则必须构建新的地图后,立即调用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文件定义的区域之前,地图最初将位于整个地球。

+0

+1通过提供代码片段来完成您的问题。我也在为此苦苦挣扎。 – 2009-12-16 11:56:47

1

变化这雷夫代码:

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

对此

 
map.setZoom(map.getBoundsZoomLevel(bounds)); 
相关问题