MapServer学习之 WMS

使用 MapServer 发布和处理 WMS

MapServer中,由 mapserv CGI 程序处理WMS请求,同时需要在map文件中设置恰当的元数据。

[TOC]

软件安装

检查是否支持WMS服务:

mapserv -v # 命令
# 查看输出内容是否包含 “SUPPORTS=WMS_SERVER”.

WMS的Map文件

更多的配置参考官网文档 http://mapserver.org/ogc/wms_server.html

用于WMS的Map文件同普通的map文件一样,但是有一些内容是必须的(或强烈建议设置):

  • MAP

    • NAME
    • PROJECTION
    • WEB 对象中的 METADATA
      • wms_title
      • wms_onlineresource
      • wms_srs (至少PROJECTION 对象需要使用 “init=epsg:…”进行设置)
      • wms_enable_request
  • 每个LAYER

    • NAME
    • PROJECTION
    • METADATA
      • wms_title
      • wms_srs (可选,因为可以继承自map对象的SRS信息)
    • STATUS
      • STATUS DEFAULT 将被发送给客户端
      • STATUS ON / OFF 可被客户端请求
    • TEMPLATE (GetFeatureInfo 请求时需要,查看 Templating )

###详细说明

  • Map Name 和 wms_title

    每一个图层的 WMS Capabilities 都需要一个 Name 和 Title 标签. Map 的 NAME 和 wms_title 元数据将被用作 GetCapabilities XML 输出的根图层(root layer)的 name 和 title. WMS 中的根图层与整个map文件上下文对应.

  • Map PROJECTION 和 wms_srs :

    WMS 服务器需要使用EPSG投影编码来说明其提供的数据的投影. 最新版本的 PROJ4 库自带了一个 EPSG 初始化编码表,允许用户采用如下方式定义投影:

    PROJECTION
    "init=epsg:4269" # epsg 需要为小写字母
    END

    很多时候,若数据的投影能够使用EPSG编码表示,采用上述方式设置就已足够,不再需要 wms_srs。但是,当数据的投影没有完全对应的EPSG编码时,就需要

    • 在PROJECTION部分使用PROJ4的方式定义真正的投影信息
    • 在wms_srs中定义可以使用的EPSG编码
    MAP
    NAME "DEMO"
    ...
    WEB
    ...
    METADATA
    "wms_title" "WMS Demo Server"
    "wms_onlineresource" "http://my.host.com/cgi-bin/mapserv?map=wms.map&"
    "wms_srs" "EPSG:4269 EPSG:4326"
    END
    END
    PROJECTION
    "init=epsg:42304" # 数据真正的投影
    END
    4...
    END
  • wms_onlineresource:

    wms_onlineresource 元数据在map的WEB对象中设置,指定用于访问你的服务器的URL . 在GetCapabilities 输出中这是必须的. 若没有设置 wms_onlineresource ,那么 MapServer 互尝试使用脚本的名称和主机名(hostname) 提供一个默认的地址。但强烈建议设置 wms_onlineresource 信息.

    基本上, wms_onlineresource 是一个完整的 HTTP URL,包括http://前缀, 主机名(hostname), 脚本名, “map=” 参数,并以?&结束

    一个有效的 online resource URL:

    http://my.host.com/cgi-bin/mapserv?map=mywms.map&

    上述URL看上去“很丑”。通过在服务器上建立一个包装脚本( wrapper script ),可以实现隐藏 “map=” 参数的目的 ,最后的URL看起来是这样的:

    http://my.host.com/cgi-bin/mywms?

    详细的内容后面介绍。

  • wms_enable_request:

    指定启用哪一个请求. 若没有指定,这没有请求被启用!

    • Layer Name 和 wms_title :

      每个单独的图层都需要它自己的唯一 name 和 title. 图层的名称(name)同时被用于 GetMap 和GetFeatureInfo 请求中表示需要添加到地图输出和请求中的图层. 图层名称必须以字母开头 (不应以数字开头并不能包含空格).

    • Layer PROJECTION 和 wms_srs :

      默认情况下,图层会继承其父图层的SRS (map的 PROJECTION ). 因此,虽然强烈建议,但是并不是必须要为每个图层设置 PROJECTION 和 wms_srs.

      图层的PROJECTION 和 wms_srs 设置方式同MAP中的一样.

      对于矢量图层,若提供了init=epsg:xxxx 形式的 PROJECTION ,则 MapServer 会用其来生成WMS capabilities文档中的BoundingBox标签. BoundingBox 是 WMS 1.3.0 规范中 capabilities 文档中必须的元素(因此,最好在每个图层提供init=epsg:xxxx 形式的 PROJECTION).

    • 配置 GetFeatureInfo 请求:

      REQUEST=GetFeatureInfo&INFO_FORMAT=text/plaintext/htmlgml

      http://demo.mapserver.org/cgi-bin/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&BBOX=-11.332970,24.121208,47.584718,57.965035&SRS=EPSG:4326&WIDTH=1001&HEIGHT=575&LAYERS=cities&STYLES=&FORMAT=image/png&TRANSPARENT=true&QUERY_LAYERS=cities&INFO_FORMAT=text/plain&X=229&Y=280

      必须设置图层的 TEMPLATE 参数才能使图层能够处理 GetFeatureInfo 的查询请求(参考 模板 Templating) . 对于 “text/html” 类型的请求,也需要设置图层的 HEADER 和 FOOTER 参数.

      LAYER
      NAME "test_layer"
      TYPE POLYGON
      METADATA
      "wms_title" "test_layer"
      "wms_srs" "EPSG:3857"
      END
      CONNECTIONTYPE postgis
      CONNECTION "host=xx.xx.xx.xx port=xxxx dbname='xxxx' user=xxxx password=xxxx"
      DATA "geom from xxx using unique gid using srid=3857"
      TEMPLATE "template.html" # for GetFeatureInfo
      CLASS
      NAME "polygon_style"
      STYLE
      COLOR "#5eff4d"
      OUTLINECOLOR "#ff4a2e"
      WIDTH 1
      END
      END
      END

