首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我有一个非常大的KML文件,如何优化Google Earth Web插件的加载时间?

如果我有一个非常大的KML文件,如何优化Google Earth Web插件的加载时间?
EN

Stack Overflow用户
提问于 2012-02-14 17:07:38
回答 2查看 1.3K关注 0票数 0

我的客户有一个非常大的KML文件,它包含周围的6000+地标,这些地标必须在地图上显示为3D模型。更糟糕的是,KML文件不包含COLLADA文件的<link>标记,这意味着我必须遍历KML文件并附加COLLADA文件,然后才能在google earth上显示它。现在我已经可以遍历并为每个placemark添加一个3D模型了。我用一个非常小的KML文件(其中包含的地标少于100个)测试了它,当我使用非常大的KML文件(上面有6000+地标)时,它像expected...but一样工作得很好,插件就崩溃了,有人建议我刷新浏览器,结果发现它又崩溃了……:(

对此有什么建议吗?我可以放在谷歌地球web插件上的地标数量有限制吗?如何使加载速度更快?

代码语言:javascript
运行
复制
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);
                }
            });
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-16 07:50:01

我已经处理过地球插件中的10000个placemarks和其他kml对象,我发现最好的方法是在javascript对象中管理数据。在标准的kml中处理它们通常会使程序崩溃。

将kml解析为可以作为对象处理的对象。

从以下内容开始:

代码语言:javascript
运行
复制
var myModels = {};

如果id是'foo‘或数字,则添加第一项,请执行以下操作:

代码语言:javascript
运行
复制
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

您将看到类似以下内容的内容:

代码语言:javascript
运行
复制
var placemark = ge.createPlacemark('');
  placemark.setName('model');
  var model = ge.createModel('');
.......
placemark.setGeometry(model);

现在开始:

代码语言:javascript
运行
复制
myModals['foo'].kmlObject = placemark;

这将为您提供一个快速参考模型,如果您需要更改它或删除它,只需

代码语言:javascript
运行
复制
myModels['foo'].kmlObject 

不需要再次遍历树。

我发现更快的一件事是定义kml客户端并使用parseKml加载它,而不是创建单独的对象并添加它们。

此外,您还可以构建逻辑,以便仅添加用户正在查看的区域内的dae型号

循环遍历所有项

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-02-16 07:26:43

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9274196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档