リージョンベースのネットワークリンクの階層を使用して提供される多くの大きな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アプリがその信号機のセットの統計をロードし、サイドバーに表示するようにします。
これをどのように設計しますか?