OpenLayers: DrawFeature контрол для набора слоёв

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

OpenLayers: DrawFeature контрол для набора слоёв

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

Код: Выделить всё

OpenLayers.Control.DrawFeature
Parameters
    layer	  {OpenLayers.Layer.Vector}
    handler	{OpenLayers.Handler}
    options	{Object}
Контрол OpenLayers.Control.DrawFeature, как и многие другие в OpenLayers способен работать только с одним слоем. Но что делать, если слоёв несколько и в каждом нужна возможность создания новых объектов? Тут видится минимум два подхода. Первый - создавать новый контрол для активного слоя (в котором добавляется объект), а при смене слоя - удалять его (с помощью метода destroy()) и создавать заново, передавая в качестве параметра активный слой. И второй - создать контрол для каждого слоя и при смене активного слоя - активировать нужный контрол, блокируя все остальные.

Рассмотрим второй подход. Важно заметить, что при создании рассматриваемого контрола обязательным параметром является объект класса OpenLayers.Handler, именно он отвечает за то, какого типа геометрия будет рисоваться данным контролом. Поскольку в OpenLayers нет функции определения типа геометрий слоя, то как будет показано дальше - удобным оказывается самостоятельное указание типа геометрии слоя при его создании. Сразу же предостерегаю от использования свойства geometryType слоя для хранения такой информации. Допустим, вы указали значение этого поля - OpenLayers.Geometry.Polygon, тем самым ограничив допустимые типы геометрий. В этом случае, например, если вдруг понадобится воспользоваться контролом OpenLayers.Control.ModifyFeature в режиме DRAG - то вы не сможете этого сделать. Этот режим подразумевает создание некоего временного вертекса (точки) в активном слое за который можно двигать объект, но поскольку тип допустимых геометрий ограничен только полигонами - это привдёт к ошибке. Поэтому для передачи инфомации о типе геометрии слоя удобней оказывается использовать свойство metadata слоя. Например:

Код: Выделить всё

metadata: {gType: 'Polygon'}
или

Код: Выделить всё

metadata: {gType: 'Point'}
Переходим к созданию контролов для всех слоёв карты (объект map):

Код: Выделить всё

map.getLayersByClass('OpenLayers.Layer.Vector').forEach(function(layer) {
    if (layer.metadata.gType == 'Point') {
        map.addControl(new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Point))
    }
    else if (layer.metadata.gType == 'Polygon') {
        map.addControl(new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Polygon))
    }
})
Пусть активный в настоящий момент слой - selectedLayer, тогда включаем его контрол и отключаем все остальные:

Код: Выделить всё

map.getControlsByClass('OpenLayers.Control.DrawFeature').forEach(function(control) {
    if (control.layer == selectedLayer) {
        control.activate();
    }
    else {
        control.deactivate();
    }
})
После чего добавляем в активный слой объекты соответствующего типа, указанного при конфигурировании контрола.
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

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

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

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