Рассмотрим несколько специфичный пример использования контрола ModifyFeature (в режиме standalone), позволяющего модифицировать объекты векторного слоя. Полная логика рассматриваемого приложения такая: выбираем из списка нужный слой, после чего открывается список объектов этого слоя, затем кликаем на одной из записи этого списка - соответствующий объект подсвечивается на карте и становится доступным для модифицирования, в то время как остальные объекты остаются невыделенными и недоступными для моифицирования.
При использовании режима standalone становится невозможным выделять объекты на карте и делать их доступными для редактирования по щелчку мыши, что нам и нужно (так как эта операция должна выполняться программно при выборе нужного объекта из таблицы).
Создаем контрол ModifyFeature для каждого слоя карты:
Код: Выделить всё
map.getLayersByClass('OpenLayers.Layer.Vector').forEach(function(layer) {
map.addControl(new OpenLayers.Control.ModifyFeature(layer, {standalone: true}))
})
Создаем один контрол SelectFeature, с помощью которого будем визуально выделять выбранные объекты на карте:
Код: Выделить всё
ctrlSelectFeature = new OpenLayers.Control.SelectFeature();
Дальше будем следовать вышеописанной логике программы. При выборе некоторого слоя из списка мы должны снять подсветку выделенного на предыдущем шаге объекта и удалит его из доступных для редактирования. Выполним это с помощью самостоятельно написанной функции unselectFeature(), рассмотренной ниже. Кроме этого нам нужно активировать контрол, соответствующий активному слою и, собственно, сделать выбранный слой видимым, остальные - скрыть. Не будем вдаваться в реализацию, а просто будем считать, что активный видимый слой определен - пусть это будет слой selectedLayer. Активируем нужный контрол:
Код: Выделить всё
unselectFeature();
map.getControlsByClass('OpenLayers.Control.ModifyFeature').forEach(function(control) {
if (control.layer == selectedLayer) {
control.activate();
}
else {
control.deactivate();
}
});
Итак, нужный контрол активирован, ненужное выделение снято. Далее выбираем из списка объект (назовём его selectedFeature, на практике его можно получить, используя метод слоя getFeatureByFid). При переключении между объектам в пределах выбранного слоя нужно также снимать выделение с предыдущего объекта и удалять его из доступного для редактирования, как было сказано ранее для этого используется функция unselectFeature():
Код: Выделить всё
unselectFeature();
ctrlSelectFeature.select(selectedFeature); //Визуальное выделение выбранного объекта
map.getControlsByClass('OpenLayers.Control.ModifyFeature').forEach(function(control) {
if (control.active == true) {
control.selectFeature(selectedFeature); //Отметка объекта, как доступного для редактирования
}
Функция unselectFeature():
Код: Выделить всё
function unselectFeature() {
map.getControlsByClass('OpenLayers.Control.ModifyFeature').forEach(function(control) {
if ((control.active == true) && (control.feature)) {
ctrlSelectFeature.unselect(control.feature); //Снятие визуального выделения
control.unselectFeature(control.feature); //Удаление объекта из доступных для редактирования
}
})
}
Spatial is now, more than ever, just another column- The Geometry Column.