WMS客户端

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-05-17

介绍

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.7-dev OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML
SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO
SUPPORTS=SVG_SYMBOLS SUPPORTS=RSVG SUPPORTS=ICONV SUPPORTS=FRIBIDI
SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER
SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER
SUPPORTS=GEOS SUPPORTS=POINT_Z_M SUPPORTS=PBF INPUT=JPEG
INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

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

C:\ms4w> mapserv -v
MapServer version 7.6.0-dev (MS4W 4.0.3) OUTPUT=PNG OUTPUT=JPEG
OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE
SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS SUPPORTS=SVGCAIRO
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 SUPPORTS=POINT_Z_M SUPPORTS=PBF
INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE

映射文件配置

备注

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

存储临时文件

从MapServer版本6.0开始, wms_cache_to_disk 元数据已打开(对于低于6.0的MapServer),您必须设置 IMAGEPATH 中的值。 WEB 对象指向有效且可写的目录。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

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

LAYER
  ....
  DEBUG ON
  ...
END

配置HTTPS连接

请遵循 通过HTTPS访问OGC服务 文档以确保您的本地服务器可以通过HTTPS安全连接进行连接。

添加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/png"
  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" metadata

  • 描述: 要在GetMap请求中使用的图像格式。

    备注

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

"wms_name" metadata

  • 描述: 要从远程WMS服务器提取的层的逗号分隔列表。该值用于设置LAYERS和QUERY_LAYERS WMS URL参数。请注意,指定多个层时,逗号和层名称之间不得有任何空格。

"wms_server_version" metadata

  • 描述: 远程WMS服务器支持并将用于发出GetMap请求的WMS协议的版本。

"wms_srs" metadata

  • 描述: 远程服务器支持的EPSG投影代码的空格分隔列表。这通常是从服务器的功能输出中获得的。该值应为大写(epsg:4236.....而不是epsg:4236),以避免区分大小写的平台出现问题。该值用于设置SRS WMS URL参数。

可选层参数和元数据

明斯卡莱,马克斯卡莱

  • 描述: 如果远程服务器的功能包含该层的ScaleHint值,那么您可能希望在映射文件的Layer对象中设置MINSCALE和MAXSCALE。这将允许MapServer仅在有意义的比例下请求图层

投影对象

  • 描述: 在这一点上是可选的。如果需要,MapServer将在内部创建一个。包括一个可使MapServer避免在项目初始化文件中查找定义。

"wms_auth_username" metadata

  • 描述: MsEncrypt样式的授权字符串。也接受空字符串。

    METADATA
      "wms_auth_username" "foo"
      "wms_auth_password" "{FF88CFDAAE1A5E33}"
    END
    

"wms_auth_type" metadata

  • 描述: 授权类型。支持的类型包括:
    • 基本的

    • 消化

    • NTLM

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

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

    METADATA
      "wms_auth_type" "ntlm"
    END
    

"wms_connectiontimeout" metadata

  • 描述: 等待远程WMS层加载的最长时间,以秒为单位设置(默认为30秒)。此元数据可以在层级别添加,以便仅影响该层,也可以在地图级别(在Web对象中)添加,以便影响所有层。请注意,层级别的WMS_ConnectionTimeout的优先级高于MAP级别。

    METADATA
      ...
      "wms_connectiontimeout" "60"
      ...
    END
    

"wms_essential" metadata

7.6.0 新版功能.

  • 描述: 将其设置为“1”可将此WMS层标记为必需的。通常,当对WMS层的请求失败时,将跳过该层,并且在不使用该层的情况下渲染地图。如果该层是必需的,并且失败,则不会呈现贴图,并且会抛出异常。

    备注

    使能 wms_essential 这意味着如果连接出现问题(例如 CONNECTION 无法访问URL,或输入的URL不正确 wms_namewms_format )浏览器中将返回一个XML错误。如果您通过命令行调用MapServer,则您的 MAP 设置为 CONFIG "ON_MISSING_DATA" 仍将被用于在本地处理该错误的方式。

    METADATA
      ...
      "wms_essential" "1"
      ...
    END
    

"wms_exceptions_format" metadata

  • 描述: 设置例外的格式(从MapServer 4.6开始)。地图服务器默认为 application/vnd.ogc.se_inimage (例外情况是图片格式)。您可以检查服务器的GetCapability,以了解哪些格式可用于异常。这个 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" metadata

  • 描述: 将其设置为“1”以强制使用其自己的单独GetMap请求来请求此WMS层。默认情况下,MapServer将尝试将同一服务器中的多个相邻WMS层合并为单个多层GetMap请求,以减少远程服务器的负载并缩短响应时间。此元数据用于绕过该行为。

"wms_formatlist" metadata

  • 描述: 远程WMS服务器支持的图像格式的逗号分隔列表。请注意,仅当未设置WMS_FORMAT时才使用WMS_FORMAT列表。如果同时提供了WMS_FORMAT和WMS_FORMAT LIST,则WMS_FORMAT优先。

