Введение в GeoServer и его REST API

Система управления данными с открытым исходным кодом, оснащенная полным API и встроенными WMS- и WFS-серверами

GeoServer – это сервер с открытым исходным кодом для управления источниками данных географических информационных систем (ГИС) и организации доступа к таким данным с помощью Web-сервисов Web Feature Service (WFS) и Web Map Service (WMS). Он включает в себя богатый программный интерфейс REST API для управления данными сложных Web-приложений во время выполнения без ручного вмешательства и хорошо интегрируется с картографическим инструментом OpenLayers. В данной статье дается введение в GeoServer и исследуются преимущества создания интерфейсного PHP-класса (класса-обертки) для этого API.

Кристофер Михаэлис, программист, Consultant

Кристофер Михаэлис - программист, специализирующийся на Web-хостинге и Web-приложениях. Он изучал информатику и географическую информатику в Университете штата Юта и Университете штата Айдахо. Его опыт охватывает широкий круг разработок, включая приложения для моделирования окружающей среды, образования, анализа данных по сахарному диабету, средства администрирования систем, Web-хостинг, интеграцию платформ и службы на основе определения местоположения.



15.01.2014

Те, кто работает с картографическими данными в Интернете, вероятно, знакомы с MapServer, который обычно является предпочтительным инструментом для этих целей. Хотя MapServer отлично работает со статическими источниками данных, его настройка представляет собой длительный ручной процесс. Для него отсутствуют готовые решения по управлению данными и настройке через API. Если вы ищете комплексное решение по долгосрочному управлению данными или готовую основу для ГИС-ориентированного Web-приложения, лучшим выбором, возможно, является GeoServer.

GeoServer – это сервер с открытым исходным кодом, позволяющий легко управлять ГИС-данными. Как и MapServer, он предоставляет данные в соответствии со стандартами WMS и WFS. Он также поддерживает сервис WFS-T для модификации актуальных данных, а также язык географической разметки (GML), язык разметки Keyhole (KML) и многие другие форматы. Данные организовываются в рабочие области и хранилища данных, при этом используется дисковая система хранения или PostGIS. С помощью встроенного REST API можно управлять наборами данных в режиме реального времени. Это ПО также включает в себя готовый Web-интерфейс.

В этом подробном введении в GeoServer исследуются процесс установки, Web-интерфейс администрирования и использование REST API посредством упрощающего работу интерфейсного PHP-класса.

Предварительная информация

Перед началом работы нужно понять, что такое ГИС, и познакомиться с основными терминами, такими как шейп-файл, атрибуты векторных объектов и проекции. В разделе Ресурсы приведена ссылка на страницу GIS 101 сайта GIS Lounge, являющуюся прекрасным введением в основы ГИС.

WMS – это интерфейс для запрашиваемых изображений карты, а WFS – интерфейс для запрашиваемых векторных данных карты. WMS чаще используется в ситуациях, когда целью является исключительно отображение данных. WFS удобнее при взаимодействии пользователей с исходными данными (например, запрос значений таблицы атрибутов или изменение данных). Модификацию WFS часто называют WFS-T или WFS с транзакциями.

Многие операции, выполняемые с помощью GeoServer, имеют формат XML, поэтому полезно иметь представление об этом формате. В разделе Ресурсы приведена ссылка на учебник "Основы XML", который содержит отличное описание XML.

Чтобы выполнить инструкции по установке, необходимо уметь работать с командной строкой Linux® и иметь доступ к серверу Linux. Если в качестве системы хранения данных вы хотите использовать PostGIS, а не шейп-файлы на диске, вам потребуется знание PostgreSQL и PostGIS, а также доступ к серверу PostGIS.

И, наконец, вам потребуется OpenLayers – отличный JavaScript-инструмент создания карт на стороне клиента, который позволяет разрабатывать (в тесном взаимодействии с GeoServer) Web-приложения для представления пространственных данных. Для получения информации об OpenLayers прочтите статью Объединение данных с помощью OpenLayers (EN).


