Метод
OpenLayers.Map.getBy позволяет осуществлять выборку объектов, удовлетворяющих определенным условиям. Сигнатура использования данной функции имеет следующий вид:
где
array - имя свойства объекта OpenLayers.Map, содержащий некий массив объектов среди которых будет осуществляться поиск, например, это может быть массив слоев (свойство
layers) или контролов (свойство
controls),
property - свойство выбранного объекта (например,
name для слоев или
displayClass для контролов),
match - значение выбранного свойства. Рассмотрим на данном
примере. Если открыть консоль и набрать:
то мы получим массив из двух объектов, то есть объект OpenLayers.Map содержит 2 слоя. Выберем слой по имени:
Код: Выделить всё
map.getBy("layers", "name", "OpenStreetMap")
в результате выполнения данной команды мы получим массив, состоящий из 1 элемента - слоя, удовлетворяющего заданным критериям отбора. Выглядит всё просто, но это только в том случае, если значение свойства исследуемого объекта представлено примитивным типом, например, строкой или числом.
А как выбрать все объекты в случае, если значение исследуемого свойства представлено, например, в виде объекта? Откройте пример
Basic Single WMS Example и перейдите в консоль. Наберите
вы увидите, что карта содержит 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.