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>

2 番目: このフォルダーの可視性を切り替えたい場合は、アクセサーを使用します

KML の読み込み方法 (fetch、parse、networklink など) に応じて、異なるアクセサーを使用します。私はあなたが使用していると推測するので、 getElementByUrl()fetchKml()の使用を検討することをお勧めします

したがって、次のようなことを行うことになります: ( # 記号が必要です)

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 に答える