Установка

GeoServer – это Java™-сервлет. Он работает внутри контейнера сервлетов, например Apache Tomcat. Его также можно использовать автономно с помощью встроенного контейнера сервлетов Jetty, что очень удобно при локальном тестировании. Tomcat больше подходит для крупных установок, поэтому в данной статье рассматривается именно этот вариант.

Требования к серверу

Для работы подойдет любой Linux-сервер, к которому у вас есть root-доступ. GeoServer отлично работает на небольшой виртуальной машине, например на небольшом экземпляре IBM PowerVM® или на разделе System Z®. Потребности в ресурсах напрямую зависят от объема трафика, который планируется направлять на GeoServer. На диске должно быть достаточно места для хранения ГИС-данных и около 5 ГБ для операционной системы и GeoServer. Рекомендуется по крайней мере 512 МБ оперативной памяти. Возможно использование операционных систем Microsoft® Windows® и Mac OS® X, но Linux удобнее в промышленной эксплуатации. В данной статье предполагается использование сервера под Ubuntu или Debian.

Установка Apache Tomcat и GeoServer WAR

Установите Tomcat с помощью команды apt-get install tomcat7. После завершения установки откройте тестовую страницу по адресу http://ваш-сервер:8080. Затем перейдите на страницу GeoServer Stable Downloads (см. раздел Ресурсы) и загрузите сжатый WAR-файл. Разархивируйте файл и переместите geoserver.war из архива в /var/lib/tomcat7/webapps/. Не обращайте внимания на остальные файлы архива. Перезапустите Tomcat с помощью команды service tomcat7 restart. По умолчанию к установленному серверу GeoServer можно обратиться по адресу http://ваш-сервер:8080/geoserver/. Сервер Tomcat запускается автоматически при перезагрузке.

Каталогом данных по умолчанию является /var/lib/tomcat6/webapps/geoserver/data/. В этом каталоге содержатся хранилище данных (по умолчанию) и настройки безопасности. В нем также содержится папка data для хранения файлов актуальных ГИС-данных, так что путь к этим файлам будет включать имя data дважды (например, /var/lib/tomcat7/webapps/geoserver/data/data/USA/state.shp). Если это вас не устраивает, измените имя папки для хранения данных на что-нибудь более определенное, например gis_data.

Чтобы обращаться к порту, отличному от 8080, отредактируйте файл /etc/tomcat7/server.xml. Найдите строку <Connector port="8080" protocol="HTTP/1.1", измените 8080 на 80 (или другой порт, который хотите использовать), сохраните файл и перезагрузите Tomcat.

Дополнительные расширения

Для GeoServer существует множество расширений, которые позволяют использовать больше источников данных (например, IBM DB2®) и новые функции (например, Web-сервис геопроцессинга (WPS) и вывод в Excel-формате). Эти расширения можно найти на странице загрузки GeoServer (см. раздел Ресурсы).

Чтобы установить расширение, разархивируйте его в /var/lib/tomcat7/webapps/geoserver/WEB-INF/lib/. После установки расширения (или всех необходимых на этой стадии расширений) перезапустите GeoServer (sudo service tomcat7 restart).

Полезными расширениями являются OGR и MySQL. OGR поддерживает дополнительные форматы вывода векторных данных, а MySQL поддерживает базу данных MySQL. После установки расширения OGR убедитесь, что в вашей системе есть рабочая утилита ogr2ogr. Если ее нет, установите пакет gdal-bin с помощью команды sudo apt-get install gdal-bin. После перезагрузки сервера GeoServer в раскрывающемся списке предпросмотра слоя будут отображаться все форматы, поддерживаемых OGR. Точно так же после установки MySQL и перезагрузки системы в списке вариантов хранения New data source появится база данных MySQL. Расширение MySQL не имеет официальной технической поддержки, поэтому если нет настоятельной необходимости использовать MySQL, предпочтительным вариантом является PostGIS (PostgreSQL).


