OpenLayers: пример работы с контролом ModifyFeature

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3368
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 514
Ваше звание: Author
Контактная информация:

OpenLayers: пример работы с контролом ModifyFeature

Сообщение Denis Rykov » 11 фев 2011, 23:57

Рассмотрим несколько специфичный пример использования контрола 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.

Ответить

Вернуться в «Рецепты»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость