Как оптимизировать время загрузки веб-плагина Google Планета Земля, если у меня очень большой файл KML?

У моего клиента очень большой файл KML, он содержит около 6000+ меток, и эти метки должны отображаться на карте в виде 3D-моделей. Еще хуже то, что файл KML не содержит тега <link> для файла COLLADA, а это означает, что мне нужно просмотреть файл KML и прикрепить файл COLLADA, прежде чем его можно будет отобразить в Google Earth. Теперь я уже могу обходить и добавлять 3D-модель для каждой метки. Я протестировал его с очень маленьким файлом KML (который содержит менее 100 меток), и он отлично работал, как и ожидалось ... но когда я использовал очень большой файл KML, в котором было около 6000+ меток, плагин просто вылетает и Мне советуют обновить браузер, но он снова вылетает... :(

Любые советы по этому поводу? Есть ли ограничение на количество меток, которые я могу разместить в веб-плагине Google Планета Земля? Как ускорить загрузку?

function render3DPoles(polesKmlLink){

                google.earth.fetchKml(ge,polesKmlLink, function(object){
            if(object){
                var item = object.getFeatures().getChildNodes().item(0);
                    var folder = item.getFeatures().getChildNodes();

                var latitude;
                var longitude;

                      for(var i = 0; i<folder.getLength(); i++){

                    var placemark = folder.item(i);

                    latitude = placemark.getGeometry().getLatitude();
                    longitude = placemark.getGeometry().getLongitude();

                        var model = ge.createModel('');
                    var location = ge.createLocation('');

                    model.setLocation(location);
                    var link = ge.createLink('');


                    link.setHref('insert URL of collada file here');
                    model.setLink(link);

                        location.setLatitude(latitude);
                        location.setLongitude(longitude);
                        model.setLocation(location); 
                        placemark.setGeometry(model);

                     ge.getFeatures().appendChild(placemark);
                     }

                     var la = ge.createLookAt('');
                     la.set(latitude,longitude, 25, ge.ALTITUDE_RELATIVE_TO_GROUND,180, 60, 100);
                     ge.getView().setAbstractView(la);

                } else {
                    setTimeout(function() {
                      alert('Bad or null KML.');
                      },0);
                }
            });
        }

person 황현정    schedule 14.02.2012    source источник


Ответы (2)


Я имел дело с 10 000 меток и других объектов kml в плагине земли, и лучший способ, который я нашел, - это управлять данными в объекте javascript. работа с ними в стандартном kml часто приводила к сбою.

предварительно разобрать kml во что-то, что вы можете обрабатывать как объект

начните с:

var myModels = {};

для добавления первого элемента, если идентификатор "foo" или числовой, сделайте что-то вроде:

myModels['foo'] = { 
     description: 'some description for foo', 
     longitude: 100.12345,
     latitude: 45.4567
     linkUrl: 'http://mydomain.com/mymodels/foo.dae', 
     kmlObject: null};

теперь смотрю на код из:

http://code.google.com/apis/ajax/playground/?exp=earth#creating_3d_models

у вас будет что-то похожее на:

var placemark = ge.createPlacemark('');
  placemark.setName('model');
  var model = ge.createModel('');
.......
placemark.setGeometry(model);

теперь иди:

myModals['foo'].kmlObject = placemark;

это даст вам быструю ссылку на модель, если вам нужно изменить ее или удалить, просто

myModels['foo'].kmlObject 

нет необходимости снова пересекать дерево.

одна вещь, которую я нашел более быстрой, заключалась в том, чтобы определить клиентскую часть kml и использовать parseKml для ее загрузки, а не создавать отдельные объекты и добавлять их.

также вы можете встроить логику, чтобы добавить только модель dae, которая находится в области, на которую смотрит пользователь.

перебрать все элементы

var i, iModel;

for (i in myModels){
   iModel = myModels[i];

   if(myModels[m].kmlObject == null){  
       'add if statement to check if the models long/lats are in current view with
        ' iModel.longitude,  iModel.latitude
   } 
}

также вместо того, чтобы добавлять все за одну операцию, добавьте 10-20 моделей в один пакет и используйте setTimeout, чтобы запустить другую пакетную операцию через секунду и использовать .executeBatch

https://developers.google.com/earth/documentation/reference/google_earth_namespace#ab26414915202d39cad12bcd5bd99e739

person Berwyn    schedule 15.02.2012
comment
После извлечения я начал добавлять модель. Я обновил приведенный выше код, чтобы вы могли видеть мой код. - person 황현정; 16.02.2012
comment
Я посмотрю, смогу ли я использовать .executeBatch - person 황현정; 16.02.2012

Хотя технических ограничений нет, чем больше вы добавляете, тем больше ресурсов используется. В зависимости от сложности ваших моделей и других данных вы сможете добавить больше или меньше, но 6000 — это достаточно много для отображения сразу даже для простых маркеров.

Одним из решений для больших/сложных KML-файлов является создание региональных KML-файлов, чтобы вы загружали только те данные, которые вам нужны в любой момент времени, на основе видимых областей (см. http://code.google.com)./apis/kml/documentation/regions.html )

person jlivni    schedule 15.02.2012
comment
Спасибо, попробую посмотреть, смогу ли я это сделать. - person 황현정; 16.02.2012