WMS客户端

作者

Jeff McKenna

联系方式

jmckenna at gatewaygeomatics.com

最后更新

2019-06-15

介绍

WMS(或Web地图服务器)允许使用来自多个不同服务器的数据,并允许创建一个地图服务器网络,客户机可以从该网络构建自定义地图。以下文档包含有关使用MapServer的WMS连接类型在MapServer应用程序中包含来自远程WMS服务器的层的信息。

MapServer作为客户端时支持以下WMS版本:1.0.0、1.0.7、1.1.0、1.1.1、1.3.0(请参见 MapServer OGC规范支持 以获取更新的列表)。

本文档假定您已经熟悉MapServer的某些方面:

  • MapServer应用程序开发和设置.map文件。

  • 熟悉WMS规范将是一种优势。下面提供了到WMS规范文档的链接。

编译/安装

WMS连接类型由 --with-wmsclient 配置开关。它需要PROJ、GDAL和libcurl 7.10.1或更高版本。不想编译MapServer的Windows用户应该使用 MS4W (可供WMS/WFS客户机和服务器使用)或检查其他可用性 Windows binaries 支持WMS。

  • 有关PROJ和GDAL的安装,请参见MapServer编译HowTo (在Unix上编译 / 在Win32上编译

  • 为了 libcurl ,确保系统上安装了7.10.1或更高版本。你可以找到你的libcurl版本使用 curl config—版本. (如果系统预装了旧版本的libcurl,则必须在安装新版本之前将其卸载)

一旦安装了所需的库,就可以使用带有wmsclient*开关的*--配置mapserver(再加上您使用的所有其他开关),然后重新编译。这将为您提供一组新的可执行文件(可能还有php_mapscript.so,如果您请求的话)。有关安装详细信息,请参阅MapServer编译howto(上面的链接)。

检查您的MapServer可执行文件

要检查您的mapserv可执行文件是否包含WMS支持,请使用“-v”命令行开关并查找“supports=wms_client”。

例1。UNIX上的mapserv版本信息:

$ ./mapserv -v
MapServer version 7.0.1 OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ
SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=ICONV
SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER
SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI
SUPPORTS=THREADS SUPPORTS=GEOS INPUT=JPEG INPUT=POSTGIS INPUT=OGR
INPUT=GDAL INPUT=SHAPEFILE

例2。Windows上的MapServ版本信息:

C:\ms4w> setenv.bat

C:\ms4w> mapserv -v
MapServer version 7.0.1 (MS4W 3.1.3) OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML
SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=ICONV
SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER
SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI
SUPPORTS=THREADS SUPPORTS=GEOS INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL
INPUT=SHAPEFILE

安装可选的PROJ EPSG代码

(注意:安装这些项目代码是可选的,只有在需要时才安装)

一些加拿大WMS服务器将使用一些不包含在默认分发中的非标准投影代码(例如epsg:42304等)。如果计划使用MapServer连接到加拿大的WMS服务器,则可能需要 download a custom Canadian epsg file 使用这些代码,并将其解压缩到/usr/local/share/proj目录(或/ms4w/proj/nad/for ms4w用户)。

最后,ESRIWMS服务器还提供了自己的一系列非标准代码。如果您计划连接到ESRI WMS服务器,那么您可能需要一个包含加拿大代码和ESRI代码的自定义EPSG文件,允许您连接到任何服务器。下载 custom ESRI epsg file 并将其解压缩到/usr/local/share/proj(或/ms4w/proj/nad/for ms4w用户)。

Q

但是为什么不总是安装和分发proj4-epsg-with-42xxx-and-esri.zip文件呢,因为它更完整?

A

您应该只安装您需要的epsg投影代码,其中包含所有esri代码的epsg文件比默认文件大20%,因此它附带了您可能不需要的额外开销。还要注意,在创建WMS服务器时,为了真正实现互操作性,只应使用标准EPSG列表中的EPSG代码。也就是说,对于互操作性来说,使用自定义加拿大代码或自定义ESRI代码是一个坏主意,我们不希望太多地促进它们的使用。

Mapfile 配置

注解

必须在 Mapfile 中为地图设置投影,除非您确定所有WMS图层仅支持与地图投影相同的单个投影。可以使用“init=epsg:xxxx”代码或使用常规PROJ参数设置映射投影。未能设置映射投影可能会导致来自远程WMS服务器的空白映射(因为在WMS连接URL中使用了不一致的BBOX+SRS组合)。

存储临时文件

在版本6.0之前,以及在版本6.0中,当打开WMS缓存到磁盘元数据时,必须在 Mapfile 的Web对象中设置ImagePath值,以指向有效的可写目录。MapServer将使用此目录存储从远程服务器下载的临时文件。临时文件由MapServer自动删除,因此您不会注意到它们。

例3。在mapfile中设置imagepath参数

MAP
  ...
  WEB
    IMAGEPATH "/tmp/ms_tmp/"
    IMAGEURL ...
  END
  ...
END

MS4W用户应为ImagePath和ImageURL指定以下内容:

MAP
  ...
  WEB
    IMAGEPATH "/ms4w/tmp/ms_tmp/"
    IMAGEURL "/ms_tmp/"
  END
  ...
END

如果要保留此临时文件以进行调试,应将以下语句添加到 Mapfile 的层对象中:

LAYER
  ....
  DEBUG ON
  ...
END

添加WMS层

通过中的WMS连接类型访问WMS层 Mapfile . 下面是使用此连接类型的层的示例:

LAYER
  NAME "country_bounds"
  TYPE RASTER
  STATUS ON
  CONNECTION "https://demo.mapserver.org/cgi-bin/wms?"
  CONNECTIONTYPE WMS
  METADATA
    "wms_srs"             "EPSG:4326"
    "wms_name"            "country_bounds"
    "wms_server_version"  "1.1.1"
    "wms_format"          "image/gif"
  END
END

还可以将远程WMS层从服务器合并为一个层,用逗号(,)分隔,例如:

LAYER
  NAME "census_tracts"
  TYPE RASTER
  STATUS ON
  CONNECTION "http://tigerweb.geo.census.gov/arcgis/services/TIGERweb/tigerWMS_ACS2015/MapServer/WMSServer?"
  CONNECTIONTYPE WMS
  METADATA
      "wms_srs"             "EPSG:4326"
      "wms_name"            "Census Tracts,Census Tracts Labels"
      "wms_server_version"  "1.1.1"
      "wms_format"          "image/png24"
  END
END

注解

层名称必须用逗号分隔,逗号周围不能有空格。

所需的层参数和元数据

  • 连接类型WMS

  • CONNECTION -这是远程服务器的联机资源URL,只是没有任何WMS参数的基本URL。服务器版本、图像格式、层名称等将通过元数据提供,见下文。

注解

请注意,如果未设置连接参数值,则将使用“wms-onlineresource”元数据的值。如果同时设置了连接和“wms-onlineresource”,则优先使用“wms-onlineresource”元数据。

  • “wms_format”元数据-用于getmap请求的图像格式。

注解

如果提供了wms_格式列表,则wms_格式是可选的,并且mapserver将在wms_格式列表中选择第一个支持的格式,以用于getmap请求。如果同时提供了wms_格式和wms_格式列表,则wms_格式优先。另外请注意,WMS服务器只公布作为gd/gdal库一部分的支持格式。

  • “wms-name”元数据-要从远程wms服务器提取的层的逗号分隔列表。此值用于设置图层和查询图层wms url参数。注意,当指定多个图层时,逗号和图层名之间不能有任何空格。

  • “wms_server_version”元数据-远程wms服务器支持的wms协议版本,将用于发出getmap请求。

  • “wms-srs”元数据-远程服务器支持的以空格分隔的epsg投影代码列表。您通常从服务器的功能输出中得到这个。该值应为大写(epsg:4236…..而不是epsg:4236),以避免大小写敏感平台出现问题。该值用于设置SRS WMS URL参数。

可选层参数和元数据

  • MINSCALE, MAXSCALE -如果远程服务器的功能包含此层的scaleHint值,那么您可能需要在mapfile中的layer对象中设置minscale和maxscale。这将允许MapServer只在有意义的地方按比例请求层。

  • 投影对象 -在这一点上是可选的。如果需要,MapServer将在内部创建一个。包含一个可以使MapServer避免在PROJ init文件中查找定义。

  • “wms-auth-username”元数据-msencrypt-style授权字符串。也接受空字符串。

    METADATA
      "wms_auth_username" "foo"
      "wms_auth_password" "{FF88CFDAAE1A5E33}"
    END
    
  • “wms-auth-type”元数据-授权类型。支持的类型包括:

    • 基本的

    • 消化

    • NTLM

    • any(底层HTTP库在远程服务器支持的操作中选择最好的)

    • anysafe(底层HTTP库仅在远程服务器支持的选项中选择安全方法)

    METADATA
      "wms_auth_type" "ntlm"
    END
    
  • “wms-connectiontimeout”元数据-等待远程wms层加载的最长时间,以秒为单位设置(默认为30秒)。可以在层级别添加此元数据,以便它只影响该层,或者可以在映射级别(在Web对象中)添加此元数据,以便它影响所有层。请注意,层级别的wms-connectiontimeout优先于映射级别。

    METADATA
      ...
      "wms_connectiontimeout" "60"
      ...
    END
    
  • “wms_exceptions_format”元数据-设置异常的格式(从MapServer 4.6开始)。mapserver默认为 application/vnd.ogc.se_inimage (例外情况将采用图片格式)。您可以检查服务器的getCapabilities,以查看哪些格式可用于异常。这个 application/vnd.ogc.se_inimage 在WMS 1.1.1规范中,异常格式实际上是一种非必需的异常格式,因此有一些服务器不支持这种格式。在这种情况下,您将使用:

    LAYER
      ...
      METADATA
        "wms_exceptions_format" "application/vnd.ogc.se_xml"
      END
      ...
    END
    

    它将在MS_错误文件中返回此XML异常:

    Tue Jan 17 18:05:13 2006 - msDrawWMSLayerLow(): WMS server error.
    WMS GetMap request got XML exception for layer 'prov_bound':
    <?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>
    <!DOCTYPE ServiceExceptionReport SYSTEM
    "http://schemas.opengis.net/wms/1.1.1/exception_1_1_1.dtd">
    <ServiceExceptionReport version="1.1.1"><ServiceException
    code="LayerNotDefined">
    msWMSLoadGetMapParams(): WMS server error. Invalid layer(s)
    given in the LAYERS parameter.
    </ServiceException>
    </ServiceExceptionReport>
    
  • “wms_force_separate_request”元数据-将此设置为“1”,以强制使用自己的单独getmap请求请求此wms层。默认情况下,mapserver将尝试将来自同一服务器的多个相邻WMS层合并为单个多层getmap请求,以减少远程服务器上的负载并提高响应时间。此元数据用于绕过该行为。

  • “wms-formatlist”元数据-远程wms服务器支持的以逗号分隔的图像格式列表。请注意,只有在未设置wms_格式时才使用wms_格式列表。如果同时提供了wms_格式和wms_格式列表,则wms_格式优先。

  • “wms-lat lon bounding box”元数据-以地理坐标表示的该层的边界框,格式为“lon-min-lat-min-lon-max-lat-max”。如果设置了该选项,则只有当地图视图与该边界框重叠时,MapServer才会请求该层。您通常从服务器的功能输出中得到这个。

    METADATA
      "wms_latlonboundingbox" "-124 48 -123 49"
    END
    
  • “wms_proxy_auth_type”元数据-用于代理连接的授权类型。支持的类型包括:

    • 基本的

    • 消化

    • NTLM

    • any(底层HTTP库在远程服务器支持的操作中选择最好的)

    • anysafe(底层HTTP库仅在远程服务器支持的选项中选择安全方法)

    METADATA
      "wms_proxy_auth_type" "ntlm"
    END
    
  • “wms_proxy_host”元数据-要使用的代理的主机名,格式为“点四”格式,带有可选端口组件(例如“192.168.2.10:8080”)。

    METADATA
      "wms_proxy_host" "192.168.2.10"
    END
    
  • “wms_proxy_port”元数据-用于代理连接的端口。

    METADATA
      "wms_proxy_port" "8080"
    END
    
  • “wms_proxy_type”元数据-代理连接的类型。有效值是'http'和'socks5',区分大小写。

    METADATA
      "wms_proxy_type" "http"
    END
    
  • “wms_proxy_username”元数据-msencrypt-style字符串,用于代理连接。也接受空字符串。

    METADATA
      "wms_proxy_username" "foo"
      "wms_proxy_password" "{FF88CFDAAE1A5E33}"
    END
    
  • “wms-sld-body”元数据-可用于指定内联SLD文档。

  • “wms-sld-url”元数据-可用于指定指向SLD文档的链接。

  • “wms-style”元数据-用于此层的getmap请求中Styles参数的样式名称。

  • **“wms-style”(wms-style)用于getmap请求的sld的元数据**url。将metadta名称中的<style name>替换为sld应用的样式的名称。

    METADATA
      ...
      "wms_style"              "mystyle"
      "wms_style_mystyle_sld"  "http://my.host.com/mysld.xml"
      ...
    END
    

    有关MapServer中SLD的更多信息,请参阅 SLD HowTo document .

  • “wms-time”元数据-用于此层的getmap请求中的时间参数的值。请看 WMS Time HowTo 更多信息。

  • “wms-bgcolor”元数据-指定要用作地图背景的颜色。bgcolor的一般格式是对rgb值的十六进制编码,其中红色、绿色和蓝色值各使用两个十六进制字符。每个值的范围在00到FF之间(0到255,以10为基数)。格式为0xrrggbb;rr、gg和bb值允许使用大写或小写字符。“x”前缀的大小写应为“x”。

  • “wms_transparent”元数据-指定是否使地图背景透明。透明可以有两个值:“真”或“假”。如果未指定,则mapserver将默认值设置为“true”

  • “wms-cache-to-disk”元数据-将此设置为“1”,以强制mapserver将提取的图像写入磁盘。为了利用MapServer的缓存逻辑,避免重新蚀刻先前提出的WMS请求,需要写入磁盘。此功能是MapServer 6.0的新功能-以前的结果总是写入磁盘。

  • “wms_nonsquare_ok”元数据-将此设置为“0”,表示远程wms仅支持对平方像素的请求。在这种情况下,MapServer会小心地只发出方形像素请求,即使与所需图像数据的分辨率相比,它意味着在一个维度中进行过采样。此功能是MapServer 6.0的新功能。

  • “wms-extent”元数据-如果此层仅支持一个SRS(如wms-srs元数据中所列),并且如果设置了wms-extent元数据项(或通过extent关键字指定的扩展),则mapserver将只注意在此区域内发出请求。这样可以将请求完全短路到层外,减少对仅部分重叠目标映射区域的层的处理,并避免在某些区域进行重投影时出现不良行为。此元数据项的内容格式应为“minx miny maxx maxy”。此功能是MapServer 6.0的新功能。

  • “wms-strict-axis-order-metadata-将此设置为“1”或“true”以强制wms请求根据epsg代码使用严格的轴顺序,或“0”或“false”以强制wms请求始终使用xy(或lonlat)轴顺序。只有当所选EPSG代码的服务器轴顺序解释不符合标准时,才需要这样做:在WMS 1.0和1.1的情况下,假设始终使用xy(默认为0/false),对于WMS 1.3.0,假设根据EPSG数据库是严格的轴顺序(默认为1/true)。

注解

请注意,上述每一个元数据也可以称为“OWS_u*”而不是“WMS_*”。mapserver首先尝试“wms_u*”元数据,如果找不到,则尝试相应的“ows_*”名称。使用它可以减少支持多个OGC接口的 Mapfile 中的重复量,因为“OWS”元数据几乎可以在任何地方用于多个OGC接口共享的公共元数据项。

版本3.5和3.6中的旧连接参数格式(已弃用)

在MapServer版本3.5和3.6中,连接参数必须至少包括版本、层、格式和透明的WMS参数。此操作模式仍受支持,但已弃用,我们鼓励您使用元数据项来处理这些参数,如上面一节中所述。

下面是使用此不推荐使用的连接参数格式的层定义示例:

LAYER
 NAME "bathymetry_elevation"
 TYPE RASTER
 STATUS ON
 CONNECTIONTYPE WMS
 CONNECTION "http://demo.org/cgi-bin/wms?VERSION=1.1.0&LAYERS=bm&FORMAT=image/png"
 PROJECTION
   "init=epsg:4326"
 END
END

限制/TODO

  1. GetFeatureInfo不完全受支持,因为GetFeatureInfo的输出由远程服务器决定。对于希望访问FeatureInfo结果并直接处理这些结果的应用程序,已将method layer.getwmsFeatureInfoURL()添加到mapscript中。

  2. MapServer不尝试获取层的功能。在每次绘制地图时都这样做会非常低效。以及缓存那些不属于MapServer核心的信息。这在应用程序级别的脚本中做得更好,只有必要的信息通过连接字符串和元数据传递到MapServer核心。