GIS-LAB

Географические информационные системы и дистанционное зондирование

Создание WMS-сервиса с помощью Mapserver

О том, как из просто веб-карты сделать WMS-сервис.

Обсудить в форуме Комментариев — 21

Данная статья, помимо перевода соответствующего пункта документации к программному пакету Mapserver, также ставит целью предоставить конкретный, работающий пример, иллюстрирующий создание WMS сервиса с помощью Mapserver и его дальнейшее использование в ПО умеющем работать с такими сервисами, в нашем случае мы иллюстрируем работу с созданным сервисом в QGIS, ArcGIS и ArcGIS Explorer.

В статье подразумевается, что вы уже умеете создавать интернет-карты с помощью Mapserver, в обратном случае, рекомендуем сначала ознакомиться с описанием для начинающих. Подразумевается, что у читателя уже есть собранный и работающий проект Mapserver. Дальнейшее описание показывает, как из просто интернет-карты сделать сервис отвечающий спецификации WMS 1.1.1, позволяющий работать с своими данными в клиентском ПО ГИС. Для создания подобного сервиса необходим Mapserver версии 3.5 и выше.

Содержание

  1. Теория
  2. Практика

Теория

WMS (или Web Map Server - Сервер картографической информации) помимо просто отображения инфромации с помощью браузера, также позволяет пользователю использовать свои данные в ПО ГИС, в пользовательской ГИС таким образом может быть загружены данные из нескольких WMS, дополнительно к ним могут быть добавлены данные самого пользователя. Mapserver поддеживает спецификацию WMS версии 1.1.1, которая поддерживается Open Geospatial Consortium (OGC).

Проверка поддержки WMS в Mapserver

Перед тем как начать работу необходимо убедиться в том, что ваша версия Mapserver поддерживает WMS, для этого необходимо выполнить следующую команду в Windows-версии Mapserver:

C:apachecgi-bin> mapserv -v

или такую команду в Unix-версии, находясь в директории cgi-bin веб-сервера:

$ ./mapserv -v

Если в результате выполнения команд, в описании Mapserver содержится подстрока SUPPORTS=WMS_SERVER, значит WMS поддерживается. Примерное содержание результата выполнения этих команд такое:

MapServer version 4.6.1 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=PDF OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE DEBUG=MSDEBUG

Адаптация map-файла для поддержки WMS

Подразумевается, что некая веб-карта уже создана и работает, например такая. Содержимое соответствующего map-файла для этой карты очень простое:

MAP
  IMAGETYPE        PNG
  EXTENT            -97.238976 41.619778 -82.122902 49.385620
  SIZE                 400 300
  SHAPEPATH      "/usr/local/www/website/data/map/"
  IMAGECOLOR     255 255 255

  WEB
    TEMPLATE  "template.html"
    IMAGEPATH "/usr/local/www/website/data/map/tmp/"
    IMAGEURL  "/tmp/"
  END

  LAYER
    NAME         states_poly
    DATA         states_ugl
    STATUS       OFF
    TYPE         POLYGON

    CLASSITEM    "CLASS"

    CLASS
      NAME 'States'
      EXPRESSION 'land' # Показываются только полигоны, где "CLASS" = 'land'.

      STYLE
        COLOR      232 232 232
      END
    END
    CLASS
      NAME 'Water'
      EXPRESSION 'water' # Показываются только полигоны, где CLASS" = 'water'.
      STYLE
        COLOR      198 198 255
      END
    END
  END

  LAYER
    NAME        states_line
    DATA        states_ugl
    STATUS     OFF
    TYPE         LINE

    CLASSITEM    "CLASS"
    CLASS
      NAME       'State Boundary'
      EXPRESSION 'land'
      STYLE
        COLOR    32 32 32
      END
    END
  END

END

Для адаптации нашей карты как WMS сервиса, потребуются следующие изменения.

1. Необходимо задать тэг NAME для карты:

MAP
  NAME           "WMS"
  STATUS         ON
  IMAGETYPE      PNG
  ...

