SOS服务器

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-03-27

介绍

SOS(传感器观测服务),目前是一份OGC讨论文件,是OGC传感器网络启用(SWE)规范组的一部分。这些规范描述了应用程序和服务如何能够通过网络访问所有类型的传感器。具体来说,SoS提供了一个用于管理已部署传感器和检索传感器数据的API。

SOS支持是 在MapServer 4.10.0或更高版本中可用 。请注意,MapServer for SOS中当前不存在任何客户端工具;您可以尝试 QGIS 桌面及其插件,或者尝试使用诸如 OpenLayers 作为一个客户。

根据MapServer的指导方针,在MapServer中实现了SoS支持 MS RFC 13:MapServer中的传感器观测服务支持 .

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

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

相关定义

以下内容摘自SoS 1.0.0规范:

观察

观察是一个具有描述某些现象的结果的事件。

观察提供

观察提供是服务提供的以某种方式相关的观察的逻辑分组。

观测值

描述一种自然现象的值,它可以使用各种尺度中的一种,包括名义、序数、比率和区间。

传感器

能够观察现象并返回观察值的实体。传感器可以是一种仪器或一个活的有机体(例如人)。

使用mapserver设置SOS服务器

安装所需软件

SoS请求由 MAPSERV公司 “CGI程序”。第一步是检查您的mapserv可执行文件是否包含SoS支持。验证这一点的一种方法是使用“-v”命令行开关并查找“supports=sos_server”。

例1。在UNIX上:

$ ./mapserv -v
MapServer version 4.9 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER
SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT
SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=THREADS INPUT=JPEG
INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE DEBUG=MSDEBUG

例2。在Windows上:

C:\MS4W\Apache\cgi-bin> mapserv -v
MapServer version 4.9 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER
SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT
SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=THREADS INPUT=JPEG
INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE DEBUG=MSDEBUG

备注

Windows用户可以安装 MS4W 支持SOS服务器。