Web-интерфейс

После установки войдите в административный интерфейс для выполнения описанной ниже простой настройки, даже если планируете использовать GeoServer только из Web-приложения.

Начальная настройка

Имя пользователя по умолчанию – admin, а пароль – GeoServer. После входа нажмите Security->Users в меню слева. Чтобы изменить пароль администратора, в отобразившемся списке выберите имя admin. Здесь также можно добавлять новых пользователей.

Вы можете загрузить любые имеющиеся шейп-файлы или подготовить базы данных PostGIS. Например, для набора данных США создайте каталог /var/lib/tomcat7/webapps/geoserver/data/data/USA. Загрузите свои файлы данных. Измените путь к файлам в зависимости от того, где выполняется экземпляр GeoServer (укажите tomcat7, если используется Apache Tomcat). В случае PostGIS используйте утилиту shp2pgsql для импорта шейп-файлов. Дополнительные сведения о загрузке данных в PostGIS находятся в разделе Ресурсы.

GeoServer организует данные (слои) в рабочие области и хранилища данных. Слой – это индивидуальный набор данных, например дороги или озера. Рабочая область обеспечивает логическое группирование данных для конкретного проекта или географического региона. Рабочая область может содержать одно или несколько хранилищ данных, определяющих физическое местоположение данных (например, каталог или файл на диске или таблица базы данных PostGIS).

После подготовки данных выберите соответствующие варианты в меню Data, чтобы добавить их в GeoServer. Для большинства опций можно оставить значения по умолчанию. Для рабочих областей пространство имен должно иметь уникальное значение следующего вида: http://имявашегосервера/имярабочейобласти. Добавление слоев называется публикацией слоев. Чтобы выполнить публикацию, выберите нужную систему координат (SRS – система пространственной привязки) и нажмите Compute под каждым из двух ограничивающих прямоугольников. Повторите эту процедуру для всех исходных рабочих областей, хранилищ данных и слоев.

Если вы используете PostGIS, для достижения наилучших результатов импортируйте хотя бы один шейп-объект в каждую таблицу базы данных, прежде чем разместить ее на GeoServer. После настройки слоев просмотрите их в GeoServer, как показано на рисунке 1.

Рисунок 1. Просмотр слоя

Безопасность

С помощью GeoServer можно настроить роли пользователей для управления доступом к определенным рабочих областям и сервисам. Если используемый вами экземпляр GeoServer является общедоступным, поэкспериментируйте с меню Security, чтобы понять, как работают роли. Во многих случаях можно разместить сервер за сетевым экраном или в закрытой сети и использовать единый вход с полным доступом. Можно также выполнять все операции на GeoServer через собственное ПО и PHP-прокси, который мы рассмотрим в следующем разделе.

Текущее обслуживание и управление данными

Следите за тем, чтобы объем дискового пространства, процессорные ресурсы и оперативная память, выделенные для сервера, соответствовали росту потребностей с течением времени. Запланируйте регулярное резервное копирование сервера. (Выполняйте резервное копирование всего каталога /var/lib/tomcat7/webapps/geoserver и всех имеющихся баз данных PostGIS.) Чтобы избежать путаницы при наличии нескольких сотен слоев, заблаговременно разработайте план именования рабочих областей, пространств имен, хранилищ данных и файлов.


REST API и PHP-обертка

GeoServer имеет API, который позволяет выполнять большинство операций программным способом. Этот API делает GeoServer полезным инструментом управления данными и основой для комплексного Web-приложения, которое автоматически добавляет и удаляет слои по мере необходимости. GeoServer API можно использовать напрямую, но лучше создать интерфейсный PHP-класс, который упрощает операции и инкапсулирует необходимые взаимодействия. В разделе Загрузка приведена ссылка на простой API обертки и тестовую страницу, которую можно использовать и модифицировать в собственных целях.