2. В группе WEB необходимо создать подгруппу METADATA и задать в ней тэги:

  • wms_title - название WMS сервиса
  • wms_abstract - краткое описание WMS сервиса
  • wms_onlineresource - полная ссылка (URL), которая будет использоваться, чтобы использовать создаваемый WMS в клиентском ПО, ссылка должна оканчиваться на знак &;
  • wms_srs - общая система координат проекта (карты), задать описание системы координат можно разными способами, в данном случае выбрана просто ссылка на географическую систему координат WGS84 по классификатору EPSG;
...
WEB
    TEMPLATE  "template.html"
    IMAGEPATH "/usr/local/www/website/data/tmp/"
    IMAGEURL  "/tmp/"
	METADATA
		wms_title "GIS-LAB Demo"
		wms_abstract "This is the WMS demo from GIS-Lab"
		wms_onlineresource "http://gis-lab.info/cgi-bin/mapserv?map=/usr/local/www/website/data/map/wms.map&"
		wms_srs "EPSG:4326"
	END
  END
  ...

Если слои карты имеют систему координат отличную от системы координат карты, то она должна быть обозначена для каждого слоя. В обратном случае считается, что система координат слоя равна системе координат карты в целом. Если систему координат слоя задать все же необходимо, делается это так:

LAYER # States line layer begins here
...
	METADATA
		wms_title "Countries 2"
		wms_abstract "Countries 2 test"
        wms_srs "EPSG:4326"
	END
...

3. Необходимо задать группу тэгов PROJECTION карты

...
PROJECTION
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
END
...

Точно также как и параметр wms_srs в группе METADATA наследуются и описания проекций слоя и карты в группе PROJECTION. Спецификацией WMS 1.1.1 рекомендуется указывать описание системы координат отдельных слоев, даже если они совпадают друг с другом и с картой целиком. Также как и для самой карты, PROJECTION указывается для каждого слоя и в метаданных слоя.

...
LAYER
...
PROJECTION
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
END
...
	METADATA
		wms_title		"Countries 2"
		wms_abstract	"Countries 2 test"
		wms_srs			"EPSG:4326"
	END
...

4. Подобно группе WEB, для каждого слоя также надо создать подгруппу METADATA, где указать тэги wms_title и wms_abstract:

LAYER
...
   METADATA
      wms_title "Countries 2"
      wms_abstract "Countries 2 test"
   END
...

5. Добавление возможности запросов к слоям карты

Для того, чтобы можно было получить информацию о объектах слоев карты, необходимо слелать две модификации.

В секцию METADATA самой карты нужно добавить

  • wms_featureinfoformat - тип возращаемых данных, обычно используется text/plain, можно также использовать text/html и text/gml;
  • wms_getfeatureinfo - полная ссылка (URL) на сервис;
WEB
...
	METADATA
	...
        wms_onlineresource         "http://gis-lab.info/cgi-bin/mapserv?map=/usr/local/www/website/map/wms.map&"
        wms_getfeatureinfo         "http://gis-lab.info/cgi-bin/mapserv?map=/usr/local/www/website/map/wms.map&"
        wms_featureinfoformat      "text/plain"
	END
END

Добавить тэг TEMPLATE сразу после описания типа слоя TYPE, а так же тэга wms_include_items, содержащего перечень полей из которых можно брать информацию в METADATA каждого слоя. Значение "all" этого тэга означает, что будут показываться все атрибуты.

LAYER
   ...
   TYPE         POLYGON
   TEMPLATE     "dummy"
   ...
   METADATA
		wms_title         "Countries 1"
		wms_abstract      "Countries 1 test"
		wms_srs           "EPSG:4326"
		wms_include_items "all"
   END
...

После этого в ПО ГИС можно будет пользоваться инструментами типа identify для просмотра атрибутивной информации по каждому объекту слоя.

Проверка WMS

Проверим созданный сервис с помощью специальной команды, ввести которую нужно в адресную строку браузера:

http://gis-lab.info/cgi-bin/wmstest?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities

Результатом выполнения этой команды является файл в формате XML, представляющий из себя ответ сервера содержащий описание сервиса. Этот файл также содержит полезную информацию в секциях <!--Warning...-->, где описываются ошибки, возникшие при чтении файла map и не соответствующие спецификации WMS 1.1.1.

Результирующий map-файл, после адаптации, должен выглядеть следующим образом:

