Geoserver - WMS и WFS
Все мы знаем, что обнять большого слона за один раз нам не под силу, ведь мы с вами маленькие.
Geoserver представляет собой веб-сервер, обеспечивающий стандартным клиентам, таким, как веб-браузеры и настольные ГИС, доступ к хранящимся в различных форматах картам и данным. Это означает, что вы можете хранить ваши пространственные данные почти в любом предпочитаемом вами формате.
Geoserver — это эталонная реализация стандартов Open Geospatial Consortium (OGC) WFS (Web Feature Service) и WCS (Web Coverage Service), а также высокопроизводительная сертифицированная реализация WMS (Web Map Service). Geoserver является основным компонентом Geospatial Web.
Поскольку geoserver реализует несколько различных картографических, изучать мы будем весь функционал постепенно, по мере нашего продвижения по миру картографии.
Введение
Предположим, у нас имеется большой объём данных, например, данные по всем зданиям города Санкт-Петербург, хранящиеся в базе данных PostgreSQL (об этом мы еще поговорим в одной из следующих статей), и какой-нибудь разработчик принимает решение использовать их в своем приложении. Прежде всего он вынужден будет реализовать все необходимые операции (извлечение, фильтрацию и т.п.) c помощью SQL. Если мы вдруг решим сменить способ хранения (например, перейдем на файловый вариант) или появится более качественный источник аналогичных данных, но в другом формате и разработчику нужно будет переключиться на него, то он будет вынужден полностью переписывать ту часть своего приложения, которая отвечает за извлечение данных из хранилища.
Основной задачей данных сервисов является предоставление универсального интерфейса доступа к данным, убирая необходимость прямого доступа к хранилищу.
Важно отличать Web Feature Service (WFS) от Web Map Service (WMS).
WMS предназначен для передачи уже отрендеренных данных, тех самых тайлов.
WFS отдаёт данные в оригинальном виде: в стандарте указан GML, однако никто не запрещает отдавать и в виде других форматов, например, изученном нами ранее GeoJSON.
Можно провести аналогию: скомпилированная программа (WMS) и исходный код (WFS).
WMS - Web Map Service
Как мы уже выяснили, WMS позволяет нам получать отрендеренные тайлы. Если говорить простыми словами - картинки с изображением объектов слоя, однако есть методы, возвращающие информацию о слое.
Рассмотрим доступные нам методы.
- GetCapabilities - возвращает параметры WMS (такие как формат изображения карты и совместимость версий WMS) и доступные слои (ограничивающая рамка карты (bounding box), системы координат, URI данных и является ли слой в основном непрозрачным или нет).
- GetMap - возвращает изображение карты. Параметры включают: ширину и высоту карты, систему координат, стиль рендеринга, формат изображения.
- GetFeatureInfo - позволяет при клике на тайл получить информацию об объектах в данной точке.
- GetLegendGraphic - возвращает изображение легенды карты, предоставляя визуальное руководство по элементам карты.
Метод GetMap - основные параметры
На данном этапе нам важно учитывать особенности Geoserver, а именно:
- Количество стилей в параметре STYLES должно соответствовать количеству слоев в параметре LAYERS
- Количество фильтров в параметре CQL_FILTER должно соответствовать количеству слоев в параметре LAYERS
- Если одному из слоев нам не нужно применять фильтрацию, то к нему необходимо применить специальное слово INCLUDE
За счет регулирования параметров ширины, высоты, а также bbox, можно выводить тайлы на карту двумя способами:
Первый способ позволяет отдавать пользователю информацию на просмотр гораздо раньше, однако в этом случае видно, как прогружается карта.
Второй способ заставляет пользователя немного подождать, однако на выходе мы получаем сразу полную картинку.
Метод GetFeatureInfo - основные параметры
Также ваша карта может отдавать в GetFeatureInfo параметры, как и у GetMap. Это абсолютно нормально, пугаться этого не стоит.
Если есть какие-то лишние параметры, которые не описаны в стандарте, то учитываться они не будут.
Если название параметра написано с ошибкой, а он обязательный, Geoserver вам об этом скажет, ровно как и сообщит о любой другой ошибке или отклонении от стандарта.
Метод GetCapabilities - основные параметры
WFS - Web Feature Service
Основная задача WFS-сервисов - это предоставление разработчикам (или конечным потребителям данных) универсального интерфейса доступа к пространственным данным, убирающего необходимость прямого доступа к хранилищу и таким образом делающего его прозрачным для пользователя. В этом случае задача по реализации доступа к различным хранилищам данных ложится на плечи WFS-сервера, то есть WFS сервер выступает в качестве прослойки между хранилищем данных и пользователем данных (к пользователям данных могут относится и в том числе и программы).
Стандарт WFS описывает 6 методов, каждый из которых отвечает за выполнение той или иной операции:
Поскольку мы рассматриваем базовые возможности WFS, то остановимся на рассмотрении только первых трёх методов: GetCapabilities, DescribeFeatureType и GetFeature. GetGMLObject - довольно сложная штука и вряд ли вы с ней столкнётесь, а последние два метода Transaction и LockFeature предназначены для выполнения операций по редактированию объектов.
У всех запросов будет примерно одинаковый набор параметров. Дабы их каждый раз не повторять, вынесу отдельно
Метод GetCapabilities
Если вы внимательно посмотрите на название, то заметите, что такой метод уже был в WMS. Смысл этого метода точно такой же, что и в WMS.
Метод DescribeFeatureType
В ходе работы может потребоваться узнать дополнительную информацию об отдельных слоях, опубликованных по WFS. Для этого предназначен метод DescribeFeatureType. Данный метод возвращает список доступных слоёв или описание атрибутов, если в запросе передано имя конкретного слоя.
Метод GetFeature
Описанные выше два метода конечно полезны, однако наиболее важный метод ради которого и был разработан стандарт WFS - метод GetFeature, позволяющий запрашивать с сервера непосредственно сами данные. Данный метод необходимо использовать совместно с параметром typeName, определяющем имя слоя, объекты которого мы запрашиваем.
Если необходимо запросить информацию об одном объекте, то зная его id, то можно использовать параметр featureID. Например,
?service=WFS&version=1.1.0&request=GetFeature&typename=space:buildings&featureID=buildings.7
featureID должен выглядеть как название_слоя.id
C помощью параметра maxFeatures можно ограничить количество получаемых данных. Здесь же можно передать параметр startIndex, который поможет получать информацию дозировано, а может быть и сделать пагинацию без написания своего бэкенда.
?service=wfs&version=1.1.0&request=GetFeature&typeName=space:buildings&maxFeatures=10&startIndex=11
Такой запрос означает, что мы получим 10 объектов, начиная с 11-го.
При этом Geoserver нам отдаст дополнительную информацию о кол-ве всего объектов в слоев, а также повторит информацию о кол-ве полученных объектов, равного параметру maxFeatures.
Ограничить список возвращаемых атрибутов можно с помощью параметра propertyName, передавая значения имен атрибутов через запятую, а отсортировать полученный результат с помощью параметра sortBy
?service=wfs&version=1.1.0&request=GetFeature&typeName=space:buildings&sortBy=year+D&propertyName=year,address
Параметр outputName позволяет нам определить, в каком формате мы хотим получать ответ. Для нас самым часто используемым будет формат application/json, благодаря которому мы будем получать GeoJSON.
Оба метода GetCapabilities возвращают XML. Я намерено не углубляюсь в их ответы, поскольку GetCapabilities не так часто используется на фронтенде, а если и нужен, то карты, которыми мы будем пользоваться, умеют парсить ответ из коробки.
Если вам это очень интересно, подробнее можно почитать про WMS и WFS.
Geoserver позволяет нам фильтровать объекты как для WMS, так и для WFS, передавая параметр CQL_FILTER. Возможности фильтрации мы рассмотрим на практике, так как это тема отдельной статьи, а пока просто важно знать, что оно есть :)
На следующем занятии посмотрим, где мы будем хранить наши гео данные, и создадим первый слой.