2009-07-06 217 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)); 
相關問題