修改Online Resource 的 URL

http://osgeo-org.1560.x6.nabble.com/Rewrite-rule-problem-td5339356.html

使用 Apache ReWrite 规则(Apache mod_rewrite)

未成功,not found

mod_rewrite 提供了基于正则表达式规则动态修改传入的请求的 URL 的方法。 这允许以自己喜欢的任意方法映射任意 URL 到你的内部 URL 结构。 (http://httpd.apache.org/docs/current/rewrite/ )

可以使用Apache 的 mod_rewrite 规则来避免指定 map文件地址,或者其他的任何参数。包括三个步骤:

  • 指定加载的 mod_rewrite 模块
  • 为选定的目录启用 mod_rewrite 模块
  • 编写用于重写的.htaccess文件

httpd.conf文件中,去掉 #LoadModule rewrite_module modules/mod_rewrite.so 中的#

为了启用这一模块,需要使用 AllowOverride 指令。可以对每个服务器或目录进行设置。若只有一个server,则 在https.conf文件中添加行:AllowOverride All。针对每个目录的设置是最简单的方式。在<virtualHost>部分添加内容:

<Directory myhtdocsdir>
AllowOverride All
</Directory>

myhtdocsdir 是实际的虚拟服务器中被定义为文档根路径的目录 (documentroot for the actual virtual server),即需要支持url重写的目录(如网站的目录)

设置好之后,需要重启Apache服务

(任何对httpd.conf文件的修改都需要重启服务才能生效。apache-restart.bat)。

在myhtdocsdir路径下新建 .htaccess文件,写入以下内容

RewriteEngine on
RewriteRule wmsmap?(.*) /cgi-bin/mapserv?map=/home/www/mapserverstuff/mymapfile.map&$1

这个规则的意思是: 给定一个以wmsmap为起始的网页,获取其查询参数,发起一个新的以 /cgi-bin/mapserv?map=(…)?开头的页面查询,并添加原始页面查询中的所有查询参数.

即,用wmsmap来指代/cgi-bin/mapserv?map=/home/www/mapserverstuff/mymapfile.map&,而不改变其查询参数,实现URL的重写。

如, URL wmsmap?mode=map 将被重写为/cgi-bin/mapserv?map=/home/www/mapserverstuff/mymapfile.map&mode=map

若 URL这是给出了wmsmap但没有带参数,将会抛出page not found错误,因为不匹配上述的wmsmap?的规则表达式.

使用Apache 环境变量- MS_MAPFILE

httpd.conf文件中(约400行),通过MS_MAPFILE 指定一个默认的 mapfile :

Alias /wms /usr/lib/cgi-bin/mapserver # "d:/ms4w/Apache/cgi-bin/mapserv.exe"
<Location /wms>
SetHandler cgi-script
Options ExecCGI
SetEnv MS_MAPFILE /path/to/mymapfile.map # "d:/ms4w/apps/cgi-viewer/map/wmsdemo1.map"
</Location>
# http://localhost/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
<Location /wms/demo1>
SetHandler cgi-script
Options ExecCGI
SetEnv MS_MAPFILE /path/to/mymapfile.map # "d:/ms4w/apps/cgi-viewer/map/wmsdemo1.map"
</Location>
# http://localhost/wms/demo1?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities

测试

GetCapabilities

http://demo.mapserver.org/cgi-bin/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities

wms_onlineresource 的URL后面加上请求参数 (不需要指定图层) SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities

返回结果的 MIME type为 application/vnd.ogc.wms_xml (这是一个坑)

发送GetCapabilities请求时出现下载 mapserv.exe 或 mapserv 文件的问题:

这是由于浏览器不识别1.1.1版本WMS返回数据的 MIME type,即 application/vnd.ogc.wms_xml , 将请求的VERSION版本改为 1.3.0 则可正常打开。

实际上下载的 mapserv.exe 或 mapserv 并非可执行的exe文件,用文本编辑器打开之后,可以发现其实是WMT_MS_Capabilities文档,或者是错误信息(若map配置有错的话)。这和访问上面MapServer给出的测试链接,即http://demo.mapserver.org/cgi-bin/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities时下载的内容是相似的,因为其修改了wms_onlineresource地址,所有文件名不同。

https://gis.stackexchange.com/questions/23605/wms-request-fails

GetMap

http://demo.mapserver.org/cgi-bin/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-180,-90,180,90&SRS=EPSG:4326&WIDTH=953&HEIGHT=480&LAYERS=bluemarble,cities&STYLES=&FORMAT=image/png&TRANSPARENT=true

####所需参数:

  • VERSION=version: 请求版本,1.1.1 或 1.3.0 (版本不同,请求参数有差异,混用可能导致空白页面)

  • REQUEST=GetMap: 请求的名称

  • LAYERS=layer_list: 逗号分隔的图层列表(Comma-separated list). 如 LAYERS=bluemarble,cities。若提供了 SLD 参数则此项为可选的.

  • STYLES=style_list: 逗号分隔的、每一个请求图层的渲染样式列表(Comma-separated list). 若提供了 SLD 参数则此项为可选的.

    若使用默认样式,设置 “STYLES=”为空. 支持命名样式(由map文件中的 CLASS GROUP 名称控制)

  • SRS=namespace:identifier: Spatial Reference System, 如 EPSG:4326(1.3.0 改为CRS)

  • BBOX=minx,miny,maxx,maxy: 左下,右上角坐标,采用SRS定义的单位

  • WIDTH=output_width: Width in pixels of map picture. 宽

  • HEIGHT=output_height: Height in pixels of map picture. 高

  • FORMAT=output_format: 输出地图的格式,如 FORMAT=image/png

SLD 可参考 http://docs.geoserver.org/latest/en/user/styling/sld/index.html

GetLegendGraphic

绘制图层中所有定义的 CLASS 的图标和标签。

http://127.0.0.1/cgi-bin/mapserv.exe?SERVICE=WMS&VERSION=1.1.1&layer=park&
REQUEST=getlegendgraphic&FORMAT=image/png

####要求在Map文件中具备以下内容:

  • LEGEND 对象.
  • 每个图层中定义了 CLASS 对象.
  • CLASS 对象中定义了 NAME .
  • 每个 LAYER 的 STATUS 必须为 ON.

####请求参数:

  • LAYER - (必须) 需要返回图例图形的WMS图层的名称,同 GetCapabilities 请求中的图层名称一样
  • FORMAT - (必须) 如. image/png
  • WIDTH - (可选) 图例图形的宽度. 只有当使用Rule参数时,才需要设置此参数
  • HEIGHT - (可选) 图例图形的高度,同上.
  • SLD - (可选) SLD的 URL. Applies the SLD on the layer and the legend is drawn after the SLD is applied (using the classes specified by the SLD). Note here that you need to put aclass1inside the Rule element so that a class name is created from the SLD and therefore a correct legend image.
  • SLD_BODY - (可选) The body (code) of the SLD, instead of specifying a URL (as in the ‘SLD’ parameter).
  • SLD_VERSION - (可选).
  • SCALE - (可选) 指定比例尺,满足此比例尺的图层才会生成图例
  • STYLE - (可选) The style.
  • RULE - (可选) 指定 CLASS 的名称来生成图例图片 (相对于为图层的所有 CLASS生成图例).

基于内容的图例

当客户端发送的 GetLegendGraphic 请求包含(non-standard) BBOX, SRS/CRS 和 WIDTH/HEIGHT 参数时,且图层为POINT, LINE 和POLYGON 时支持。

WMS 1.3.0

###相对1.1.1需要注意的变化:

  • 坐标轴的变化
  • 新的坐标参考系统
  • 使用 CRS 代替 SRS 参数
  • GetMap 中的 EXCEPTIONS 参数有效值为 XML, INIMAGE, BLANK
  • GetFeatureInfo 中的 EXCEPTIONS 参数有效值为 XML
  • 新增了 LayerLimit 参数, 允许服务器发布和限制客户端在 GetMap 请求中允许包含的图层数量。
  • WMS 1.3.0 Post 请求应该是一个包含不同操作和参数的XML文档

在之前版本的WMS中,横轴(easting)为 x 或 经度(lon),纵轴(northing)为 y 或纬度(lat)。而在WMS1.3.0 中,根据 CRS 的不同,x 轴不一定是东西向(may or may not be oriented West-to-East,大部分是), y 轴也不一定是南北向。WMS 的描述操作决定了轴的顺序. 这一点对一些常用的 EPSG 代码有影响,如 ESPG:4326(WGS 84 latitude-longitude).

WMS 1.3.0 规范中支持的坐标系统:

  • CRS:84 (WGS 84 longitude-latitude)
  • CRS:83 (NAD83 longitude-latitude)
  • CRS:27 (NAD27 longitude-latitude)
  • AUTO2:42001 (WGS 84 / Auto UTM )
  • AUTO2:42002 (WGS 84 / Auto Tr. Mercator)
  • AUTO2:42003 (WGS 84 / Auto Orthographic)
  • AUTO2:42004 (WGS 84 / Auto Equirectangular)
  • AUTO2:42005 (WGS 84 / Auto Mollweide)

例子

  • CRS:84 且 BBOX 坐标为 经度-纬度 long/lat

    BBOX=-180,-90,180,90&CRS=CRS:84

  • ESPG:4326 且 BBOX 坐标为 纬度-经度 lat/long:

    BBOX=-90,-180,90,180&CRS=EPSG:4326


##示例

MAP
NAME "WMS-test"
STATUS ON
SIZE 400 300
EXTENT -2200000 -712631 3072800 3840000
UNITS METERS
SHAPEPATH "../data"
IMAGECOLOR 255 255 255
FONTSET ../etc/fonts.txt
WEB
IMAGEPATH "/ms4w/tmp/ms_tmp/"
IMAGEURL "/ms_tmp/"
METADATA
"wms_title" "WMS Demo Server" ##required
"wms_onlineresource" "http://yourpath/cgi-bin/mapserv.exe?" ##required
"wms_srs" "EPSG:42304 EPSG:42101 EPSG:4269 EPSG:4326" ##recommended
"wms_enable_request" "*" ##necessary
END
END # Web
PROJECTION
"init=epsg:42304" ##required
END
SYMBOL
NAME "circle"
TYPE ellipse
POINTS 1 1 END
END # Symbol
#
# Start of layer definitions
#
LAYER
NAME "park"
METADATA
"wms_title" "Parks" ##required
END
TYPE POLYGON
STATUS OFF
DATA park
PROJECTION
"init=epsg:42304" ##recommended
END
CLASS
NAME "Parks"
STYLE
COLOR 200 255 0
OUTLINECOLOR 120 120 120
END # Style
END # Class
END # Layer
LAYER
NAME popplace
METADATA
"wms_title" "Cities" ##required
END
TYPE POINT
STATUS ON
DATA popplace
PROJECTION
"init=epsg:42304" ##recommended
END
CLASS
NAME "Cities"
STYLE
SYMBOL "circle"
SIZE 8
COLOR 0 0 0
END # Style
END # Class
END # Layer
END # Map File

参考博客:

MapServer 之 发布 WMS GetFeatureInfo 服务

MapServer 之 发布网络地图服务(WMS-Web Map Service)

MapServer 之 发布网络覆盖数据服务(WCS-Web Coverage Service)

MapServer GeoJSON output template

文章目录
  1. 1. 使用 MapServer 发布和处理 WMS
    1. 1.1. 软件安装
    2. 1.2. WMS的Map文件
    3. 1.3. 修改Online Resource 的 URL
      1. 1.3.1. 使用 Apache ReWrite 规则(Apache mod_rewrite)
      2. 1.3.2. 使用Apache 环境变量- MS_MAPFILE
    4. 1.4. 测试
      1. 1.4.1. GetCapabilities
      2. 1.4.2. GetMap
    5. 1.5. GetLegendGraphic
      1. 1.5.0.1. 基于内容的图例
  2. 1.6. WMS 1.3.0
    1. 1.6.1. 例子
|