GIS-LAB

Географические информационные системы и дистанционное зондирование

Выражения в MapServer

Описаны виды выражений, используемых в MapServer для фильтрации данных и классификации объектов.

Обсудить в форуме Комментариев — 1

Введение

Выражения являются одной из наиболее часто используемых в MapServer структур и используются в нескольких целях:

  1. для фильтрации (предложение FILTER) данных в слоях (предложение LAYER) и классах (предложение CLASS)
  2. для определения классов (предложение EXPRESSION в определении класса)
  3. для формирования запросов MapServer (cgi переменная QSTRING, передаваемая в строке адреса)

Выражения MapServer бывают трех видов:

  1. основанные на простом сравнении строк
  2. основанные на регулярных выражениях
  3. основанные на логических выражениях

В основу статьи легла англоязычная документация, доступная на официальной странице Mapserver

Оглавление

  1. Сравнение строк
  2. Регулярные выражения
  3. "Выражения MapServer"
  4. Ссылки на атрибуты в выражениях

1Сравнение строк

Этот тип выражений является наиболее простым: атрибут объекта проверяется на совпадение с заданной строкой. Если вы используете сравнение строк для фильтрации данных некоторого слоя, то необходимо указать предложения 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 не могут начинаться с символов "(" и "/".

2Регулярные выражения

Регулярные выражения - обычный способ сравнения строк, используемый в UNIX. А поскольку MapServer использует для вычисления регулярных выражений процедуры операционной системы, то на разных UNIX-платформах могут быть различия в результатах использовании регулярных выражений. Несмотря на различия, все-таки можно привести часть сведений, представляющую что-то вроде "общего знаменателя".

Итак, регулярные выражения в MapServer работают аналогично сравнению строк, но представляют более широкие возможности. Регулярные выражения работают медленнее, чем простое сравнение строк, но зато они могут быть более быстрыми, чем логические выражения. В зависимости от того, где будут использованы регулярные выражения (FILTER или EXPRESSION), нужно задать значения соответствующего параметра FILTERITEM или CLASSITEM.

Регулярное выражение содержит наряду с обычными символами символы, которые интерпретируются особым образом. Например, если символы русского или латинского алфавитов (А-Я, a-z) или цифры (0-9) воспринимаются при разборе выражения программой-анализатором как обычный символ, то символ точки (.) будет воспринят специальным образом.

Значения специальных символов:

  1. "." Точка означает любой символ (один).
  2. "[" и "]" Используются для группировки. Например, появление в регулярном выражении последовательности [А-Я] подразумевает, что в этом месте может стоять любой из символов А,Б,В,...Э,Ю,Я.
  3. * Любое количество символов
  4. "^" Помечает начало строки.
  5. "$" Помечает конец строки.
  6. "\" Используется для того, чтобы указать, что последующий специальный символ нужно понимать буквально. Например, \$ означает знак доллара.

Пример 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. Отфильтровать те записи, которые содержат только числа или не содержат вообще никаких данных.

FILTER /^[0-9]*$/

3"Выражения MapServer"

Выражения MapServer обладают более широкими возможностями по сравнению с рассмотренными ранее способами фильтрации данных, однако, они являются и более медленными. Такие выражения могут сравнивать несколько атрибутов одновременно и производить фильтрацию или классификацию по этим атрибутам.

Кроме собственно логических выражений, MapServer поддерживает также операции над числовыми и строковыми величинами. Однако, для того, чтобы можно было использовать выражения MapServer в предложениях FILTER или EXPRESSION, необходимо, чтобы выражение в целом имело логическое значение.

Логические выражения

Логические выражения - это выражения, которые могут принимать только два возможных значения - истина или ложь (true или false). В MapServer логическое выражение всегда должно быть заключено в круглые скобки. Логическое выражение может состоять из нескольких других логических выражений. В этом случае используются логические операции, получающие на входе одно логическое выражение и выдающие на выходе другое.

Примеры использования логических операций и выражений:

Логическое "и" (две эквивалентных формы записи) :

( ( ... ) AND ( ... ) )
( ( ... ) && ( ... ) )

будет истинным лишь в том случае, когда истинны оба выражения, входящих в него.

Логическое "или" (две эквивалентных формы записи):

( ( ... ) OR ( ... ) )
( ( ... ) || ( ... ) )

будет истинным лишь в том случае, если истинно хотя бы одно из составляющих его выражений.

Логическое отрицание (две эквивалентных формы записи):

NOT ( ... )
! ( ... )

будет истинным, если ложно выражение в скобках.

Строковые операции

Синтаксически, строка в 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) есть только одна операция, возвращающая сторковое выражение - конкатенация (сложение) строк. Значением выражения

"String1" + "String2"

будет строка

"String1String2"

Операции над числовыми значениями.

Арифметические операции, возвращающие логическое значение.

Здесь все очевидно.

( n1 eq n2 )
( n1 == n2 )
( n1 = n2 )

Вернет истину, если числа равны.

( n1 != n2 )
( n1 ne n2 )

Вернет истину, если числа не равны.

( n1 < n2 )
( n1 lt n2 )

Вернет истину, если первое число меньше второго.

( n1 > n2 )
( n1 gt n2 )

Вернет истину,если первое число больше второго.

( n1 <= n2 )
( n1 le n2 )

Вернет истину, если первое число меньше или равно второму.

( n1 >= n2 )
( n1 ge n2 )

Вернет истину, если перевое число больше или равно второму.

( n1 IN "number1,number2,...,numberN" )

Вернет истину, если n1 равно одному из перечисленных чисел.

Арифметические операции, возвращающие число.

Сумма:

n1 + n2

Разность:

n1 - n2

Произведение:

n1 * n2

Частное:

n1 / n2

Изменение знака:

-n1

Возведение в степень:

n1 ^ n2

вернет n1 в степени n2.

Вычисление длины строки:

length ( "String1" )

вернет число символов в строке String1.

Замечание. Числовые операции могут быть использованы в качестве логических операций по следующему правилу: если результат числовой операции равен нулю, то считается, что выражение вернуло "ложь" при любом ненулевом значении - выражени вернуло "истину".

Пример.

( 6 + 5 )

означает истину, а

( 5 - 5 )

означает ложь.

Выражения над датами и временем.

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 )

4Ссылки на атрибуты в выражениях

При использовании атрибутов в выражениях MapServer, принято следующая номенклатура: название поля (название атрибута) заключается в квадратные скобки, например, [TYPE]. При анализе выражения MapServer вместо названия атрибута подставляет его значение.

Пример. Обычное сравнение строк может быть выполнено следующим образом:

FILTER ( "[TYPE]" == "RING" )

Для растровых слоев доступны следующие специальные атрибуты:

[PIXEL] (при анализе заменится на числовое выражение, представляющее цвет), а также [RED], [GREEN], [BLUE] - цветосоставляющие компоненты.

Обсудить в форуме Комментариев — 1

Последнее обновление: September 09 2021

Дата создания: 04.01.2008
Автор(ы): Дмитрий Колесов