我遇到了与从Web服务器上的KMZ文件(使用fetchKml)获取的KML DOM导航相关的性能问题。我正在使用这里描述和讨论的gex.dom.walk方法:
https://developers.google.com/earth/articles/domtraversal
http://code.google.com/p/earth-api-utility-library/wiki/GEarthExtensionsDomReference
基本上,当文件夹名称与GUI点击事件中的某些条件匹配时,我只是尝试打开/关闭文件夹的可见性。正如我所说,这可行,但性能不是很好。可能需要30-60秒才能在应用程序中更新可见性设置。我在上面的链接中读到,你可以关闭子节点的步行,我试图用下面的对象文字方法做到这一点。我所包含的代码不会产生任何javascript错误,但它并没有提高性能。我不确定我是否正确创建了对象文字并正确设置了walk children属性。有什么建议?使用gex.dom.walk关闭walk children属性的一个很好的例子将非常有帮助。我无法在网上找到一个例子。
这些文件夹中有多个地标(100s),我有25个文件夹。所以,我想避免走路,并怀疑这至少是性能问题的罪魁祸首的一部分。 KMZ文件大约250 Kb,内部KML大约7.5 Mb。这个文件也会随着时间的推移而增长。
我也读过关于Gzip压缩的内容,并且还需要对此进行更多的研究。我怀疑这也可能有所帮助。
感谢您提供任何直接回复或相关提示!
function visibilityKml(context) {
//this is called by click events on the GUI
//if a menu item click, traverse the KML DOM to process the visibility request
//
//
var gex = new GEarthExtensions(ge);
var walkStatus = {
walkChildren : true
};
gex.dom.walk({
rootObject: ge,
visitCallback: function(walkStatus) {
// 'this' is the current DOM node being visited.
if ('getType' in this && this.getType() == 'KmlFolder') {
if ( context.match("AXYZ") && this.getName().match("AXYZ") && this.getVisibility() == false) {
this.setVisibility(true);
}
else if ( context.match("AXYZ") && this.getName().match("BXYZ") && this.getVisibility() == true) {
this.setVisibility(false);
}
else if ( context.match("BXYZ") && this.getName().match("BXYZ") && this.getVisibility() == false) {
this.setVisibility(true);
}
else if ( context.match("BXYZ") && this.getName().match("AXYZ") && this.getVisibility() == true) {
this.setVisibility(false);
}
else if ( context.match("All XYZ") && this.getName().match("XYZ") && this.getVisibility() == false) {
this.setVisibility(true);
}
if ( this.getName().match("XYZ") ) {
this.walkChildren = false;
}
}
}
});
}
答案 0 :(得分:1)
首先:在您的KML文件中,您需要编辑这些行
OLD
<Folder>
<name>Name of Folder</name>
<Placemark>
..........
</Placemark>
</Folder>
NEW
<Folder id="unique_id">
<name>Name of Folder</name>
<Placemark>
..........
</Placemark>
</Folder>
第二:如果您想切换此文件夹的可见性,请使用Accessors
根据您加载KML的方式(例如fetch,parse,networklink),您可以使用不同的Accessor。我假设你正在使用fetchKml()
所以我建议你考虑使用
getElementByUrl()
所以,你最终会做这样的事情: (你需要#符号)
var url = 'http://www.domain.com/yourFile.kml';
var folder = ge.getElementByUrl(url + '#' + 'unique_id');
folder.setVisibility(true|false);
希望有所帮助!