0

私はGeoJSONとしてLat/Lonデータを受け取り、各ポイントには追加のプロパティが関連付けられています。KmlPlacemarkがクリックされたときに、これらのプロパティをコールバック関数に渡せるようにする必要があります。クロージャを使用して、イベントリスナーを個別に登録できることはわかっていますが、GEWindowオブジェクトにリスナーを1つだけ配置することをお勧めします。

私の解決策は、プロパティをJSONデータとして目印IDに貼り付けることです。

var data = {foo: 123, bar: 321};
var placemark = ge.createPlacemark(JSON.stringify(data));

次に、コールバックで解析されてオブジェクトに戻されます

google.earth.addEventListener(ge.getWindow(), 'click', function(e){
  var target = e.getTarget(),
      data;
  if (target && target.getType() == 'KmlPlacemark'){
    data = JSON.parse(target.getId());
    myHandler(target, data);
  }
});

これを行うためのよりハッキーな方法はありますか?

4

1 に答える 1

0

満足している解決策を見つけました。目印には増分IDを使用し、IDをキーとして使用してプロパティをオブジェクトに格納します。

ダミーデータ

var pointData = [
  {lat: 123, lon: 123, properties: {foo: 1, bar: 2}},
  {lat: 123, lon: 123, properties: {foo: 1, bar: 2}},
  {lat: 123, lon: 123, properties: {foo: 1, bar: 2}}
];

目印を作成する

var properties = {},
    currentId = 0;

pointData.forEach(function(point){

  var id        = (currentId++).toString();
      point     = ge.createPoint(''),
      placemark = ge.createPlacemark(id);

  point.setLatitude(point.lat);
  point.setLongitude(point.lon);
  placemark.setGeometry(point);

  properties[id] = point.properties;
});

イベントハンドラーのルックアッププロパティ

google.earth.addEventListener(ge.getWindow(), 'click', function(e){
  var target = e.getTarget(),
      data;
  if (target && target.getType() == 'KmlPlacemark'){
    data = properties[target.getId()];
    myHandler(target, data);
  }
});
于 2012-09-11T17:42:51.690 に答える