我的客户有一个非常大的KML文件,它包含周围的6000+地标,这些地标必须在地图上显示为3D模型。更糟糕的是,KML文件不包含COLLADA文件的<link>
标记,这意味着我必须遍历KML文件并附加COLLADA文件,然后才能在google earth上显示它。现在我已经可以遍历并为每个placemark添加一个3D模型了。我用一个非常小的KML文件(其中包含的地标少于100个)测试了它,当我使用非常大的KML文件(上面有6000+地标)时,它像expected...but一样工作得很好,插件就崩溃了,有人建议我刷新浏览器,结果发现它又崩溃了……:(
对此有什么建议吗?我可以放在谷歌地球web插件上的地标数量有限制吗?如何使加载速度更快?
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);
}
});
}
发布于 2012-02-16 07:50:01
我已经处理过地球插件中的10000个placemarks和其他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
发布于 2012-02-16 07:26:43
虽然没有技术限制,但添加的越多,使用的资源就越多。根据模型和其他数据的复杂性,您可以添加或多或少的数据,但即使对于简单的标记,一次显示6000个数据也是相当多的。
大型/复杂KML的一种解决方案是创建区域化的KML,这样您就可以根据可见区域在任何给定时间加载所需的数据(请参阅http://code.google.com/apis/kml/documentation/regions.html )
https://stackoverflow.com/questions/9274196
复制相似问题