Как программно выбрать объект на векторном слое в OpenLayers? - PullRequest
12 голосов
/ 12 января 2012

В настоящее время я ищу решение для выбора (или выделения) вектора в OpenLayers.Layer.Vector.

Я создал простую таблицу, в которой пользователь может выбрать вектор (заданный какСтрока в формате WKT), которая должна выделить соответствующий вектор на слое.Все векторы в таблице сетки отображаются в векторном слое на карте, когда пользователь посещает сайт.

Я обнаружил, что мне либо нужны OpenLayers.Control.ModifyFeature . selectFeature (функция) функция или OpenLayers.Control.SelectFeature (см. Dev.openlayers.org/apidocs/files/OpenLayers/Control/SelectFeature-js.html функция выбора (функция) (которая, вероятно, не существует)или больше не существует?). Для получения дополнительной информации см. сообщение из списка рассылки: osgeo-org.1803224.n2.nabble.com/Programatics-Select-a-Feature-tt2192485.html#a2193928.

Я попробовал следующее безуспешно, поэтому я надеюсь, что кто-нибудь сможет получить эти строки кода и показать мне рабочий фрагмент кода; -)

// ... some initializing code
this.vlayer = new OpenLayers.Layer.Vector("VectorLayer");  // VectorLayer

// some controls
this.openLayerControlPoint = new OpenLayers.Control.DrawFeature(this.vlayer, OpenLayers.Handler.Point);
this.openLayerControlPolygon = new OpenLayers.Control.DrawFeature(this.vlayer, OpenLayers.Handler.Polygon);
this.openLayerControlModify = new OpenLayers.Control.ModifyFeature(this.vlayer, {
  mode: OpenLayers.Control.ModifyFeature.RESHAPE | OpenLayers.Control.ModifyFeature.DRAG,
  standalone: false
});

// just deactivate to make sure everything is really deactivated
this.openLayerControlPoint.deactivate();
this.openLayerControlPolygon.deactivate();
this.openLayerControlModify.deactivate();

// add the just created layer to the map
this.map.addLayer(this.vlayer);

// add all (deactivated) controls to the map
this.map.addControl(this.openLayerControlPoint);
this.map.addControl(this.openLayerControlPolygon);
this.map.addControl(this.openLayerControlModify);

Позже в коде:

// ... another function doing the action
selectVector: function(wktVector) {
  this.openLayerControlModify.activate();

  // this is no elegant solution, this should only show how I would 
  // test the functionallity.
  for (var i = 0; i < this.vlayer.features.length; ++i) {
    // returns a WKT formatted string: 
    // 'POLYGON((xxxx.xxx xxxx.xxx), (xxxx.xxx xxxx.xxx))'
    var wktVectorCurrent = this.vlayer.features[i].geometry.toString(); 
    if (wktVector == wktVectorCurrent) {
      // \/ doesn't work :-(
      this.openLayerControlModify.selectFeature(this.vlayer.features[i]);
      break;
    }
  }
}

1 Ответ

20 голосов
/ 12 января 2012

Я не понимаю, почему вы используете ModifyFeature для выбора функции. OpenLayers.Control.SelectFeature специально предназначен для выбора функций, поэтому я предлагаю вместо этого использовать этот элемент управления.

Итак, создайте элемент управления SelectFeature:

var selectFeature = new OpenLayers.Control.SelectFeature(this.vlayer);
selectFeature.activate();

Тогда в вашем операторе if (я полагаю, он работает, чтобы найти объект, который вы хотите выбрать, сравнивая геометрии?) Используйте метод select:

if (wktVector == wktVectorCurrent) {
   selectFeature.select(this.vlayer.features[i]);
}

В соответствии с документацией этот метод должен пометить объект как выбранный и вызвать соответствующие события:

 * Method: select
 * Add feature to the layer's selectedFeature array, render the feature as
 * selected, and call the onSelect function.

Если вы хотите что-то сделать на карте при выборе объекта (например, показ всплывающего окна), вы должны подписать векторный слой на select-событие, когда вы создаете его:

this.vlayer.events.on({'featureselected': function(){
   //Handle select event
}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...