2009-07-06 5 views
0

У меня есть mashup-карты google, которые хорошо работали с «маленькими» тестовыми файлами - каждый файл, который я сгенерировал, даже для 60-мильной поездки, был меньше 16k.KML-файл загружается, но не отображается - почему бы и нет?

Затем, вчера, пользователь прислал мне KML-файл, с которым у них возникли проблемы - он имеет размер более 360 тыс., И, когда он загружается в порядке, и когда я вызываю GGeoXML(), он, похоже, загружается в Карты Google в порядке, но карта не отображается, и в журнале появляется сообщение об ошибке «Ошибка скрипта. (main.js, 0)». Это происходит как в моем собственном приложении, так и в том случае, если я пытаюсь передать файл kml в «Кодовую игровую площадку Google», но файл загружается в 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); 
    } 
} 

ответ

2

Если вы переставляете несколько строк из примера Майка, вы избавляетесь от «побочного эффекта, который карта первоначально будет из всего земного шара, прежде чем приближаться к области, заданной в файле 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); }); 
    } 
} 

К сожалению, это связывает бизнес по загрузке карты с масштабированием его и центрирований его, но это может быть переработано далее. Я хотел придерживаться примера, который Майк дал как можно больше.

0

Похоже, что предельный размер для GGeoXml является 3MB, так что может быть проблема с KML-файла.

См. Сообщение Pamela here.

+0

Спасибо - я просматривал группу, и я собираюсь отправить одно сообщение там. Я подозреваю, что может возникнуть проблема с количеством точек в журнале треков пользователя - с проверенными мной GPS-устройствами, зарегистрированными на каждые несколько сотен ярдов, по-видимому, он записывает в 8-16 раз больше этого разрешения. –

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() делает.

К сожалению, это, по-видимому, устанавливает условие гонки в коде карты google. Изменение кода следующим образом:

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 для завершения вашего вопроса, предоставив фрагмент кода. Я тоже боролся с этим. –

+0

«у него есть побочный эффект, что карта изначально будет всего земного шара, прежде чем приближаться к области, заданной в файле kml». На самом деле это хуже. Если вы сбросите карту, она вернется и к глобальному виду. –

1

Изменить это в коде Рейфа:

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

К этому

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