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