当前位置: 首页 > 知识库问答 >
问题:

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

冀胤运
2023-03-14

我一直有一些与导航KML DOM相关的性能问题,我从Web服务器上的KMZ文件(使用的是ftchKml)获得。我正在使用这里描述和讨论的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错误,但它不会提高性能。我不确定我是否正确地创建了对象文字并正确地设置了步行儿童属性。有什么建议吗?使用gex.dom.walk关闭步行儿童财产的一个很好的例子将非常有帮助。我在网上找不到一个例子。

这些文件夹里有很多的标志(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;
                  }
            }
        } 
    });
}

共有1个答案

阎知
2023-03-14

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

旧的

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

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

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

根据加载KML的方式(例如获取、解析、网络链接),可以使用不同的访问器。我假设您使用的是fetchKml(),因此我建议您考虑使用getElementByUrl()

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

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

希望有帮助!

 类似资料:
  • 问题内容: 我已经阅读了很多有关代码重构和避免if else语句的主题。实际上,我有一堂课,我在使用很多if-else条件。 更多详细信息:我正在使用拉式解析器,并且在我的肥皂响应的每一行上,我都会检查是否有我感兴趣的标签,如果没有,请检查其他标签,等等: 现在,我想使用somethimg,而不是其他条件,但是我不知道是什么。 您能给我一个例子还是一个很好的教程页面? 谢谢。 问题答案: 在这种特

  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

  • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免

  • 问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc

  • 问题内容: 我正在执行超过1.5 TB数据的Hadoop作业,并进行了大量模式匹配。我有几台机器,每台机器都有16GB的RAM,我总是用这些数据来完成这项工作(我正在使用Hive)。 我想知道如何在文件中优化设置选项,所以我的工作不会失败。甚至可以设置此选项以使我的工作不会失败吗? 当我设置为1.5 GB并从查询中删除了一半的模式匹配时,作业成功运行。那么,如果该选项不能帮助避免作业失败,那么该选

  • 当我开始增加n:overflowerrror:long int太大而无法转换为float时,我得到了一个溢出错误 项变得非常大,而项变得非常小。基本上,我有一个大分子除以一个大分母。对如何计算这个有什么建议吗?我想过用对数和斯特林近似公式来表示n!无济于事。任何帮助将不胜感激!