6

リージョンベースのネットワークリンクの階層を使用して提供される多くの大きなKMLデータセットがあります。KMLリファレンスで説明されているように:

リージョンをNetworkLinksと組み合わせて使用​​すると、ポインターの階層を作成できます。各ポインターは、特定のサブリージョンを指します。次の<viewRefreshMode>KMLファイルに示すように、にはonRegionオプションがあります。このオプションは、Regionがアクティブな場合にのみRegionデータを読み込むように指定します。ネストされたリージョンに複数の詳細レベルを提供する場合、ユーザーの視点が次のロードをトリガーしたときにのみ、大量のデータがロードされます。

これは、GoogleEarthにロードするとうまく機能します。

GoogleEarthプラグインを使用してこれらをアプリケーションにロードしたいと思います。 そして、GoogleEarthAPIを介してロードされたコンテンツにアクセスする必要があります。(つまり、クリックイベントを添付し、スタイルを変更します)コンテンツをアプリケーションに統合します。

問題は、ネットワークリンクの「on-load」イベントへの参照が見つからないことです。私の考えでは、これが機能する方法は次のとおりです。

  • APIを介してトップレベルのネットワークリンクをロードし、ネットワークリンクがロードされたときに呼び出されるコールバック関数をアタッチします。
  • コールバック関数で、ネットワークリンクから返されたKMLを解析します。地域階層の中間レベルの場合、このKMLには次の地域レベルへのネットワークリンクのみが含まれます。これらをAPIを介してプラグインにロードし、同じコールバック関数を再度指定します。この関数は、ロードされたとき(つまり、リージョンが表示されたときに呼び出されます)に呼び出されます。
  • 最終的に、返されるKMLには実際の「コンテンツ」が含まれます。この段階で、必要な変更(イベントリスナーのアタッチ、スタイルの設定など)を実行した後、実際のコンテンツ(つまり目印)をプラグインにロードします。

javascriptは次のようになると思います。
注意:これは、おそらく私の質問を理解するのに役立つ大まかなスケッチです。このコードが機能しない理由を尋ねているのではありませ ん

//create network link
var networkLink = ge.createNetworkLink("");
networkLink.setName("Regionated hierarchy root");

// create a Link object
//the network-links contained in the kml that will be returned in this file
//are region-based; they will only be loaded when the user zooms into the relevant
//region. 
var link = ge.createLink("");
link.setHref("http://foo.com/regionatedRoot.kml");

// attach the Link to the NetworkLink
networkLink.setLink(link);

//specify the callback function to be invoked when the network link is loaded
//this is is the part that doesn't actually exist; pure fiction...
networkLink.onLoad = networkLinkLoaded;

// add the NetworkLink feature to Earth
ge.getFeatures().appendChild(networkLink);

// function which will be invoked when a network-link is loaded
// i.e. when its region becomes active
function networkLinkLoaded(kml) {

   //parse the kml returned for child network links,
   //this will create the network link KmlObject, with a 
   //region specified on it.
   for (childNetworkLink in parseNetworkLinks(kml)) {
      //and append them, again hooking up the call-back
      childNetworkLink.onLoad = networkLinkLoaded;
      ge.getFeatures().appendChild(childNetworkLink);
   }

   //if the user has zoomed in far enough, then the kml returned will
   //contain the actual content (i.e. placemarks).
   //parse the kml returned for content (in this case placemarks)
   for (placemark in parsePlacemarks(kml)) {
      //here we would attach event-listeners to the placemark
      ge.getFeatures().appendChild(placemark);
   }
}

これは可能ですか?
私は自分の考えを間違った方向に向けましたか?大規模なKMLデータセットを管理するための推奨される方法に従っていると思いますが、APIを介してこれらを使用する方法がわかりません。

補遺

私が解決しようとしている問題の種類の例として、Google Earthプラグインを使用してウェブアプリケーションを構築していて、世界中の信号機のすべてのセットに目印を表示したいとします。目印は、適切な詳細レベルでのみ表示する必要があります(たとえば、カメラが5kmの高度にある場合)。ユーザーが目印をクリックすると、Webアプリがその信号機のセットの統計をロードし、サイドバーに表示するようにします。

これをどのように設計しますか?

4

2 に答える 2

1

必要な機能を提供するためにオブジェクト データに直接アクセスする必要はありません。リージョンベースのネットワーク リンクの階層を使用して、これまでとまったく同じようにデータの読み込みを処理します。次に、使用シナリオが補遺で設定したものと似ている場合は、クリック イベントからのターゲット データを使用して、必要に応じて目印に基づいて統計データをロードします。

たとえば、window オブジェクトに一般的な mousedown イベント ハンドラーを設定するだけで、ターゲットが目印かどうかをテストできます。データをロードする前にこの汎用リスナーを追加でき、動的にロードされた目印をクリックすると引き続き起動されます。個々のイベント リスナーを目印にアタッチする必要はまったくありません。

例えば

window.google.earth.addEventListener(ge.getWindow(), 'mousedown', onWindowMouseDown);

var onWindowMouseDown = function(event) {
  if (event.getTarget().getType() == 'KmlPlacemark') {
    // get the placemark that was clicked
    var placemark = event.getTarget();

    // do something with it, or one of its relative objects...
    var document = placemark.getOwnerDocument();
    var parent = placemark.getParentNode();

    // etc...
  }
}
于 2012-08-14T20:51:20.547 に答える
0

これがあなたが望むものかどうかはわかりませんが、kmltree api があります:

  1. 指定された kml に基づいて kml ツリーを構築します
  2. 「kmlloaded」イベント ハンドラを使用できるようにします

http://code.google.com/p/kmltree/

function initCB(instance){
    ge = instance;
    ge.getWindow().setVisibility(true);

    var gex = gex = new GEarthExtensions(ge);

    var tree = kmltree({
        url: 'http://foo.com/regionatedRoot.kml',
        gex: gex, 
        mapElement: $('#map3d'), 
        element: $('#tree'),
    });

    $(tree).bind('kmlLoaded', function(event, kmlObject){ //do something here });

    tree.load();
}

別のjs APIを導入する必要がありますが、かなりうまく機能し、優れた組み込み機能を提供します。

これまでのところ、kml がロードされたときにイベントを発生させるプラグインだけでは何も見つかりませんでした...

特にリンクの URL をハードコーディングしている場合は、fetchKml() を使用してみてください。

google.earth.fetchKml(ge, 'http://foo.com/regionatedRoot.kml', function(kmlObject){
     //do logic here
});
于 2012-08-08T21:08:33.833 に答える