Перепроецирование исходных данных
---------------------------------
Если планируется отображать WMS-слои поверх некоторых базовых слоёв, например
слоёв OpenStreetMap или Google Maps, то WMS слои должны быть приведены к
проекции этих базовых слоёв. Фактически это сводится к следующим операциям:
1. Извлечение векторных данных из хранилища и их трансформация в проекцию
базового слоя;
2. Собственно рендеринг данных.
В случае если число объектов в слое велико, то трансформация данных может
вызвать серьёзную нагрузку на процессор (ситуация может
усугубиться при большом количества одновременных запросов), поэтому, чтобы
избежать подобных расходов ресурсов системы лучше один раз перепроецировать
данные. Выполним это. Для этого создадим в наших таблицах дополнительные
поля и запишем в них трансформированные в проекцию `EPSG:3857`
(используемую большинством онлайн-сервисов) варианты оригинальных геометрий:
ALTER TABLE building_polygon ADD COLUMN webmercator geometry(MultiPolygon, 3857);
ALTER TABLE water_polygon ADD COLUMN webmercator geometry(Polygon, 3857);
ALTER TABLE highway_line ADD COLUMN webmercator geometry(MultiLinestring, 3857);
ALTER TABLE railway_station_point ADD COLUMN webmercator geometry(Point, 3857);
UPDATE building_polygon SET webmercator = ST_Transform(wkb_geometry, 3857);
UPDATE water_polygon SET webmercator = ST_Transform(wkb_geometry, 3857);
UPDATE highway_line SET webmercator = ST_Transform(wkb_geometry, 3857);
UPDATE railway_station_point SET webmercator = ST_Transform(wkb_geometry, 3857);
CREATE INDEX building_polygon_webmercator_idx ON "building_polygon" USING GIST (webmercator);
CREATE INDEX highway_line_webmercator_idx ON "highway_line" USING GIST (webmercator);
CREATE INDEX water_polygon_webmercator_idx ON "water_polygon" USING GIST (webmercator);
CREATE INDEX railway_station_point_webmercator_idx ON "railway_station_point" USING GIST (webmercator);
Чтобы проверить, что трансформирование осуществлено успешно, выполним
следующий запрос:
SELECT ST_AsText(wkb_geometry) "original", ST_AsText(webmercator) "transformed" FROM building_polygon LIMIT 10;
В результате выполнения данного запроса можно увидеть, что единицы измерения
координат геометрий в поле `wkb_geometry` и `webmercator` отличаются (
градусы и метры).
Публикация данных по WMS
------------------------
Для публикации данных в виде WMS-сервиса создайте
в домашней директории файл `wms.map` следующего содержания:
MAP
NAME "Vega WMS Server"
SYMBOLSET "symbols/symbols.sym"
FONTSET "fonts/fonts.list"
EXTENT 3.27621e+06 8.31941e+06 3.42256e+06 8.45391e+06
OUTPUTFORMAT
NAME "png"
EXTENSION "png"
MIMETYPE "image/png"
DRIVER AGG/PNG
IMAGEMODE RGBA
FORMATOPTION "INTERLACE=OFF"
END
PROJECTION
"init=epsg:3857"
END
WEB
METADATA
"wms_title" "WMS Demo Server for MapServer"
"wms_onlineresource" "http://10.22.0.9/wms"
"wms_srs" "EPSG:4326 EPSG:3857"
"wms_abstract" "Saint Petersburg demo WMS"
"wms_enable_request" "*"
"wms_encoding" "utf-8"
END
END
LAYER
NAME "water"
METADATA
"wms_title" "Водоёмы"
"gml_include_items" "all"
"wms_enable_request" "*"
"wms_extent" "3284564.58679982 8321239.84288729 3423908.74805983 8453366.89818672"
END
TEMPLATE dummy.html
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=pguser password=topsecret dbname=dbvega host=localhost"
DATA "webmercator from water_polygon"
LABELITEM "name"
CLASS
STYLE
COLOR 181 210 214
END
LABEL
FONT "tahoma"
TYPE truetype
SIZE 5
COLOR 31 99 176
POSITION lc
BUFFER 1
PARTIALS false
ANGLE auto
ENCODING utf-8
OUTLINECOLOR 255 255 2500
ANTIALIAS true
MINFEATURESIZE auto
END
END
END
LAYER
NAME "building"
METADATA
"wms_title" "Здания"
"gml_include_items" "all"
"wms_enable_request" "*"
"wms_extent" "3277518.64189396 8321348.77352887 3420433.60980062 8453918.88750861"
END
TEMPLATE dummy.html
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=pguser password=topsecret dbname=dbvega host=localhost"
DATA "webmercator from building_polygon"
CLASS
STYLE
COLOR 206 154 156
OUTLINECOLOR 106 106 106
END
END
END
LAYER
NAME "highway"
METADATA
"wms_title" "Дороги"
"gml_include_items" "all"
"wms_enable_request" "*"
"wms_extent" "3276208.16388569 8319410.71847594 3422561.49450513 8453914.64594435"
END
TEMPLATE dummy.html
TYPE LINE
CONNECTIONTYPE postgis
CONNECTION "user=pguser password=topsecret dbname=dbvega host=localhost"
DATA "webmercator from highway_line"
CLASS
STYLE
COLOR 255 255 255
WIDTH 3
OUTLINECOLOR 100 100 100
OUTLINEWIDTH 0.2
END
END
END
LAYER
NAME "railway_station"
METADATA
"wms_title" "Железнодорожные станции"
"gml_include_items" "all"
"wms_enable_request" "*"
"wms_extent" "3284920.3193646 8328134.62707164 3419784.09396769 8448902.44944274"
END
TEMPLATE dummy.html
TYPE POINT
CONNECTIONTYPE postgis
CONNECTION "user=pguser password=topsecret dbname=dbvega host=localhost"
DATA "webmercator from railway_station_point"
CLASS
STYLE
SYMBOL "station"
SIZE 10
END
END
END
END
По указанному в map-файле пути `SYMBOLSET` создайте файл [symbols.sym](../symbols/symbols.sym) и в
этот же каталог поместите файл [station.png](../symbols/station.png). Содержимое файла *symbols.sym*:
SYMBOLSET
SYMBOL
NAME "station"
TYPE pixmap
IMAGE "station.png"
END
END
По указаному в map-файле пути `FONTSET` расположите файл [fonts.list](../fonts/fonts.list) и в этот
же каталог поместите файл [tahoma.ttf](../fonts/tahoma.ttf). Содержимое файла *fonts.list*:
tahoma tahoma.ttf
* **wms_title** - обязательный параметр, человекочитаемы идентификатор сервера/слоя;
* **wms_onlineresource** - опциональный параметр, адрес WMS-сервиса (если не указан, то
вычисляется автоматически на основании имени хоста и пути до map-файла);
* **wms_srs** - список проекций в которых сервер может отдавать данные;
* **wms_abstract** - краткое описание сервера;
* **wms_enable_request** -список поддерживаемых запросов (GetCapabilities, GetMap, GetFeatureInfo и GetLegendGraphic):
"wms_enable_request" "GetMap GetFeatureInfo"
"wms_enable_request" "* !GetFeatureInfo"
* **wms_encoding** - кодировка XML-документа, возвращаемого сервером (GetCapabilities);
* **gml_include_items** - список возвращаемых атрибутов (GetFeatureInfo);
* **wms_extent** - охват слоя (GetCapabilities);