Все операции API выполняются с помощью запросов GET, POST, PUT или DELETE по URL-адресу http://вашсервер:8080/geoserver/rest/. Добавьте нужный объект (например, рабочие области) в URL после разделителя и укажите возвращаемый формат (обычно это XML, JSON или HTML). Таким образом, запрос GET по адресу http://вашсервер:8080/geoserver/rest/workspaces.xml возвращает все рабочие области в формате XML. В общем случае запрос GET возвращает результаты в том же формате, который использовался при создании экземпляра объекта посредством запроса POST или при его обновлении посредством запроса PUT. Лишь в редких случаях придется указывать все детали, возвращаемые запросом GET. Интерфейсный PHP-класс (см. раздел Загрузка) содержит примеры конкретных операций REST API. Ссылка на REST Configuration API приведена в разделе Ресурсы.

Получение, создание и удаление данных

Пример PHP-обертки содержит простые функции получения, удаления и создания объектов основных типов. При создании хранилища данных PostGIS база данных уже должна существовать. При использовании createLayer для таблицы PostGIS именем слоя является имя таблицы. Прежде чем добавить слой в GeoServer, убедитесь, что в таблицу загружен хотя бы один шейп-объект. При использовании хранилища данных Shapefile Directory именем слоя является имя файла (без пути), при этом файл должен находиться в каталоге хранилища данных. Листинг 1 иллюстрирует создание с помощью одной операции рабочей области, хранилища данных и слоя.

Листинг 1. Создание рабочей области, хранилища данных PostGIS и публикация слоя
include "GeoserverWrapper.php";
$geoserver = new GeoserverWrapper('http://geosrvr.chrismichaelis.com/geoserver',
          $username, $password);

// открытая функция createWorkspace($workspaceName)
$geoserver->createWorkspace('delineation_34');

// открытая функция createPostGISDataStore($datastoreName, $workspaceName,
//        $databaseName, $databaseUser, $databasePass, $databaseHost = 'localhost',
//        $databasePort = '5432')
$geoserver->createPostGISDataStore('d34_outputs', 'delineation_34', 'delineations',
          'gisuser', 'gisuser', 'localhost');

// Создайте таблицу
pg_query("CREATE TABLE d34_stream_output (...)"); 
// Загрузите шейп-объект(ы) в соответствии с логикой вашей программы
pg_query("INSERT INTO d34_stream_output (...)");

// открытая функция createLayer($layerName, $workspaceName, $datastoreName,
//        $description = '')
$geoserver->createLayer('d34_stream_output', 'delineation_34', 'd34_outputs',
          'Delineation outputs for run #34');

Просмотр слоев

С помощью функции viewLayer можно выполнить запрос набора данных в формате GML или в KML (формат Google Earth). Если вы хотите использовать выходные KML-данные непосредственно в Google Earth, убедитесь, что ваш набор данных содержит координаты широты и долготы. Используйте функцию viewLayerLegend, чтобы получить пиктограмму легенды для создания собственной легенды.

Самым простым и гибким способом отображения данных сервера GeoServer является использование OpenLayers. Поскольку OpenLayers является браузерным инструментом, все запросы с Web-страницы должны иметь одни и те же доменное имя и порт. Это ограничение, обусловленное требованиями безопасности, также препятствует взаимодействию с GeoServer через порт и сервер, отличные от основного сайта. В связи с этим наша PHP-обертка также предоставляет функцию wfsPost, которая передает запросы на GeoServer. Пример тестового класса API tester.php использует эту функцию для перехвата и перенаправления запросов с OpenLayers на GeoServer. В листинге 2 приведен соответствующий код.