如果您的mapserver构建中不支持sos,那么您必须在编译mapserver时考虑以下几点:

  • 标记*-必须填写“duse-sos-svr”

  • 需要启用*-duse-wms-svr*或*-duse-wfs-svr*标志

  • 需要libxml2和proj库

  • 需要Windows上的ICONV支持(-duse_ICONV

有关mapserver编译的更多帮助,请参阅相应的howto: Unix / Windows

为SoS配置映射文件

您设置的每个SOS服务器实例都需要有自己的映射文件。它只是一个常规的mapserver映射文件,其中一些参数和一些元数据条目是必需的。为了生成有效的getCapabilities输出,大多数元数据都是必需的。

以下是参数和元数据项的列表,这些参数和元数据项通常是MapServer的可选项,但对于SoS配置是**必需的(或强烈推荐的):。**

地图级别:

  • 地图名称

  • 地图投影

  • 映射元数据(在Web对象中):

    • sos_title

    • sos_onlineresource

    • sos_srs

    • sos_enable_request

    • Reference Section 完整的元数据和描述列表

层级别:

  • 层名称

  • 层投影

  • 层元数据

    • sos_offering_id

    • sos_observedproperty_id

    • sos_observedproperty_id

    • sos_describesensor_url

    • Reference Section 完整的元数据和描述列表

OnlineResource URL

SOS联机资源元数据在映射的Web对象元数据中设置,并指定用于访问服务器的URL。这对于getCapabilities输出是必需的。如果没有提供sos-onlineresource,那么mapserver将尝试使用脚本名和主机名提供一个默认的,但是您不应该过分依赖它。强烈建议您提供SOS在线资源元数据。

以下是有效的联机资源URL:

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

通过在服务器上创建包装脚本,可以从URL中隐藏“map=”参数,然后服务器的联机资源URL可以类似于:

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

这将在 WMS Server 文件。

备注

强烈建议您查看 MAP= 通过设置来调用MapServer可执行文件 MS_MAP_PATTERNMS_MAP_NO_PATH 或者隐藏 MAP= 参数,如本文档中所建议的 限制 Mapfile 访问 。中列出了保护服务器安全的所有可能环境变量 环境变量

SOS服务器映射文件示例

下面是一个最小裸SoS服务器映射文件的示例。注意所需参数的注释。

MAP
  NAME "SOS_DEMO"
  STATUS ON
  SIZE 300 300
  EXTENT -66 44 -62 45
  UNITS METERS
  SHAPEPATH "./data/"
  IMAGECOLOR 255 255 0
  SYMBOLSET "./etc/symbols.sym"

  IMAGETYPE png

  WEB
    IMAGEPATH "/ms4w/tmp/ms_tmp/"
    IMAGEURL "/ms_tmp/"

    METADATA
      "sos_onlineresource" "http://127.0.0.1/mapserv?map=/sos/sos_test.map" ## REQUIRED
      "sos_title"          "My SOS Demo Server" ## Recommended
      "sos_srs"            "EPSG:4326" ## REQUIRED
      "sos_enable_request" "*" ## REQUIRED
    END
  END

  PROJECTION
    "init=epsg:4326"
  END

  LAYER
    NAME "test_sos_layer"
    METADATA
      "sos_procedure"  "NS01EE0014" ## REQUIRED
      "sos_offering_id" "WQ1289" ## REQUIRED
      "sos_observedproperty_id" "Water Quality" ## REQUIRED
      "sos_describesensor_url" "http://some/url/NS01EE0014.xml" ## REQUIRED
    END
    TYPE POINT
    STATUS ON
    DATA "sos_test"

    PROJECTION
      "init=epsg:4326"
    END

    CLASS
      NAME "water quality"
      STYLE
        COLOR 255 0 0
        SYMBOL "circle"
        SIZE 8
      END
    END
  END

END #map

测试SOS服务器

获取能力请求

getCapabilities请求允许客户机检索有关特定服务实例的服务元数据。对于SoS服务,它允许识别产品和观察到的可用财产,以及所用传感器的信息。

使用Web浏览器,访问服务器的联机资源URL,在其末尾添加参数“service=sos&request=getcapabilities”,例如。

http://my.host.com/cgi-bin/mapserv?MAP=mysos.map&SERVICE=SOS&REQUEST=GetCapabilities

如果一切顺利,您应该有一个完整的XML功能文档。搜索“警告”一词…MapServer插入以“<!”开头的XML注释。--警告:“在XML输出中,如果检测到丢失的mapfile参数或元数据项。如果在XML输出中注意到任何警告,那么在使用SOS客户机尝试服务器之前,必须修复所有警告,否则事情可能无法正常工作。

备注

所有SOS请求都需要服务参数。

获取观察请求

GetObservation请求旨在查询传感器系统,以便以观测和测量规范(O&M)中定义的形式检索观测数据,有关该观测和测量规范的更多信息,请访问https://www.ogc.org/standards/om.在收到GetObservation请求后,SOS应满足该请求或返回异常报告。

以下是GetObservation请求的可能参数列表:

请求:

服务:

版本:

提供:

观察的性能:

能力文件。

响应格式:

通过回应。

eventTime (可选)指定

需要观察。

程序:

使用。在此实现中,该过程相当于在执行描述传感器请求时将使用的传感器ID。

兴趣特征:

用定义上下角的GML信封表示。

结果:

基于属性值的OGC筛选表达式。

结果模型:

用于请求的数据。SOS服务器支持的resultmodel值列在服务元数据(getcapabilities)的内容部分中。MapServer目前支持OM:观察和OM:测量。OM:测量提供了几何图形和属性的平面模型,类似于WFS GetFeature输出。OM:观察提供了一个更紧凑的定义,其中包括字段名和定义的XML头,后跟一个由分隔记录组成的“数据块”(默认值为csv分隔的输出)。默认输出为OM:Measurement。

SRSNEX:

以下是一些有效的例子:

例1:

http://127.0.0.1/cgi-bin/mapserv.exe?map=D:/ms4w/apps/sos/sos_test.map&
Request=GetObservation&service=SOS&Offering=WQ1289&
observedproperty=Water Quality&version=1.0.0&
responseFormat=text/xml; subtype="om/1.0.0"

例2:

http://127.0.0.1/cgi-bin/mapserv.exe?map=D:/ms4w/apps/sos/sos_test.map&
Request=GetObservation&service=SOS&Offering=WQ1289&
observedproperty=Water Quality&eventtime=<ogc:TM_Equals><gml:TimePeriod>
<gml:beginPosition>1991-05-01</gml:beginPosition><gml:endPosition>
1993-02-02</gml:endPosition></gml:TimePeriod></ogc:TM_Equals>
&result=<Filter><Or><PropertyIsEqualTo><PropertyName>COLOUR
</PropertyName><Literal>180</Literal></PropertyIsEqualTo>
<PropertyIsEqualTo><PropertyName>COLOUR</PropertyName><Literal>200
</Literal></PropertyIsEqualTo></or></Filter>&version=1.0.0
&responseFormat=text/xml; subtype="om/1.0.0"

例3:

http://127.0.0.1/cgi-bin/mapserv.exe?map=D:/ms4w/apps/sos/sos_test.map&
Request=GetObservation&service=SOS&Offering=WQ1289&
observedproperty=Water Quality&featureofinterest=<gml:Envelope>
<gml:lowerCorner srsName='EPSG:4326'>-66 43</gml:lowerCorner>
<gml:upperCorner srsName='EPSG:4326'>-64 45</gml:upperCorner>
</gml:Envelope>&version=1.0.0&
responseFormat=text/xml; subtype="om/1.0.0"

例4:

http://127.0.0.1/cgi-bin/mapserv.exe?map=D:/ms4w/apps/sos/sos_test.map&
Request=GetObservation&service=SOS&Offering=WQ1289&
observedproperty=Water Quality&version=1.0.0&
responseFormat=text/xml; subtype="om/1.0.0"&resultModel=om:Observation

描述传感器请求

DescribeSensor请求使客户能够检索特定传感器的特征,并在sensorML XML文档中返回信息。在此实现中,MapServer不会生成sensorML文档,而是将请求重定向到现有sensorML文档。

以下是描述传感器请求的可能参数列表:

请求:

服务:

版本:

程序:

在“SoS_过程”元数据中。

输出格式:

反应。

下面是一个有效的例子:

http://127.0.0.1/cgi-bin/mapserv.exe?map=D:/ms4w/apps/sos/sos_test.map&
Request=DescribeSensor&procedure=urn:ogc:def:procedure:NS01EE0014&
service=SOS&version=1.0.0&outputFormat=text/xml; subtype="sensorML/1.0.0"

限制/TODO

1。让MapServer生成sensorML文档,而不是将请求重定向到现有sensorML文档。

参考截面

以下元数据在SOS服务器映射文件的设置中可用:

备注

下面的每个元数据也可以称为“OWS”而不是“SOS”。mapserver首先尝试“sos_u*”元数据,如果找不到,则尝试相应的“ows_*”名称。使用它可以减少支持多个OGC接口的映射文件中的重复量,因为“OWS”元数据几乎可以在任何地方用于多个OGC接口共享的公共元数据项。

Web对象元数据

ows_allowed_ip_list (或sos-allowed-ip-u列表)

  • *描述:*(可选)允许访问服务的IP地址列表。

    例子::

    METADATA
      "ows_allowed_ip_list" "123.45.67.89 11.22.33.44"
    END
    

ows_denied_ip_list (或SOS_拒绝的_IP_列表)

  • *描述:*(可选)拒绝访问服务的IP地址列表。

    例子::

    METADATA
      "ows_denied_ip_list" "123.45.67.89 11.22.33.44"
    END
    

ows_language

  • *描述:*(可选)有关服务器的详细信息的描述性叙述。所有包含的异常文本值使用的语言的标识符。这些语言标识符应符合IETF RFC 1766的规定。如果省略此属性,则不会标识所使用的语言。示例:“en-ca”、“fr-ca”、“en-us”。默认值为“en-us”。

ows_schemas_location

  • *描述:*(可选)(注意名称OWS模式位置而不是SOS/uu…这是因为所有的OGC Web服务(OWS)都使用相同的元数据)根目录树,其中包含OGC SOS XMLSchema文件系列。如果希望在验证XML分析器中验证SOS输出,则此URL必须是实际.xsd文件所在的有效URL。默认值为http://schemas.opengis.net/sos/。

ows_updatesequence

  • *描述:*(可选)updateSequence参数可用于维护服务元数据文档内容的客户端缓存的一致性。参数值可以是整数、时间戳(采用[ISO 8601:2000]格式)或任何其他数字或字符串。

sos_abstract

  • *描述:*(可选)有关服务器的详细信息的描述性叙述。

sos_accessconstraints

  • *描述:*(可选)描述服务提供者对SoS施加的任何访问约束或从此服务检索到的数据的文本。

SOS地址类型、SOS地址、SOS城市、SOS国家、SOS邮政编码、SOS州或省

  • *说明:*可选联系人地址信息。如果提供,则需要所有六个元数据项。

sos_contactelectronicmailaddress

  • *说明:*可选联系人电子邮件地址。

sos_contactfacsimiletelephone

  • *说明:*可选联系人传真电话号码。

sos_contactinstructions

  • *说明:*(可选)关于如何或何时联系个人或组织的补充说明。

SOS联络组织、SOS联络人、SOS联络位置

  • *说明:*可选联系信息。如果提供,则需要所有三个元数据项。

sos_contactvoicetelephone

  • *说明:*可选联系人语音电话号码。

sos_enable_request (或) ows_enable_request)

  • *说明:*要启用的请求的以空格分隔的列表。默认值为“无”。可以启用以下请求: GetCapabilities, GetObservationDescribeSensor.

  • 实例:

    GetCapabilitiesGetObservation:

    "sos_enable_request" "GetCapabilities GetObservation"
    

    启用除'getcapabilities'之外的所有请求`

    "sos_enable_request" "* !GetCapabilities"
    

sos_encoding_blockSeparator

  • *描述:*(可选)对于使用resultmodel=om:observation(SWE数据块编码)的getobservation请求。要使用的记录分隔符。默认值为'n'

sos_encoding_tokenSeparator

  • *描述:*(可选)对于使用resultmodel=om:observation(SWE数据块编码)的getobservation请求。要使用的标记(字段)分隔符。默认是

sos_fees

  • *说明:*(可选)费用信息。如果没有费用,请使用保留字“无”。

sos_hoursofservice

  • *描述:*(可选)个人可以联系组织或个人的时间段(包括时区)。

sos_keywordlist

  • *描述:*(可选)以逗号分隔的关键字或关键字短语列表,以帮助目录搜索。

sos_maxfeatures

  • *描述:*(可选)SoS服务器返回的元素数。如果未设置,则返回所有观察值

sos_onlineresource

  • *描述:*(必需)将用于访问此OGC服务器的URL。此值用于getCapabilities响应。

  • 有关详细信息,请参阅上面的“onlineresource url”部分。

sos_role

  • *说明:*(可选)责任方执行的功能。该角色的可能值应包括ISO 19115:2003子条款B.5.5中列出的值和含义。

sos_service_onlineresource

  • *描述:*(可选)顶级OnlineResource URL。

sos_srs

  • 描述: (必需)包含EPSG投影代码的列表,这些代码应通告为可用于此服务器中的所有层。该值可以包含一个或多个以空格分隔的EPSG:<code>对(例如“EPSG:4269 EPSG:4326”)该值应为大写(EPSG:3978.....而不是EPSG:3978),以避免区分大小写的平台出现问题。

sos_title

  • *描述:*(推荐)此层的可读名称。

层对象元数据

ows_allowed_ip_list

与Web对象中的“允许使用”列表相同。

ows_denied_ip_list

与Web对象中的“OWS拒绝”列表相同。

sos_describesensor_url

  • *描述:*(必需)此元数据项只是在从MapServer生成描述传感器之前的临时度量。现在,当用一个过程(sensorid)发送一个describeSensor请求时,它将把它重定向到这个元数据项定义的URL。

  • 在MapServer5.0中,可以在URL上使用变量替换。例如“sos-describessensor-url”http://foo/foo?mysensor=%procedure%“”n将用来自请求的过程值替换元数据中的%procedure%。

    "sos_describesensor_url" "http://some/url/NS01EE0014.xml"
    

sos_enable_request (或) ows_enable_request)

  • *说明:*要启用的请求的以空格分隔的列表。默认值为“无”。可以启用以下请求: GetCapabilities, GetObservationDescribeSensor.

  • 实例:

    GetCapabilitiesGetObservation:

    "sos_enable_request" "GetCapabilities GetObservation"
    

    启用除'getcapabilities'之外的所有请求`

    "sos_enable_request" "* !GetCapabilities"
    

