Выражения в MapServer
Описаны виды выражений, используемых в MapServer для фильтрации данных и классификации объектов.
|
Введение
Выражения являются одной из наиболее часто используемых в MapServer структур и используются в нескольких целях:
- для фильтрации (предложение FILTER) данных в слоях (предложение LAYER) и классах (предложение CLASS)
- для определения классов (предложение EXPRESSION в определении класса)
- для формирования запросов MapServer (cgi переменная QSTRING, передаваемая в строке адреса)
Выражения MapServer бывают трех видов:
- основанные на простом сравнении строк
- основанные на регулярных выражениях
- основанные на логических выражениях
В основу статьи легла англоязычная документация, доступная на официальной странице Mapserver
Оглавление
- Сравнение строк
- Регулярные выражения
- "Выражения MapServer"
- Ссылки на атрибуты в выражениях
Сравнение строк
Этот тип выражений является наиболее простым: атрибут объекта проверяется на совпадение с заданной строкой. Если вы используете сравнение строк для фильтрации данных некоторого слоя, то необходимо указать предложения FILTERITEM и FILTER:
FILTER "RING" # отбрасываем все записи, не равные "RING"
FILTERITEM "TYPE" # ищем совпадение с "RING" в поле "TYPE" |
Аналогично с использованием сравнения строк при фильтрации в предложении CLASS - также необходимо указать и FILTERITEM, и FILTER.
Сравнение строк в выражении EXPRESSION:
В предложении LAYER нужно указать поле базы данных, по которому будет производиться поиск, а в определении класса - само выражение EXPRESSION:
LAYER
NAME "RingsRet"
CLASSITEM "TYPE"
...
CLASS
NAME "Rings"
EXPRESSION "RING"
...
END
END |
Замечание: выражения EXPRESSION и FILTER не могут начинаться с символов "(" и "/".
Регулярные выражения
Регулярные выражения - обычный способ сравнения строк, используемый в UNIX. А поскольку MapServer использует для вычисления регулярных выражений процедуры операционной системы, то на разных UNIX-платформах могут быть различия в результатах использовании регулярных выражений. Несмотря на различия, все-таки можно привести часть сведений, представляющую что-то вроде "общего знаменателя".
Итак, регулярные выражения в MapServer работают аналогично сравнению строк, но представляют более широкие возможности. Регулярные выражения работают медленнее, чем простое сравнение строк, но зато они могут быть более быстрыми, чем логические выражения. В зависимости от того, где будут использованы регулярные выражения (FILTER или EXPRESSION), нужно задать значения соответствующего параметра FILTERITEM или CLASSITEM.
Регулярное выражение содержит наряду с обычными символами символы, которые интерпретируются особым образом. Например, если символы русского или латинского алфавитов (А-Я, a-z) или цифры (0-9) воспринимаются при разборе выражения программой-анализатором как обычный символ, то символ точки (.) будет воспринят специальным образом.
Значения специальных символов:
- "." Точка означает любой символ (один).
- "[" и "]" Используются для группировки. Например, появление в регулярном выражении последовательности [А-Я] подразумевает, что в этом месте может стоять любой из символов А,Б,В,...Э,Ю,Я.
- * Любое количество символов
- "^" Помечает начало строки.
- "$" Помечает конец строки.
- "\" Используется для того, чтобы указать, что последующий специальный символ нужно понимать буквально. Например, \$ означает знак доллара.
Пример 1. В следующем слое будут содержаться только те объекты, строковый атрибут которых содержит подстроку "ANSER" в поле NAME , например "ANSER ALBIFRONS".
LAYER
NAME "Anser"
FILTERITEM "NAME"
FILTER /ANSER/
...
END |
Нужно отметить, что регулярные выражения чувствительны к регистру символов, поэтому в слое "Anser" не будут содержаться объекты с атрибутом NAME, равным "anser" (первая буква - не заглавная) .
Пример 2. Отфильтровать те записи, поле "год" которых содержит значения текущего столетия (например, 2007).
FILTERITEM "year"
FILTER /^20[0-9][0-9]/ |
Пример 3. Отфильтровать те записи, которые содержат только числа или не содержат вообще никаких данных.
"Выражения MapServer"
Выражения MapServer обладают более широкими возможностями по сравнению с рассмотренными ранее способами фильтрации данных, однако, они являются и более медленными. Такие выражения могут сравнивать несколько атрибутов одновременно и производить фильтрацию или классификацию по этим атрибутам.
Кроме собственно логических выражений, MapServer поддерживает также операции над числовыми и строковыми величинами. Однако,
для того, чтобы можно было использовать выражения MapServer в предложениях
FILTER или EXPRESSION, необходимо, чтобы выражение в целом имело логическое значение.
Логические выражения
Логические выражения - это выражения, которые могут принимать только два возможных значения - истина или ложь (true или false).
В MapServer логическое выражение всегда должно быть заключено в круглые скобки. Логическое выражение может состоять из нескольких других логических выражений.
В этом случае используются логические операции, получающие на входе одно логическое выражение и выдающие на выходе другое.
Примеры использования логических операций и выражений:
Логическое "и" (две эквивалентных формы записи) :
( ( ... ) AND ( ... ) )
( ( ... ) && ( ... ) ) |
будет истинным лишь в том случае, когда истинны оба выражения, входящих в него.
Логическое "или" (две эквивалентных формы записи):
( ( ... ) OR ( ... ) )
( ( ... ) || ( ... ) ) |
будет истинным лишь в том случае, если истинно хотя бы одно из составляющих его выражений.
Логическое отрицание (две эквивалентных формы записи):
будет истинным, если ложно выражение в скобках.
Строковые операции
Синтаксически, строка в MapServer представляет собой любой набор символов, содержащийся в двойных кавычках.
Строковые операции, возвращающие логическое значение
Равенство строк (три эквивалентных формы записи):
( "String1" eq "String2" )
( "String1" == "String2" )
( "String1" = "String2" ) |
Они вернут истину, если строки равны между собой (совпадают).
Сравнение строк на неравенство (две эквивалентных формы записи):
( "String1" != "String2" )
( "String1" ne "String2" ) |
На выходе - истина, если строки не совпадают.
Сравнение строк:
( "String1" < "String2" )
( "String1" lt "String2" ) |
Вернет истину, если первая строка лексикографически меньше, чем вторая.
( "String1" > "String2" )
( "String1" gt "String2" ) |
Вернет истину, если первая строка лексикографически больше, чем вторая.
( "String1" <= "String2" )
( "String1" le "String2" ) |
Вернет истину, если первая строка не больше второй.
( "String1" >= "String2" )
( "String1" ge "String2" ) |
Вернет истину, если вторая строка не больше первой.
|
( "String1" IN "token1,token2,...,tokenN" )
|
Вернет истину, если String1 совпадает с одним из заданных токенов
(подстрок). Токены отделяются друг от друга запятыми, поэтому нет необходимости
добавлять лишние пробелы. По этой же причине таким способом нельзя сравнивать строки, содержащие запятые.
|
( "String1" =~ /regexp/ )
|
Вернет истину, если String1 совпадает (по шаблону) с регулярным выражением. Эта операция эквивалентна вышеописанной операции сравнения по регулярному выражению.
Строковые операции, возвращающие строковые значения.
На данный момент (MapServer 4.x) есть только одна операция, возвращающая сторковое выражение - конкатенация (сложение) строк. Значением выражения
будет строка
Операции над числовыми значениями.
Арифметические операции, возвращающие логическое значение.
Здесь все очевидно.
( n1 eq n2 )
( n1 == n2 )
( n1 = n2 ) |
Вернет истину, если числа равны.
( n1 != n2 )
( n1 ne n2 ) |
Вернет истину, если числа не равны.
Вернет истину, если первое число меньше второго.
Вернет истину,если первое число больше второго.
( n1 <= n2 )
( n1 le n2 ) |
Вернет истину, если первое число меньше или равно второму.
( n1 >= n2 )
( n1 ge n2 ) |
Вернет истину, если перевое число больше или равно второму.
|
( n1 IN "number1,number2,...,numberN" )
|
Вернет истину, если n1 равно одному из перечисленных чисел.
Арифметические операции, возвращающие число.
Сумма:
Разность:
Произведение:
Частное:
Изменение знака:
Возведение в степень:
вернет n1 в степени n2.
Вычисление длины строки:
вернет число символов в строке String1.
Замечание. Числовые операции могут быть использованы в качестве логических операций по следующему правилу: если результат числовой операции равен нулю, то считается, что выражение вернуло "ложь" при любом ненулевом значении - выражени вернуло "истину".
Пример.
означает истину, а
означает ложь.
Выражения над датами и временем.
MapServer для сравнения дат и времени использует свой внутренний формат. Чтобы выполнить преобразование в этот формат, MapServer пытается сравнить вид полученного значения с видом из следующего списка, просматривая список сверху вниз. В случае совпадения, производится преобразование:
YYYY-MM-DDTHH:MM:SSZ
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DD HH:MM:SS
YYYY-MM-DDTHH:MM
YYYY-MM-DD HH:MM
YYYY-MM-DDTHH
YYYY-MM-DD HH
YYYY-MM-DD
YYYY-MM
YYYY
THH:MM:SSZ
THH:MM:SS |
Для преобразованных во внутренний формат значений времени (даты) возможны следующие операции, которые аналогичны операциям, рассмотренным выше:
1)
( n1 eq n2 )
( n1 == n2 )
( n1 = n2 )
2)
( t1 != t2 )
( t1 ne t2 )
3)
( n1 < n2 )
( n1 lt n2 )
4)
( n1 > n2 )
( n1 gt n2 )
5)
( t1 <= t2 )
( t1 le t2 )
6)
( n1 >= n2 )
( n1 ge n2 ) |
Ссылки на атрибуты в выражениях
При использовании атрибутов в выражениях MapServer, принято следующая номенклатура: название поля (название атрибута) заключается в квадратные скобки, например, [TYPE]. При анализе выражения MapServer вместо названия атрибута подставляет его значение.
Пример. Обычное сравнение строк может быть выполнено следующим образом:
| FILTER ( "[TYPE]" == "RING" ) |
Для растровых слоев доступны следующие специальные атрибуты:
[PIXEL] (при анализе заменится на числовое выражение, представляющее цвет), а также [RED], [GREEN], [BLUE] - цветосоставляющие компоненты.
Обсудить в форуме (Комментариев - 0)
См. также:
Создание картографических сервисов с использованием MapServer. Введение >>>
Установка MapServer для Windows >>>
Начало работы с MapServer >>>
|
Последнее обновление: January 24 2008 (Наверх) |