О том, как из просто веб-карты сделать WMS-сервис.
Обсудить в форуме Комментариев  21
Данная статья, помимо перевода соответствующего пункта документации к программному пакету Mapserver, также ставит целью предоставить конкретный, работающий пример, иллюстрирующий создание WMS сервиса с помощью Mapserver и его дальнейшее использование в ПО умеющем работать с такими сервисами, в нашем случае мы иллюстрируем работу с созданным сервисом в QGIS, ArcGIS и ArcGIS Explorer.
В статье подразумевается, что вы уже умеете создавать интернет-карты с помощью Mapserver, в обратном случае, рекомендуем сначала ознакомиться с описанием для начинающих. Подразумевается, что у читателя уже есть собранный и работающий проект Mapserver. Дальнейшее описание показывает, как из просто интернет-карты сделать сервис отвечающий спецификации WMS 1.1.1, позволяющий работать с своими данными в клиентском ПО ГИС. Для создания подобного сервиса необходим Mapserver версии 3.5 и выше.
Содержание
WMS (или Web Map Server - Сервер картографической информации) помимо просто отображения инфромации с помощью браузера, также позволяет пользователю использовать свои данные в ПО ГИС, в пользовательской ГИС таким образом может быть загружены данные из нескольких WMS, дополнительно к ним могут быть добавлены данные самого пользователя. Mapserver поддеживает спецификацию WMS версии 1.1.1, которая поддерживается Open Geospatial Consortium (OGC).
Проверка поддержки WMS в Mapserver
Перед тем как начать работу необходимо убедиться в том, что ваша версия Mapserver поддерживает WMS, для этого необходимо выполнить следующую команду в Windows-версии Mapserver:
или такую команду в Unix-версии, находясь в директории cgi-bin веб-сервера:
Если в результате выполнения команд, в описании Mapserver содержится подстрока SUPPORTS=WMS_SERVER, значит WMS поддерживается. Примерное содержание результата выполнения этих команд такое:
Адаптация 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 и задать в ней тэги:
...
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 самой карты нужно добавить
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 для просмотра атрибутивной информации по каждому объекту слоя.
Проверим созданный сервис с помощью специальной команды, ввести которую нужно в адресную строку браузера:
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
            Мы иллюстрируем работу с созданным сервисом в QGIS, ArcGIS и ArcGIS Explorer, в большинстве современных ГИС есть средства загрузки и работы с такими слоями.
WMS-слой в QGIS подключается с помощью Layer\Add WMS layer. В появившемся окне нужно нажать на кнопку New (новый) и ввести параметры нового соединения. При этом URL должен быть равен значению параметра wms_onlineresource, включая знак "&" в конце строки.
 
 
После установки соединения необходимо выбрать и слои для загрузки.

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

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

Так как WMS выдает данные в растровом формате, на мелких масштабах может быть заметна пикселизация.
Обсудить в форуме Комментариев  21
Последнее обновление: September 09 2021
Дата создания: 04.02.2008
Автор(ы): Максим Дубинин
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).