2012-01-12 2 views
12

В настоящее время я ищу решение для выбора (или выделения) вектора в OpenLayers.Layer.Vector.Как выбрать функцию программно на векторном уровне в OpenLayers?

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

я узнал, что я либо нужен OpenLayers.Control.ModifyFeature «s selectFeature(feature) функции или OpenLayers.Control.SelectFeature (см dev.openlayers.org/apidocs/files/OpenLayers/Control/SelectFeature-js.html's функции выбора (функция) (который, вероятно, не существует или больше не существует?). См. сообщение из списка рассылки: osgeo-org.1803224.n2.nabble.com/Programatically-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; 
    } 
    } 
} 

ответ

20

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

Таким образом, создать контроль SelectFeature:

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

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

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. 

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

this.vlayer.events.on({'featureselected': function(){ 
    //Handle select event 
}}); 
+1

Спасибо за ваш ответ это работало для меня! Я узнал, что OpenLayers API Doc в текущей версии не работает (и не было метода 'select'). Вот работа [ссылка на API OpenLayers] (http://dev.openlayers.org/docs/files/OpenLayers/Control/SelectFeature-js.html#OpenLayers.Control.SelectFeature.select) –

+4

Мой совет на будущее тоже посмотрите на исходный код openlayers вместо документов. легко найти то, что вам нужно, и вы сможете лучше понять, как все работает. вы часто найдете ценные комментарии в исходном коде, которые вы не увидите в документах. – igorti

+4

обратите внимание, что вам нужно будет добавить элемент «selectFeature» на карту, прежде чем вы сможете активировать ее. Map.addControl (selectFeature); – JSancho

 Смежные вопросы

  • Нет связанных вопросов^_^