1

Google Earth を使用して、米国内のすべての郡のポリゴンを表示する kml レイヤーをロードしました。クリックすると、州に関する関連情報 (名前、州、地域など) が表示されたバルーン ポップアップが表示されます。

これはこれまでの私のコードです。

var ge;
google.load("earth", "1");

function init() {
    google.earth.createInstance('map3d', initCB, failureCB);
}

function initCB(instance) {
    ge = instance;
    ge.getWindow().setVisibility(true);
    ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
    ge.getNavigationControl().setStreetViewEnabled(true);
    ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, true);

    //here is where im loading the kml file 
    google.earth.fetchKml(ge, href, function (kmlObject) {
        if (kmlObject) {
            // show it on Earth
            ge.getFeatures().appendChild(kmlObject);
        } else {
            setTimeout(function () {
                alert('Bad or null KML.');
            }, 0);
        }
    });

    function recordEvent(event) {
        alert("click");
    }

    // Listen to the mousemove event on the globe.
    google.earth.addEventListener(ge.getGlobe(), 'click', recordEvent);
}

function failureCB(errorCode) {}

google.setOnLoadCallback(init);

私の問題は、ge.getGlobe()kmlObject に変更した場合、またはge.getFeatures()機能しないことです。

私の最初の質問は、ユーザーが kml レイヤーのポリゴンをクリックしたときにクリック リスナーを取得できるようにするには、ge.getGlobe() を何に変更すればよいですか?

その後、ポリゴンのバルーン情報を使用getDescription()または取得することを計画していました。getBalloonHtml()私は正しい軌道に乗っていますか?

4

2 に答える 2

1

... ge.getGlobe() を何に変更すればよいですか...

イベント オブジェクトを から変更する必要はありませんGEGlobe。実際、これを使用してすべてのイベントをキャプチャし、ハンドラーでターゲット オブジェクトをチェックできるため、これが最適なオプションです。つまり、API で 1 つのイベント リスナーを設定するだけで済みます。

もう 1 つのオプションは、何らかの方法で KML を解析し、特定のイベント ハンドラーを特定のオブジェクトにアタッチすることです。つまり、オブジェクトごとにイベント リスナーを作成する必要があります。

私は正しい軌道に乗っていますか?

そうです、あなたは正しい軌道に乗っています。GEGlobe一般的なイベント リスナーは保持しますが、関心のrecordEventある KML オブジェクトのタイプをチェックするようにメソッドを拡張します。要素など)。<Polygon><Placemarks>

単純なケースでは、ポリゴンが目印にある場合は、次のようにするだけです。基本的に、すべてのオブジェクトのクリックをリッスンし、すべての Placmark (API を介して作成されるか、KML を介して読み込まれる) をフィルタリングします。

function recordEvent(event) {
  var target = event.getTarget();
  var type = target.getType();
  if(type == "KmlPolygon") {
  } else if(type == "KmlPlacemark") {
    // get the data you want from the target.
    var description = target.getDescription();
    var balloon = target.getBalloonHtml();
  } else if(type == "KmlLineString") {
    //etc...
  }
};

google.earth.addEventListener(ge.getGlobe(), 'click', recordEvent);

他のオプションを選択したい場合は、KML Dom がロードされたら反復処理し、特定のオブジェクトにイベントを追加します。kmldomwalk.jsなどを使用してこれを行うことができます。ここでは、API で多数のイベント リスナー (この場合は Placemark ごとに 1 つ) を作成するため、このアプローチはあまりお勧めしません。利点は、イベントが kml ファイルの各特定のオブジェクトに関連付けられていることです。そのため、同じ「クリック」動作を行うべきではない他のプレイマークなどがある場合は、便利です。

function placeMarkClick(event) { 
  var target = event.getTarget();
  // get the data you want from the target.
  var description = target.getDescription();
  var balloon = target.getBalloonHtml();
}

google.earth.fetchKml(ge, href, function (kml) {
    if (kml) {
        parseKml(kml);
    } else {
        setTimeout(function () {
            alert('Bad or null KML.');
        }, 0);
    }
});

function parseKml(kml) {
    ge.getFeatures().appendChild(kml);
    walkKmlDom(kml, function () {
        var type = this.getType();
        if (type == 'KmlPlacemark') {
          // add event listener to `this`
          google.earth.addEventListener(this, 'click', placeMarkClick);
        }
    });
};
于 2013-07-27T23:26:12.593 に答える
0

私はこれに取り組んで以来、長い間..しかし、私はあなたを助けるか、あなたにいくつかのトラックを与えることができます...

「google.earth.addEventListener(ge.getGlobe(), 'click', recordEvent);」に関するご質問について ge.getGlobe を ge.getFeatures() に置き換えることはできません: ドキュメント ( https://developers.google.com/earth/documentation/reference/interface_g_e_feature_container-members ) を参照すると、GEFeatureContainer (の出力タイプ) getFeatures() 、クリックイベントが定義されていません!

ge.getGlobe が kmlObject に置き換えられました: ここに kmlObject はありますか??

getDescription の使用について、getTarget、getCurrentTarget ... ( https://developers.google.com/earth/documentation/reference/interface_kml_event )をご覧ください。

私が言ったように、私は長い間これを扱っていません..だから、これがあなたの助けになるかどうかはわかりませんが、少なくとも、あなたが見ることができる最初のトラックです!

話の進み次第、私に知らせてください!:-)

于 2013-07-26T09:12:54.610 に答える