Описаны виды выражений, используемых в MapServer для фильтрации данных и классификации объектов.
Обсудить в форуме Комментариев 1
Введение
Выражения являются одной из наиболее часто используемых в MapServer структур и используются в нескольких целях:
Выражения MapServer бывают трех видов:
В основу статьи легла англоязычная документация, доступная на официальной странице Mapserver
Оглавление
Этот тип выражений является наиболее простым: атрибут объекта проверяется на совпадение с заданной строкой. Если вы используете сравнение строк для фильтрации данных некоторого слоя, то необходимо указать предложения FILTERITEM и FILTER:
Аналогично с использованием сравнения строк при фильтрации в предложении 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).
Пример 3. Отфильтровать те записи, которые содержат только числа или не содержат вообще никаких данных.
Выражения MapServer обладают более широкими возможностями по сравнению с рассмотренными ранее способами фильтрации данных, однако, они являются и более медленными. Такие выражения могут сравнивать несколько атрибутов одновременно и производить фильтрацию или классификацию по этим атрибутам.
Кроме собственно логических выражений, MapServer поддерживает также операции над числовыми и строковыми величинами. Однако, для того, чтобы можно было использовать выражения MapServer в предложениях FILTER или EXPRESSION, необходимо, чтобы выражение в целом имело логическое значение.
Логические выражения
Логические выражения - это выражения, которые могут принимать только два возможных значения - истина или ложь (true или false). В MapServer логическое выражение всегда должно быть заключено в круглые скобки. Логическое выражение может состоять из нескольких других логических выражений. В этом случае используются логические операции, получающие на входе одно логическое выражение и выдающие на выходе другое.
Примеры использования логических операций и выражений:
Логическое "и" (две эквивалентных формы записи) :
будет истинным лишь в том случае, когда истинны оба выражения, входящих в него.
Логическое "или" (две эквивалентных формы записи):
будет истинным лишь в том случае, если истинно хотя бы одно из составляющих его выражений.
Логическое отрицание (две эквивалентных формы записи):
будет истинным, если ложно выражение в скобках.
Строковые операции
Синтаксически, строка в MapServer представляет собой любой набор символов, содержащийся в двойных кавычках.
Строковые операции, возвращающие логическое значение
Равенство строк (три эквивалентных формы записи):
Они вернут истину, если строки равны между собой (совпадают).
Сравнение строк на неравенство (две эквивалентных формы записи):
На выходе - истина, если строки не совпадают.
Сравнение строк:
Вернет истину, если первая строка лексикографически меньше, чем вторая.
Вернет истину, если первая строка лексикографически больше, чем вторая.
Вернет истину, если первая строка не больше второй.
Вернет истину, если вторая строка не больше первой.
Вернет истину, если String1 совпадает с одним из заданных токенов (подстрок). Токены отделяются друг от друга запятыми, поэтому нет необходимости добавлять лишние пробелы. По этой же причине таким способом нельзя сравнивать строки, содержащие запятые.
Вернет истину, если String1 совпадает (по шаблону) с регулярным выражением. Эта операция эквивалентна вышеописанной операции сравнения по регулярному выражению.
Строковые операции, возвращающие строковые значения.
На данный момент (MapServer 4.x) есть только одна операция, возвращающая сторковое выражение - конкатенация (сложение) строк. Значением выражения
будет строка
Операции над числовыми значениями.
Арифметические операции, возвращающие логическое значение.
Здесь все очевидно.
Вернет истину, если числа равны.
Вернет истину, если числа не равны.
Вернет истину, если первое число меньше второго.
Вернет истину,если первое число больше второго.
Вернет истину, если первое число меньше или равно второму.
Вернет истину, если перевое число больше или равно второму.
Вернет истину, если n1 равно одному из перечисленных чисел.
Арифметические операции, возвращающие число.
Сумма:
Разность:
Произведение:
Частное:
Изменение знака:
Возведение в степень:
вернет n1 в степени n2.
Вычисление длины строки:
вернет число символов в строке String1.
Замечание. Числовые операции могут быть использованы в качестве логических операций по следующему правилу: если результат числовой операции равен нулю, то считается, что выражение вернуло "ложь" при любом ненулевом значении - выражени вернуло "истину".
Пример.
означает истину, а
означает ложь.
Выражения над датами и временем.
MapServer для сравнения дат и времени использует свой внутренний формат. Чтобы выполнить преобразование в этот формат, MapServer пытается сравнить вид полученного значения с видом из следующего списка, просматривая список сверху вниз. В случае совпадения, производится преобразование:
Для преобразованных во внутренний формат значений времени (даты) возможны следующие операции, которые аналогичны операциям, рассмотренным выше:
Ссылки на атрибуты в выражениях
При использовании атрибутов в выражениях MapServer, принято следующая номенклатура: название поля (название атрибута) заключается в квадратные скобки, например, [TYPE]. При анализе выражения MapServer вместо названия атрибута подставляет его значение.
Пример. Обычное сравнение строк может быть выполнено следующим образом:
Для растровых слоев доступны следующие специальные атрибуты:
[PIXEL] (при анализе заменится на числовое выражение, представляющее цвет), а также [RED], [GREEN], [BLUE] - цветосоставляющие компоненты.
Обсудить в форуме Комментариев 1
Последнее обновление: September 09 2021
Дата создания: 04.01.2008
Автор(ы): Дмитрий Колесов
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).