0

我有作为 GeoJSON 的纬度/经度数据,每个点都有与之关联的附加属性。我需要能够在KmlPlacemark单击时将这些属性传递给回调函数。我知道我可以使用闭包并在它们上单独注册事件侦听器,但我真的更喜欢在GEWindow对象上只有一个侦听器。

我的解决方案涉及将属性作为 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 回答