sos_u[item name]_别名

  • *描述:*(可选)在执行GetObservation请求时将返回的属性名称的别名。

sos_u[item name]_定义

  • *描述:*(可选)组件的关联定义(通常是URN),在执行GetObservation请求时将返回该定义。默认值为urn:ogc:object:definition “

sos_u[item name]om

  • *描述:*(可选)组件的关联度量单位urn),在执行GetObservation请求时返回。默认值为urn:ogc:object:uom “

sos_observedproperty_authority

  • *描述:*(可选)被观察属性的给定组件的关联权限

sos_observedproperty_id

  • *描述:*(必需)被观察属性的ID,可能为数字格式。

sos_observedproperty_name

  • *描述:*(可选)被观察属性的名称,可能为字符串格式。

sos_observedproperty_version

  • *描述:*(可选)已观察属性的给定组件的关联版本

sos_offering_description

  • *说明:*(可选)产品说明。

sos_offering_extent

  • Description: (Optional) Spatial extents of offering, in minx, miny, maxx, maxy 格式:

    "sos_offering_extent" "-66, 43, -62, 45"
    

    作为产品一部分返回的边界框的逻辑如下:

    • 注意,它是一个强制元素,需要一个ESPG代码和下/上角坐标。

    • 在产品的第一层中查找ESPG参数(可以是OWS/SOS_SRS或具有EPSG代码的投影对象(强制)

    • 寻找SOS提供的范围。如果元数据不可用,将使用产品中所有层的范围来计算它。

    以下是getCapabilities请求的示例结果:

    <gml:boundedBy>
      <gml:Envelope>
        <gml:lowerCorner srsName="EPSG:4326">-66 43</gml:lowerCorner>
        <gml:upperCorner srsName="EPSG:4326">-62 45</gml:upperCorner>
      </gml:Envelope>
    </gml:boundedBy>
    

sos_offering_id

  • *说明:*(必需)产品ID,可能为数字格式。

sos_offering_intendedapplication

  • *说明:*(可选)此产品的预期用途类别。

sos_offering_name

  • *描述:*(可选)产品名称,可能为字符串格式。

sos_offering_timeextent

  • *说明:*(可选)发售时间范围,格式为“开始/结束”。下面是一个例子:

    "sos_offering_timeextent" "1990/2006"
    

    如果未指定END,则将其设置为NOW。以下是getCapabilities请求的示例结果:

    <sos:eventTime>
      <gml:TimePeriod>
         <gml:beginPosition>1990</gml:beginPosition>
         <gml:endPosition>2006</gml:endPosition>
      </gml:TimePeriod>
    </sos:eventTime>
    

sos_procedure

  • *描述:*(必需)通常为传感器唯一ID。每层一个:

    "sos_procedure"  "NS01EE0014"
    

    备注

    SOS程序也可以是一个列表,用空格分隔,即:

    "sos_procedure" "35 2147 604"
    

    所有 sos_procedure 来自产品中各层的链接将一起输出,如从getCapabilities响应中获取的以下内容:

    <procedure xlink:href="urn:ogc:object:feature:Sensor:3eTI:csi-sensor-1"/>
    <procedure xlink:href="urn:ogc:object:feature:Sensor:3eTI:csi-sensor-2"/>
    

sos_procedure_item

  • *描述:*(如果没有SoS_程序,则需要):有关更多详细信息,请参见第5节。

    "sos_procedure_item"  "attribute_field_name"
    

sos_timeitem

  • *描述:*(可选)时间字段的名称。当使用EventTime参数调用GetObservation请求时,它将用于查询。它是特定于层的,应该在所有层上设置。

    "sos_timeitem" "TIME"
    

层元数据API

如果 sos_metadataurl_href 未定义,则MapServer将提供指向给定层的层元数据API的链接。请参阅 Layer Metadata API 文档以获取更多信息。

使用SOS程序和SOS程序项

在MapServer5.0中,SOS支持已升级为使用名为SOS_PROCEDURE_ITEM的新元数据。SOS_PROCEDURE_ITEM的值是包含程序值的字段/属性名称。此处根据请求类型描述了此元数据以及sos_Procedure的使用(有关更多说明,请参阅https://github.com/MapServer/MapServer/issues/2050):

应该注意的是,对于仅使用sos_procedure_项定义的非常大的数据集,这可能会导致处理成本高昂,因为mapserver必须处理属性数据。如果处理大型观测数据集,建议相应地设置和管理数据集。

GetCapabilities

  • 如果定义了SOS程序,则使用它

  • 如果没有,则查找sos_procedure_item:从该元数据指定的层属性中提取过程值。但对于具有大量特性的层来说,这并不是很耗时。

  • 如果没有定义,则返回异常

DescribeSensor

  • 如果定义了SOS程序,则使用它

  • 如果没有,则查找sos_procedure_item:从该元数据指定的层属性中提取过程值

  • 如果没有定义,则返回异常

GetObservation

可以定义SoS_程序和SoS_程序项。以下是案例:

  • 案例1仅定义了SoS_过程。
    • 使用此元数据将层与请求中发送的过程值匹配

    • 当输出<member/procedure>时,输出元数据的值

备注

如果每个层对象定义了多个过程,则输出观测将具有不正确的sos:procedure值,因为无法将过程映射到观测。这就是应该使用SOS程序项的地方(即当多个程序组成一个层对象时)。

  • 案例2:只定义了程序项。
    • 使用sos_过程项并在层上执行查询,以使过程与层匹配。

    • 输出<member/procedure>时,使用procedure_项作为仅输出与功能对应的属性值的方法。

  • 案例3:两者都有定义。
    • 签入SoS_过程以将该过程与层匹配。

    • 输出<member/procedure>时,使用procedure_项作为仅输出与功能对应的属性值的方法。