Листинг 2. Перехват и перенаправление запросов GeoServer
// Передача WFS-запроса на сервер закрытой сети
// (или для междоменной защиты в обход прокси)
$pathParts = explode('/', $_SERVER['PATH_INFO']);
if ($pathParts[1] == 'wfsauth') {
  $unused = array_shift($pathParts);
  $unused = array_shift($pathParts);
  $user = array_shift($pathParts);
  $pass = array_shift($pathParts);

  // Передача WFS-запроса с использованием имени пользователя и пароля
  include "GeoserverWrapper.php";
  $geoserver = new GeoserverWrapper('http://geosrvr.chrismichaelis.com/geoserver',
          $user, $pass);
  $wfs = implode('/', $pathParts);
  if ($_SERVER['QUERY_STRING'] != '') $wfs .= '?' . $_SERVER['QUERY_STRING'];
  // открытая функция wfsPost($apiPath, $post)
  echo $geoserver->wfsPost($wfs, file_get_contents('php://input'));
  return;
} else if ($pathParts[1] == 'wfs') {
  $unused = array_shift($pathParts);
  $unused = array_shift($pathParts);

  // Авторизация не требуется
  include "GeoserverWrapper.php";
  $geoserver = new GeoserverWrapper('http://geosrvr.chrismichaelis.com/geoserver');
  $wfs = implode('/', $pathParts);
  if ($_SERVER['QUERY_STRING'] != '') $wfs .= '?' . $_SERVER['QUERY_STRING'];
  echo $geoserver->wfsPost($wfs, file_get_contents('php://input'));
  return;
}

В листинге 3 показано подключение OpenLayers к слою WFS через PHP-прокси. Хотя по имени функции видно, что код предназначен для WFS, этот подход столь же хорошо работает для слоя WMS. WMS предоставляет изображения карты в формате PNG. WFS предоставляет актуальные данные карты в формате GML, которые отображаются на стороне клиента с помощью JavaScript-кода.

Листинг 3. Использование слоя WFS сервера GeoServer из OpenLayers
wfs = new OpenLayers.Layer.Vector("Editable Features", {
  strategies: [ new OpenLayers.Strategy.BBOX(), new OpenLayers.Strategy.Save() ],
      /* Предыдущая строка включает WFS-T. */
  projection: new OpenLayers.Projection("EPSG:900913"),
      /* 900913 = Проекция Google, необходимая для использования базовых слоев Google Earth */
  protocol: new OpenLayers.Protocol.WFS({
    version: "1.1.0",
    srsName: "EPSG:900913",
    url: "http://.../geoserver_api/index.php/wfsauth/USERNAME/PASSWORD",
    featureNS :  "http://chrismichaelis.com/test_1",
    featurePrefix: 'test_1',
    featureType: "roads2",
    geometryName: 'the_geom',
    schema: "http://.../geoserver_api/index.php/wfsauth/USERNAME/PASSWORD/" +
      "DescribeFeatureType?version=1.1.0&typename=test_1:roads2"
  })
});

map.addLayer(wfs);

Этот подход также можно использовать для реализации дополнительной защиты. Предположим, что GeoServer находится в закрытой сети или за сетевым экраном. При взаимодействии с ним посредством PHP-приложения по URL запроса можно определить, какие пользователи Web-приложения имеют доступ к запрашиваемому слою.

Использование WFS-T для изменения данных

Одним из преимуществ WFS перед WMS является то, что транзакции обновления набора данных можно выполнять непосредственно на сервере. Если вы используете OpenLayers, добавьте в листинг 3 строку, создающую стратегию Save. Элементы управления OpenLayers DeleteFeature, DrawFeature и ModifyFeature, позволяют быстро и просто редактировать шейп-объекты в Web-приложении.

Можно также выполнять операции редактирования непосредственно из PHP-кода, а не пытаться напрямую менять шейп-файлы на диске или таблицу PostGIS. Интерфейсная обертка предоставляет функцию executeWFSTransaction, которая в качестве аргумента принимает XML-транзакции. В транзакции указываются пространство имен и слой. Дополнительная информация о написании транзакций WFS-T приведена в учебном руководстве GEOSS Transactional WFS (см. раздел Ресурсы).

Листинг 4 иллюстрирует выполнение простой транзакции WFS-T, которая вставляет Г-образную линию.

