Задача:опубликовать оперативные пожарные данные (PostGIS). То есть необходимо предоставить пользователям возможность использовать исходные векторные данные в своих приложениях.
Проблема: одной из обязательных задач ГИС является обеспечение доступа к векторным данным, предоставление возможности их редактирования. Очевидно, что в современных условиях данные задачи должны решаться поверх протокола HTTP с целью обеспечения универсального доступа к данным как для Web, так и для настольных приложений. Эта задача решается в рамках использования стандарта WFS-T. Обеспечение универсального доступа к данным посредством WFS облегчает создание конечных приложений -- потребителей данных (за счёт отсутствия необходимости реализовывать поддержку различных форматов хранилищ). Однако, эта универсальность достигается за счёт добавление промежуточного слоя между хранилищем данных и потребителем.
TinyOWS - это открытое программное обеспечение, распространяемое под лицензией MIT, представляет собой высокопроизводительный WFS-T сервер. TinyOWS строго реализует стандарты OGC WFS 1.0.0 и 1.1.0.
TinyOWS настраивается с пощью простого и лаконичного XML-файла. Кроме того TinyOWS может быть настроен с помощью map-файла MapServer. То есть один map-файл может быть использован как для публикации данных по WMS, так и по WFS.
Знакомство с исходными данными
Исходные данные представлены пространственной базой данных PostGIS. Познакомимся с ними.
1.1 Откройте pgAdmin:
Applications - Programming - pgAdmin
1.2 Подключитесь к серверу local (postgres/postgres)
1.3 В базе данных fires
найдите таблицу july
:
`fires - Schemas - public - Tables - july`
1.4 Нажмите правой кнопкой на имени таблицы и выберите:
`View Data` - `View All Rows`
1.5 Изучите структуру открывшихся данных.
Проверка доступности TinyOWS
Убедимся в том, что TinyOWS установлен в нашей системе. Для этого в браузере
выполним запрос: http://localhost/cgi-bin/tinyows
. Если TinyOWS установлен,
вы должны получить в ответ XML-документ, содержащий сообщение
Service Unknown
.
Расположение файла конфигурирования
Файл настроек TinyOWS называется tinyows.xml
. По умолчанию сервер ищет
его по адресу /etc/tinyows.xml
, однако путь можно поменять, не забыв при
этом обновить его в переменной окружения. В нашем случае мы
создали файл tinyows.xml
в домашнем каталоге и сделали симлинк:
`<sudo ln -s /home/user/workshop/tinyows.xml /etc/tinyows.xml>`
Структура файла конфигурирования
4.1 Секция tinyows
(обязательна)
Представляет собой корневой элемент, содержащий 2 обязательных атрибута и
ряд опциональных:
`<tinyows online_resource="http://localhost/cgi-bin/tinyows"
schema_dir="/usr/local/share/tinyows/schema/">`
`online_resource` - URL по которому расположен WFS-сервер
`schema_dir` - директория в которой хранятся схемы документов
(используется при редактировании данных)
4.2 Элемент limits
(опционален)
Опциональный элемент, находящийся внутри секции tinyows
. Позволяет
ввести некоторые ограничения на уровне сервиса:
`<limits features="10000" />`
`features` - количество объектов
`geobbox` - географический охват
4.3 Элемент pg
(обязателен)
Определяет подключение к базе данных.
`<pg host="127.0.0.1" user="postgres"
password="postgres" dbname="fires" port="5432"/>`
`host` - имя(адрес) хоста на котором запущен PostgreSQL сервер
`user` - имя пользователя PostgreSQL
`password` - пароль пользователя
`dbname` - имя базы данных
`port` - порт на котором запущен PostgreSQL
4.4 Элемент metadata
(обязателен)
Описание сервиса. Содержит 2 обязательных атрибута и ряд опциональных:
`<metadata name="GisConf Server"
title="GisConf Server - Demo Service" />`
`name` - имя Web-сервиса
`title` - заголовок Web-сервиса
4.5 Элемент abstract
(опционален)
Опциональный элемент секции metadata
. Содержит описание Web-сервиса
в произвольной форме.
`<abstract>Открытые ГИС, Москва 2012</abstract>`
4.6 Элемент contact
(опционален)
Контактная информация о владельце сервиса. Содержит 3 обязательных
атрибута и ряд опциональных:
`<contact name="Gisconf Server"
site="http://www.gisconf.ru/"
email="gisconf@is.superconf" />`
`name` - имя сервиса
`site` - сайт владельца сервиса
`email` - электронная почта владельца сервиса
4.7 Элемент layer
(обязателен)
Используется для описания опубликованных слоёв. Содержит 3 обязательных
(ns_prefix
, ns_uri
, name
) и ряд опциональных атрибутов:
`<layer retrievable="1"
writable="1"
ns_prefix="gisconf"
ns_uri="http://www.gisconf.ru/"
name="july"
title="Выборка из 300 пожаров июля 2012 года" />
`retriveable` - признак доступности слоя на запрос `GetFeature`
`writable` - признак доступности слоя на запись
Сохраняем изменения в файле tinyows.xml
.
Подключение WFS-слоя в настольном клиенте
5.1 Откройте QuantumGIS:
`Applications - Science - Quantum GIS Desktop`
5.2 Добавляем слой в проект:
`Layer - Add WFS Layer`
5.3 Создаём подкдючение к WFS-серверу (http://127.0.0.1/cgi-bin/tinyows
)
и подключаемся у нему.
5.4. Добавляем в проект слой gisconf:july
5.5. С помощью инструмента идентификации убеждаемся в том, что помимо геометрий в векторных объектах присутствует и вся атрибутивная информация.
Пример редактирования данных в настольном клиенте
6.1 Не закрывая QGIS, включим слой gisconf:july
на редактирование: в
списке слоёв нажимаем правой кнопкой мыши на имени слоя и выбираем
Toggle Editing
.
6.2 Выбираем инструмент создания точечных объектов и ставим точку на
карте. Появится окно ввода аттрибутивных данных. Оставляя все поля
пустыми, нажимаем кнопку OK
. Выключаем режим редактирования слоя.
6.3 Открываем pgAdmin и убеждаемся в том, что в таблице july
появилась
новая запись.
6.4 Снова переходим в QGIS, включаем слой на редактирование, открываем
таблицу атрибутов, находим нашу новую запись и изменяем значение
поля version
на gisconf2012
. Выключаем режим редактирования слоя.
6.5 В pgAdmin убеждаемся в том, что новые данные попали в базу.
6.6 Вновь включаем слой на редактирование и удаляем нашу запись. Отключаем режим редактирования и убеждаемся, что запись была удалена из базы.
Подключение WFS-слоя в Web-клиенте
7.1 Отобразим наш WFS-слой в Web-клиенте, используя библиотеку OpenLayers.
7.2 Скачиваем OpenLayers:
`http://www.openlayers.org/download/OpenLayers-2.12.zip`
Распаковываем архив и всё содержимое каталога OpenLayers-2.12
помещаем
в /home/user/workshop/client/openlayers
(предварительно создав
каталог client
).
7.3 В каталоге ~/workshop/client
создаём файл wfs.html
соответствующего содержания, после чего делаем симлинк:
`sudo ln -s /home/user/workshop/client /var/www/`
7.4 Запустим браузер и откроем страницу:
`http://localhost/client/wfs.html`
7.5 Установите плагин Firebug
для Firefox
:
`Tools - Add-ons`
7.6 Запустите Firebug
(F12) и откройте вкладку Console
, предварительно
активировав её.
7.7 Наберите в консоли:
`wfs.features`
Появится список объектов нашего WFS-слоя. Если нажать на одном из них, то
раскроется список всех свойств выбранного объекта. Аттрибутивная
информация находится в свойстве attributes
.
Таким образом, мы отобразили наш слой в Web-клиенте и убедились в том, что помимо геометрий на клиенте доступна и вся аттрибутивная информация.
Пример редактирования в Web-клиенте
8.1 Для просмотра возможностей WFS-T в браузере откройте страницу:
`http://localhost/client/openlayers/examples/tinyows.html`
8.2 Нажмите кнопку Создать объект
и поставьте точку в произвольном
месте карты. Затем нажмите кнопку Сохранить изменения
. В случае
успешного выполнения транзакции появится сообщение Транзакция
выполнена успешно
. Обновите страницу и убедитесь в том, что изменения
попали в базу данных.
8.3 Нажмите кнопку Удалить объект
, кликните по вновь созданному объекту
и нажмите кнопку Сохранить изменения
. Обновите страницу и убедитесь в
том, что изменения попали в базу.
HTTP запросы
Спустимся на более низкий уровень и попробуем вручную выполнить некоторые WFS-запросы, чтобы понять как это выглядит на уровне HTTP-запросов.
9.1 Логгирование HTTP запросов
Так как TinyOWS работает в связке с Web-сервером Apache, то
все случаи обращения клиентов к сервису логгируются в файле
/var/log/apache2/access.log
. Чтобы посмотреть последние обращения
к Apache, выполните команду tail /var/log/apache2/access.log
.
9.2 Стандарт WFS описывает 6 различных методов, каждый из которых предназначен
для выполнения определенной задачи. Рассмотрим только 2 из них -
GetCapabilities
и GetFeature
, первый отвечает за получение
информации о Web-сервисе, второй - за непосредственное получение данных.
9.3 WFS-сервис умеет отвечать как на POST
, так и на GET
запросы. Для
демонстрации этой возможности выполним запрос GetCapabilities
различными
методами.
Откройте плагин Firefox RESTClient
и выполните:
1) Запрос http://localhost/cgi-bin/tinyows?service=wfs&version=1.1.0&request=GetCapabilities
методом GET
, результат представлен в удобном виде на вкладке
Response Body (Highlight)
2) Запрос http://localhost/cgi-bin/tinyows
методом POST
с телом запроса
`<wfs:GetCapabilities
xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0">
</wfs:GetCapabilities>`
В результате мы получили совершенно идентичные результаты с описанием WFS-сервиса.
9.4 Выполним запрос GetFeature
к слою gisconf:july
:
http://localhost/cgi-bin/tinyows?service=wfs&version=1.1.0&request=GetFeature&typeName=gisconf:july&maxFeatures=10
http://localhost/cgi-bin/tinyows?service=wfs&version=1.1.0&request=GetFeature&typeName=gisconf:july&maxFeatures=10&outputFormat=application/json
Как мы видим из представленного примера - существует возможность ограничения числа запрашиваемых объектов, а также возможность запросить данные в формате GeoJSON вместо GML, используемого по умолчанию.
9.5 Фильтрация на основе значения атрибутивного поля:
http://localhost/cgi-bin/tinyows?service=wfs&version=1.1.0&request=GetFeature&typeName=gisconf:july&outputFormat=application/json&FILTER=<Filter xmlns="http://www.opengis.net/ogc"><PropertyIsBetween><PropertyName>confidence</PropertyName><LowerBoundary><Literal>50</Literal></LowerBoundary><UpperBoundary><Literal>53</Literal></UpperBoundary></PropertyIsBetween></Filter>
9.6 Фильтрация по охвату:
http://localhost/cgi-bin/tinyows?service=wfs&version=1.1.0&request=GetFeature&typeName=gisconf:july&bbox=62,84,62.5,84.5&outputFormat=application/json
Заключение
Таким образом, был продемонстрирован универсальный доступ к данным из разных клиентов, хранилище при этом остается прозрачным для конечного пользователя.