1

我在导航从 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 属性的一个很好的例子将非常有帮助。我在网上找不到示例。

这些文件夹中有许多地标(100 个),我有 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;
                  }
            }
        } 
    });
}
4

1 回答 1

1

首先:在您的 KML 文件中,您需要编辑这些行

老的

<Folder>
      <name>Name of Folder</name>
      <Placemark>
      ..........
      </Placemark>
 </Folder>

新的

<Folder id="unique_id">
      <name>Name of Folder</name>
      <Placemark>
      ..........
      </Placemark>
 </Folder>

第二:当您希望切换此文件夹的可见性时,请使用访问

根据您加载 KML 的方式(例如 fetch、parse、networklink),您可以使用不同的访问器。我假设您正在使用fetchKml(),所以我建议您考虑使用 getElementByUrl()

所以,你最终会做这样的事情:(你需要 # 符号)

var url = 'http://www.domain.com/yourFile.kml';
var folder = ge.getElementByUrl(url + '#' + 'unique_id');
folder.setVisibility(true|false);

希望有帮助!

于 2013-01-29T01:16:47.893 回答