<<< предыдущая глава | оглавление | следующая глава >>>
Mapserver - картографический веб-сервер, который поддерживает спецификацию OpenGIS Web Mapping Server.
Для использования PostGIS с Mapserver, вы должны знать, как конфигурировать Mapserver, это выходит за рамки данной документации. В этом разделе описывается специфика использования PostGIS и детали конфигурирования.
Для использования PostGIS с Mapserver вам понадобятся:
Mapserver получает доступ к данным PostGIS/PostgreSQL, как и любой другой клиент PostgreSQL, с помощью libpq. Это означает, что Mapserver может быть установлен на любую машину с сетевым доступом к серверу PostGIS, если только в системе есть клиентские библиотеки PostgreSQL libpq.
LAYER
CONNECTIONTYPE postgis
NAME "widehighways"
# Соединение с удаленной пространственной базой данных
CONNECTION "user=dbuser dbname=gisdatabase host=bigserver"
# Получение линий из столбца 'geom' таблицы 'roads'
DATA "geom from roads"
STATUS ON
TYPE LINE
# Из имеющихся линий выбрать только широкие дороги
FILTER "type = 'highway' and numlanes >= 4"
CLASS
# Супермагистрали сделать более яркими и установить их ширину в 2 пикселя
EXPRESSION ([numlanes] >= 6)
COLOR 255 22 22
SYMBOL "solid"
SIZE 2
END
CLASS
# Все остальные - более темные и широной в 1 пиксель
EXPRESSION ([numlanes] < 6)
COLOR 205 92 82
END
END
Приведенный пример содержит следующие специфические директивы относящиеся к PostGIS:
user=<имя пользователя> password=<пароль> dbname=<имя базы> hostname=<имя сервера> port=<5432>
Пустая строка коннекта считается валидной, а любая пара ключ/значение может быть опущена. Как минимум вы должны указать имя базы и имя пользователя для соединения с ней.
CREATE INDEX [имя_индекса] ON [имя_таблицы] USING GIST ( [столбец_геометрии] );
При запросах Mapserver требует уникальные идентификаторы для каждого пространственного объекта и модуль Mapserver PostGIS использует значения oid PostgreSQL в качестве таких идентификаторов. Побочным эффектом этого является то, что для быстрого доступа к произвольной записи в запросе требуется индекс по oid.
Для создания "индекса oid" используйте следующий запрос SQL:
CREATE INDEX [имя_индекса] ON [имя_таблицы] ( oid );
Функция USING предложений псевдо-SQL используется для того, чтобы предоставить MapServer некоторую информацию, которая поможет ему понять результаты более сложных запросов. Более конкретно: если вид или вложенный SELECT используются в качестве исходной таблицы (справа от "FROM" в определении DATA), то mapserver затруднительно автоматически определить уникальный идентификатор для каждой строки и SRID для таблицы. Функция USING может предоставить эту информацию MapServer следующим образом:
DATA "the_geom FROM (
SELECT
table1.the_geom AS the_geom,
table1.oid AS oid,
table2.data AS data
FROM table1
LEFT JOIN table2
ON table1.id = table2.id
) AS new_table USING UNIQUE oid USING SRID=-1"
Mapserver требует уникального идентификатора для каждой строки, чтобы определить строку при создании карты запроса. Он, как правило, использует oid в качастве уникального идентификатора, но вилы и вложенные SELECT не имеют автоматически создаваемого столбца oid. Если нужно использовать функциональность запросов Mapserver, вам следует добавлять уникальные столбцы в свои виды и вложенные SELECT, и объявлять их в USING UNIQUE. Для этого вы можете, например, выбрать oid одной из таблиц, или любой другой столбец, который будет гарантированно уникальным в результирующем множестве.
Когда вы создаете карту запросов, предложение USING может быть полезным также и для простых предложений DATA. Ранее было рекомендовано создавать в используемых таблицах индекс по столбцу oid для ускорения выполнения карты запросов. Но с помощью пункта USING можно указать Mapserver-у использовать первичный ключ вашей таблицы в качестве идентификатора для карты запросов, и тогда отпадает необходимость создавать дополнительный индекс.
"Запрос карты" ("Querying a Map") - действие, возникающее при щелчке на карту для запроса информации о данном месте. Не следует путать его с "картой запроса" для SQL-запроса в определении DATA.
Чтобы вернуть Mapserver правильные данные, PostGIS должен знать, какая пространственная ссылочная система исопльзуется в геометриях. Обычно, эту информацию можно найти в базе данных PostGIS в таблице "geometry_columns", однако, это невозможно для таблиц, создающихся "на лету" вложенными SELECT и видами. Поэтому лучше использовать опцию USING SRID=, которая позволяет указывать корректный SRID в определении DATA.
Парсер Mapserver для слоев PostGIS довольно примитивен и в некоторых местах является чувствительным к регистру. Проследите, чтобы все ключевые слова SQL и все ваши пункты USING были в верхнем регистре, а также, чтобы пункт USING UNIQUE предшествовал пункту USING SRID.
Давайте начнем с простого примера работы с описанными выше таблицами. Рассмотрим следующее определение слоя Mapserver:
LAYER
CONNECTIONTYPE postgis
NAME "roads"
CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
DATA "the_geom FROM roads"
STATUS ON
TYPE LINE
CLASS
COLOR 0 0 0
END
END
Этот слой отобразит все геометрии улиц из таблицы улиц как черные линии.
Теперь, при приближении к масштабу 1:100000, будем показывать только шоссе. Следующие два слоя позволят добиться этого эффекта:
LAYER
CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
DATA "the_geom FROM roads"
MINSCALE 100000
STATUS ON
TYPE LINE
FILTER "road_type = 'highway'"
CLASS
COLOR 0 0 0
END
END
LAYER
CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
DATA "the_geom FROM roads"
MAXSCALE 100000
STATUS ON
TYPE LINE
CLASSITEM road_type
CLASS
EXPRESSION "highway"
SIZE 2
COLOR 255 0 0
END
CLASS
COLOR 0 0 0
END
END
Первый слой используется, когда запрашиваемый масштаб больше, чем 1:100000, и отображает только дороги типа "шоссе", как черные линии. Опция FILTER отфильтровывает для показа только дороги типа "шоссе" ("highway").
Второй слой используется, когда масштаб меньше 1:100000, и отобразит шоссе как две красные линии, а другие дороги, - как сплошные черные линии.
Итак, мы получили интересный результат, используя только функции MapServer, с довольно простым предложением DATA. Теперь предположим, что названия улиц по какой-то причине хранятся в другой таблице, и нам нужно присоединить ее, чтобы пометить улицы.
LAYER
CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
DATA "the_geom FROM (SELECT roads.oid AS oid, roads.the_geom AS the_geom,
road_names.name as name FROM roads LEFT JOIN road_names ON
roads.road_name_id = road_names.road_name_id)
AS named_roads USING UNIQUE oid USING SRID=-1"
MAXSCALE 20000
STATUS ON
TYPE ANNOTATION
LABELITEM name
CLASS
LABEL
ANGLE auto
SIZE 8
COLOR 0 192 0
TYPE truetype
FONT arial
END
END
END
Этот слой примечаний добавляет зеленые подписи на все улицы в масштабе 1:20000 или меньше. Также здесь демонстрируется использование SQL вместе с определением DATA.
<<< предыдущая глава | оглавление | следующая глава >>>
Обсудить в форуме Комментариев 21
Последнее обновление: December 01 2008
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).