"wms_latlonboundingbox" metadata

  • 描述: 此图层的边界框以地理坐标表示,格式为“lon_min lat_min lon_max lat_max”。如果设置了该选项,则只有当地图视图与该边界框重叠时,MapServer才会请求该层。这通常是从服务器的功能输出中获得的。

    METADATA
      "wms_latlonboundingbox" "-124 48 -123 49"
    END
    

"wms_proxy_auth_type" metadata

  • 描述: 用于代理连接的授权类型。支持的类型包括:

    • 基本的

    • 消化

    • NTLM

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

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

    METADATA
      "wms_proxy_auth_type" "ntlm"
    END
    

"wms_proxy_host" metadata

  • 描述: 要与可选端口组件(例如‘192.168.2.10:8080’)一起使用的代理的主机名,格式为“.”

    METADATA
      "wms_proxy_host" "192.168.2.10"
    END
    

"wms_proxy_port" metadata

  • 描述: 用于代理连接的端口。

    METADATA
      "wms_proxy_port" "8080"
    END
    

"wms_proxy_type" metadata

  • 描述: 代理连接的类型。有效值为区分大小写的‘http’和‘socks5’。

    METADATA
      "wms_proxy_type" "http"
    END
    

"wms_proxy_username" metadata

  • 描述: 代理连接的msEncrypt样式字符串。也接受空字符串。

    METADATA
      "wms_proxy_username" "foo"
      "wms_proxy_password" "{FF88CFDAAE1A5E33}"
    END
    

"wms_sld_body" metadata

  • 描述: 可用于指定内联SLD文档。

"wms_sld_url" metadata

  • 描述: 可用于指定指向SLD文档的链接。

"wms_style" metadata

  • 描述: 要用于此层的GetMap请求中的样式参数的样式名称。

"wms_style_<stylename>_sld" metadata

  • 描述: 在GetMap请求中使用的SLD的URL。将元数据名称中的<style ename>替换为SLD应用到的样式的名称。

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

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

"wms_time" metadata

  • 描述: 要用于此层的GetMap请求中的时间参数的值。请参阅 WMS Time HowTo 了解更多信息。

"wms_bgcolor" metadata

  • 描述: 指定要用作地图背景的颜色。BGCOLOR的一般格式是RGB值的十六进制编码,其中红色、绿色和蓝色的每个值使用两个十六进制字符。每个值的范围都在00到FF之间(0到255,以10为基数)。格式为0xRRGGBB;RR、GG和BB值可以使用大写或小写字符。“0x”前缀应为小写“x”。

"wms_transparent" metadata

  • 描述: 指定是否将地图背景设置为透明。透明可以有两个值,“真”或“假”。如果未指定,MapServer会将默认值设置为“true”。

"wms_cache_to_disk" metadata

  • 描述: 将其设置为“1”可强制MapServer将获取的图像写入磁盘。写入磁盘是必要的,以利用MapServer的缓存逻辑来避免重新获取先前发出的WMS请求。此功能是MapServer6.0的新功能-以前的结果总是写入磁盘。

"wms_nonsquare_ok" metadata

  • 描述: 将其设置为“0”表示远程WMS仅支持正方形像素请求。在这种情况下,MapServer将谨慎地只发出正方形像素请求,即使这意味着与所需图像数据的分辨率相比在一维上进行过采样。此功能是MapServer 6.0的新增功能。

"wms_extent" metadata

  • 描述: 如果该层正好支持一个SRS(如WMS_SRS元数据中所列),并且设置了WMS_EXTEND元数据项(或通过EXTEND关键字指定的范围),则MapServer将注意仅在此区域内发出请求。这可以缩短请求完全在层外的时间,减少对只与目标地图区域部分重叠的层的处理,并避免在某些区域进行重新投影的不良行为。此元数据项的内容应为“minx miny Maxx Maxy”格式。此功能是MapServer 6.0的新增功能。

"wms_strict_axis_order metadata

  • 描述: 将其设置为“1”或“TRUE”以强制WMS请求根据EPSG代码使用严格的轴顺序,或将其设置为“0”或“FALSE”以强制WMS请求始终使用XY(或LONGLAT)轴顺序。只有当所选EPSG代码的服务器的轴顺序解释不符合标准时,这才是必要的:在WMS 1.0和1.1的情况下,假设总是使用XY(默认0/FALSE),对于WMS 1.3.0,假设是根据EPSG数据库严格的轴顺序(默认1/TRUE)。

备注

请注意,上述每一个元数据也可以称为“OWS_u*”而不是“WMS_*”。mapserver首先尝试“wms_u*”元数据,如果找不到,则尝试相应的“ows_*”名称。使用它可以减少支持多个OGC接口的映射文件中的重复量,因为“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核心。