KML DOM行走很慢!如何避免遛孩子?

时间:2013-01-29 00:16:38

标签: javascript kml google-earth-plugin

我遇到了与从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;
                  }
            }
        } 
    });
}

1 个答案:

答案 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);

希望有所帮助!