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

У моего клиента очень большой файл 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);
                }
            });
        }

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Я имел дело с обработкой 10000 меток и других объектов kml в плагине Земли, и лучший способ, который я нахожу, - это управление данными в объекте javascript. работа с ними в стандартном кмл часто приводит к краху.

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

начать с:

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

0 голосов
/ 16 февраля 2012

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

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

...