MAP
  NAME           "WMS"
  STATUS         ON
  IMAGETYPE      PNG
  EXTENT         -97.238976 41.619778 -82.122902 49.385620
  SIZE           400 300
  SHAPEPATH      "/usr/local/www/gis-lab/data/programs/mapserver/wmstest/"
  UNITS DD
  IMAGECOLOR     255 255 255

  WEB
    TEMPLATE  "template.html"
    IMAGEPATH "/usr/local/www/gis-lab/data/tmp/"
    IMAGEURL  "/tmp/"
	METADATA
		wms_title                  "GIS-LAB Demo"
		wms_abstract               "This is the WMS demo from GIS-Lab"
		wms_onlineresource         "http://gis-lab.info/cgi-bin/mapserv?map=/path/to/wmstest/wms.map&"
		wms_srs                    "EPSG:4326"
		wms_getfeatureinfo         "http://gis-lab.info/cgi-bin/mapserv?map=/path/to/wmstest/wms.map&"
		wms_featureinfoformat      "text/plain"
	END
  END

  PROJECTION
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
  END

  LAYER # States polygon layer begins here
    NAME         states_poly
    DATA         states_ugl
    STATUS       ON
    TYPE         POLYGON
	TEMPLATE     "dummy"

    CLASSITEM    "CLASS"
    PROJECTION
		"proj=latlong"
		"ellps=WGS84"
		"datum=WGS84"
    END
    CLASS
      NAME "States"
      EXPRESSION "land" # Only polygons where "CLASS" = "land" will be drawn.
      STYLE
        COLOR      232 232 232
      END
    END
    CLASS
      NAME "Water"
      EXPRESSION "water" # Only polygons where "CLASS" = "water" will be drawn.
      STYLE
        COLOR      198 198 255
      END
    END
	METADATA
		wms_title         "Countries 1"
		wms_abstract      "Countries 1 test"
		wms_srs           "EPSG:4326"
		wms_include_items "all"
	END
  END

  LAYER
    NAME         states_line
    DATA         states_ugl
    STATUS       ON
    TYPE         LINE
	PROJECTION
		"proj=latlong"
		"ellps=WGS84"
		"datum=WGS84"
    END
    CLASSITEM    "CLASS"
    CLASS
      NAME       "State Boundary"
      EXPRESSION "land"
      STYLE
        COLOR    32 32 32
      END
    END
	METADATA
		wms_title    "Countries 2"
		wms_abstract "Countries 2 test"
		wms_srs      "EPSG:4326"
	END
  END

END

Работа с WMS в ПО ГИС - Практика

Мы иллюстрируем работу с созданным сервисом в QGIS, ArcGIS и ArcGIS Explorer, в большинстве современных ГИС есть средства загрузки и работы с такими слоями.

QGIS

WMS-слой в QGIS подключается с помощью Layer\Add WMS layer. В появившемся окне нужно нажать на кнопку New (новый) и ввести параметры нового соединения. При этом URL должен быть равен значению параметра wms_onlineresource, включая знак "&" в конце строки.

qgis-wms

После установки соединения необходимо выбрать и слои для загрузки.

qgis-wms

ArcGIS

В ArcGIS загрузка WMS-слоев производится через добавление темы. После чего в выпадающем списке (Look in) нужно выбрать GIS Servers, нажать на WMS Servers и ввести URL WMS.

arcgis-wms

После ввода URL нужно нажать на Get Layers и выбрать загружаемые слои.

arcgis-wms

ArcGIS Explorer

Подключение WMS-слоев, как и любых других данных в ArcGIS Explorer осуществляется через меню File\Open..., в котором нужно переключиться на раздел Servers и выбрать кнопку WMS. В появившееся окно нужно ввести адрес WMS-сервиса в интернет.

age-wms

После нажатия на Ok, будет предложено также выбрать некоторые параметры отображения, такие как растровое разрешение, отображаемые слои и зумирование после загрузки на загруженные слои.

age-wms

Так как WMS выдает данные в растровом формате, на мелких масштабах может быть заметна пикселизация.

Обсудить в форуме Комментариев — 21

Последнее обновление: September 09 2021

Дата создания: 04.02.2008
Автор(ы): Максим Дубинин