0

我的客户有一个非常大的 KML 文件,它包含大约 6000 多个地标,这些地标必须在地图上显示为 3D 模型。更糟糕的是KML文件不包含<link>COLLADA文件的标签,这意味着我必须遍历KML文件并附加一个COLLADA文件才能在google earth上显示。现在我已经可以遍历并为每个地标添加一个 3D 模型。我用一个非常小的 KML 文件(包含少于 100 个地标)对其进行了测试,它按预期工作得很好……但是当我使用上面有 6000 多个地标的非常大的 KML 文件时,插件只是崩溃了建议我刷新浏览器,却发现它再次崩溃... :(

对此有何建议?我可以在谷歌地球网络插件上放置的地标数量有限制吗?如何让加载更快?

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

2 回答 2

0

虽然没有技术限制,但添加的越多,使用的资源就越多。根据模型和其他数据的复杂性,您可以添加或多或少,但即使对于简单的标记,一次显示 6000 也是相当多的。

大型/复杂 KML 的一种解决方案是创建区域化 KML,这样您就可以根据可见区域在任何给定时间仅加载所需的数据(请参阅http://code.google.com/apis/kml/文档/regions.html )

于 2012-02-15T23:26:43.340 回答
0

我已经在 earth 插件中处理了 10,000 个地标和其他 kml 对象,我发现最好的方法是在 javascript 对象中管理数据。用标准的 kml 处理它们通常会导致崩溃。

事先将 kml 解析为可以作为对象处理的内容

从...开始:

var myModels = {};

如果 id 为 '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

于 2012-02-15T23:50:00.510 回答