Публикация данных по протоколу WFS

Задача:опубликовать оперативные пожарные данные (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.

  1. Знакомство с исходными данными

    Исходные данные представлены пространственной базой данных 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 Изучите структуру открывшихся данных.

  2. Проверка доступности TinyOWS Убедимся в том, что TinyOWS установлен в нашей системе. Для этого в браузере выполним запрос: http://localhost/cgi-bin/tinyows. Если TinyOWS установлен, вы должны получить в ответ XML-документ, содержащий сообщение Service Unknown.

  3. Расположение файла конфигурирования Файл настроек TinyOWS называется tinyows.xml. По умолчанию сервер ищет его по адресу /etc/tinyows.xml, однако путь можно поменять, не забыв при этом обновить его в переменной окружения. В нашем случае мы создали файл tinyows.xml в домашнем каталоге и сделали симлинк:

  4. `<sudo ln -s /home/user/workshop/tinyows.xml /etc/tinyows.xml>`
    
  5. Структура файла конфигурирования

    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.

  6. Подключение 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. С помощью инструмента идентификации убеждаемся в том, что помимо геометрий в векторных объектах присутствует и вся атрибутивная информация.

  7. Пример редактирования данных в настольном клиенте

    6.1 Не закрывая QGIS, включим слой gisconf:july на редактирование: в списке слоёв нажимаем правой кнопкой мыши на имени слоя и выбираем Toggle Editing.

    6.2 Выбираем инструмент создания точечных объектов и ставим точку на карте. Появится окно ввода аттрибутивных данных. Оставляя все поля пустыми, нажимаем кнопку OK. Выключаем режим редактирования слоя.

    6.3 Открываем pgAdmin и убеждаемся в том, что в таблице july появилась новая запись.

    6.4 Снова переходим в QGIS, включаем слой на редактирование, открываем таблицу атрибутов, находим нашу новую запись и изменяем значение поля version на gisconf2012. Выключаем режим редактирования слоя.

    6.5 В pgAdmin убеждаемся в том, что новые данные попали в базу.

    6.6 Вновь включаем слой на редактирование и удаляем нашу запись. Отключаем режим редактирования и убеждаемся, что запись была удалена из базы.

  8. Подключение 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-клиенте и убедились в том, что помимо геометрий на клиенте доступна и вся аттрибутивная информация.

  9. Пример редактирования в Web-клиенте

    8.1 Для просмотра возможностей WFS-T в браузере откройте страницу:

    `http://localhost/client/openlayers/examples/tinyows.html`
    

    8.2 Нажмите кнопку Создать объект и поставьте точку в произвольном месте карты. Затем нажмите кнопку Сохранить изменения. В случае успешного выполнения транзакции появится сообщение Транзакция выполнена успешно. Обновите страницу и убедитесь в том, что изменения попали в базу данных.

    8.3 Нажмите кнопку Удалить объект, кликните по вновь созданному объекту и нажмите кнопку Сохранить изменения. Обновите страницу и убедитесь в том, что изменения попали в базу.

  10. 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

  11. Заключение

    Таким образом, был продемонстрирован универсальный доступ к данным из разных клиентов, хранилище при этом остается прозрачным для конечного пользователя.