Листинг 4. Выполнение транзакции WFS-T для вставки небольшого шейп-объекта
$WFSTRequest = '
<?xml version="1.0" ?>
<wfs:Transaction service="WFS" version="1.1.0" xmlns:wfs="http://www.opengis.net/wfs"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.opengis.net/wfs
          http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
  <wfs:Insert>
    <feature:roads2 xmlns:feature="http://chrismichaelis.com/test_1">
      <feature:the_geom>
        <gml:MultiCurve srsName="EPSG:900913" xmlns:gml="http://www.opengis.net/gml">
          <gml:curveMember>
            <gml:LineString>
              <gml:posList>
                -11575958.058425 5537202.2479459 -11575346.562199
                5524666.5753089 -11561893.645222 5524666.5753089
              </gml:posList>
            </gml:LineString>
          </gml:curveMember>
        </gml:MultiCurve>
      </feature:the_geom>
    </feature:roads2>
  </wfs:Insert>
</wfs:Transaction>
';

$geoserver->executeWFSTransaction($WFSTRequest);

Обратите внимание, что в листинге 4 координаты проекции соответствует тому, что указано в XML-трибуте srsName.

Создание и назначение стилей

Для WFS-слоев стили, как правило, определяются в JavaScript-коде, создаваемом с помощью OpenLayers на стороне клиента. Для отображения слоев WMS, представляющих собой изображения, создаваемые на сервере, используются определения стилей. Определения стилей создаются с помощью SLD-нотации (Styled Layer Descriptor). SLD – это XML-схема для настройки отображения слоев, предоставляющая множество параметров, таких как различные значения и диапазоны атрибутов. GeoServer позволяет сохранять и именовать стили, чтобы использовать их в дальнейшем. SLD лучше изучать на примере. На странице SLD Cookbook содержится много готовых к использованию примеров (см. раздел Ресурсы).

Интерфейсная обертка предоставляет функции получения, создания и удаления стилей, а также назначения стиля слою. Один слой может иметь несколько стилей. При наличии нескольких стилей можно задать используемый стиль в WMS-запросе, как показано в примере OpenLayers WMS в листинге 5.

Листинг 5. Запрос конкретного стиля для слоя WMS с помощью OpenLayers
map.addLayer(
  new OpenLayers.Layer.WMS(
    // При необходимости здесь снова можно использовать "PHP Proxy".
    "test_workspace:roads2", "http://geosrvr.chrismichaelis.com/geoserver/roads2/wms",
    {
      LAYERS: 'test_workspace:roads2',
      STYLES: 'simple_roads'.
      tiled: true
    },
    {
      buffer: 0,
      displayOutsideMaxExtent: true,
      isBaseLayer: true,
      yx : {'EPSG:4326' : true}
    } 
  )
);

Заключение

Интеграция GeoServer с Web-приложением – это отличный способ сократить количество рутинного кода, необходимого для управления данными, и в то же время получить в свое распоряжение полнофункциональный WMS- и WFS-T-сервер. Вы можете использовать описанный в статье подход и сопровождающие статью примеры без всяких ограничений.


Загрузка

ОписаниеИмяРазмер
Обертка Geoserver PHP API и тестовая страницаGeoserverWrapperAPIandTester.zip6КБ

Ресурсы

Научиться

Получить продукты и технологии

  • Страница GeoServer Stable Downloads: загрузите GeoServer и дополнительные расширения.
  • Apache Tomcat: контейнер сервлетов Tomcat – отличный способ для запуска GeoServer.
  • Оцените продукты IBM наиболее подходящим способом: загрузите ознакомительную версию, попробуйте продукт в Интернете, используйте продукт в облачной среде или проведите несколько часов в SOA Sandbox, изучая эффективную реализацию сервис-ориентированной архитектуры.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Web-архитектура
ArticleID=960295
ArticleTitle=Введение в GeoServer и его REST API
publish-date=01152014