OpenLayers: OpenLayers.Map.getBy

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

OpenLayers: OpenLayers.Map.getBy

Сообщение Denis Rykov » 08 авг 2013, 07:46

Метод OpenLayers.Map.getBy позволяет осуществлять выборку объектов, удовлетворяющих определенным условиям. Сигнатура использования данной функции имеет следующий вид:

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

getBy: function(array, property, match)
где array - имя свойства объекта OpenLayers.Map, содержащий некий массив объектов среди которых будет осуществляться поиск, например, это может быть массив слоев (свойство layers) или контролов (свойство controls), property - свойство выбранного объекта (например, name для слоев или displayClass для контролов), match - значение выбранного свойства. Рассмотрим на данном примере. Если открыть консоль и набрать:

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

map.layers
то мы получим массив из двух объектов, то есть объект OpenLayers.Map содержит 2 слоя. Выберем слой по имени:

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

map.getBy("layers", "name", "OpenStreetMap")
в результате выполнения данной команды мы получим массив, состоящий из 1 элемента - слоя, удовлетворяющего заданным критериям отбора. Выглядит всё просто, но это только в том случае, если значение свойства исследуемого объекта представлено примитивным типом, например, строкой или числом.

А как выбрать все объекты в случае, если значение исследуемого свойства представлено, например, в виде объекта? Откройте пример Basic Single WMS Example и перейдите в консоль. Наберите

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

map.layers
вы увидите, что карта содержит 1 слой среди свойств которого есть свойство params представляющее собой объект:

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

params: Object
    FORMAT: "image/jpeg"
    LAYERS: "basic"
    REQUEST: "GetMap"
    SERVICE: "WMS"
    SRS: "EPSG:4326"
    STYLES: ""
    VERSION: "1.1.1"
И, предположим, что нам нужно выбрать все слои для которых значение свойства LAYERS объекта params содержит подстроку "basic" (другими словами, мы хотим выбрать все WMS слои OpenLayers, содержащие в себе слой "basic" WMS-сервиса). В этом случае прежний синтаксис функции getBy не работает, то есть мы не можем написать просто:

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

map.getBy("layers", "params.LAYERS", "basic")
потому что у слоя нет свойства "params.LAYERS". В данном случае вторым параметром функции getBy мы должны указать имя исследуемого свойства слоя, то есть params, а в качестве третьего параметра - объект, содержащий один единственный метод test (согласно документации OpenLayers), суть которого заключается в следующем: берется каждый объект из массива (первый параметр функции getBy), извлекается его исследуемое свойство (второй параметр функции getBy) и передается в функцию test (являющуюся одним единственным методом объекта, передаваемого в качестве третьего параметра функции getBy). И если функция getBy возвращает true, то объект признается как удовлетворяющий условию отбора, если false - то нет. Таким образом, исходная задача решается следующим образом:

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

test = function(item) {
    return item ? (item['LAYERS'].search('basic') !== -1 ? true : false) : false;
}
map.getBy("layers", "params", {test: test});
Одна небольшая проблема с данным кодом заключается в том, что имя свойства ('basic') захардкожено внутри функции, исправим это путём использования замыкания:

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

test = function(value, item) {
    return function(item) {
        return item ? (item['LAYERS'].search(value) !== -1 ? true : false) : false;
    }
}
map.getBy("layers", "params", {test: test("basic")})
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

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