2009-07-06 5 views
0

Ich habe ein Google-Maps-Mashup, das ziemlich gut mit "kleinen" Testdateien funktionierte - jede Datei, die ich selbst für eine 60-Meilen-Reise erstellte, war weniger als 16k.KML-Datei lädt, aber nicht angezeigt - warum nicht?

Dann schickte mir gestern ein Benutzer eine KML-Datei, mit der sie Probleme hatten - es ist über 360k groß und, während es OK lädt, und wenn ich GGeoXML() anrufe, scheint es in Google Maps zu laden, aber keine Karte erscheint und der Fehler "Skriptfehler. (main.js, 0)" erscheint im Protokoll. Dies geschieht sowohl in meiner eigenen Anwendung als auch wenn ich versuche, die kml-Datei dem "Code Playground" von Google zuzuführen - aber die Datei wird in Google Earth geladen. Wenn ich die Datei erneut aus Google Earth in das kmz-Format speichere, funktioniert das auch - aber da die Datei nicht mehr XML ist, verliere ich einige der "Mehrwert" -Funktionen meines Mashups.

Ich habe die Google-Dokumentation eingescannt, konnte aber keinen Verweis auf eine maximale Dateigröße für kml-Dateien finden.

Irgendwelche Vorschläge?

Hier ist ein Code-Fragment, das das Problem im Code-Spielplatz Ursachen:

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

Antwort

2

Wenn Sie ein paar Zeilen von Mikes Beispiel neu anordnen, werden Sie den "Nebeneffekt, dass die Karte anfänglich vom gesamten Globus ist, bevor Sie in den von der kml-Datei definierten Bereich zoomen."

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

Leider bindet es das Geschäft des Ladens die Karte oben mit ihm ein- und Zentrieren, aber das kann weiter Refactoring werden. Ich wollte bei dem Beispiel bleiben, das Mike so oft wie möglich gab.

0

Es ist wie die Größenbeschränkung für GGeoXml aussieht, ist 3MB, so dass es ein Problem mit der KML-Datei selbst sein kann.

Siehe Pamelas Beitrag here.

+0

Dank - ich habe die Gruppe war die Überprüfung, und ich werde die gleiche Botschaft dort posten. Ich vermute, dass es ein Problem mit der Anzahl der Punkte im Tracklog des Benutzers gibt - die GPS-Geräte, die ich getestet habe und alle paar hundert Meter eine Position aufgezeichnet haben, scheint seine 8- bis 16-fache Auflösung aufzuzeichnen. –

2

Es stellt sich heraus, dass das eigentliche Problem nicht die Dateigröße ist, es ist das Fragment

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

Nach dem docs Google Map, müssen Sie rufen setCenter() unmittelbar nach einer neuen Karte zu konstruieren. Das habe ich nicht gemacht, weil zoomToGeoXML() funktioniert.

Leider, das offenbar eine Race-Bedingung in der Google Map-Code. Ändern des zu lesenden Codes:

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

löst offenbar das Problem richtig. Es hat jedoch den Nebeneffekt, dass die Karte anfänglich den gesamten Globus umfasst, bevor sie in den durch die kml-Datei definierten Bereich zoomt.

+0

+1 für das Ausfüllen Ihrer Frage, indem Sie das Code-Snippet bereitstellen. Ich hatte auch damit zu kämpfen. –

+0

"Es hat den Nebeneffekt, dass die Karte anfänglich den gesamten Globus umfasst, bevor sie in den durch die kml-Datei definierten Bereich zoomt". Es ist eigentlich schlimmer als das. Wenn Sie die Karte zurücksetzen, wird auch die globale Ansicht angezeigt. –

1

Ändern Sie diese in Rafes Code:

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

Um dies zu

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