使用OGC API流程接口增强WPS实现

WPS标准提供了一个标准接口,简化了通过Web服务访问简单或复杂的计算地理空间处理服务的任务。虽然WPS标准在设计时考虑到了空间处理,但该标准也可用于将非空间处理任务轻松插入到Web服务环境中。

OGC API - Process Standard是一种更新、更现代的编程方式,可以通过Web与资源交互,同时允许更好地集成到现有的软件包中。OGCAPI - 流程标准解决了WPS标准处理的所有用例,同时还利用了OpenAPI规范和面向资源的方法。

WPS和OGC API流程都有以下核心概念:

  • 过程

  • 输入

  • 输出

WPS和OGC API流程都支持以下关键执行模式:

  • 同步

  • 异步

WPS和OGC API流程之间的主要区别在于如何描述接口:

  • WPS使用GetCapability操作来检索有关服务器支持的功能的信息。在合同中,OGC API-Process为一致性声明、进程列表、作业列表和API定义资源提供了单独的路径,这些资源共同描述了服务器提供的能力和资源。

  • WPS提供的接口仅记录在标准文档中,以供人工解释。相比之下,OGC API-Process提供了标准文档(用于人工解释)和指定为OpenAPI定义文档(用于应用程序解释)的API定义文档。

  • WPS支持以下输入数据类型:复杂数据、文本数据和边界框数据。相比之下,OGC API-Process支持以下输入数据类型:简单文字值、数组、限定值、二进制值和边界框。此外,OGC API-Process支持以下类型的数组简单文字、嵌入式数组、限定值、二进制值、边界框值,是使用链接的值的引用。

WPS的一个示例

为了解释如何通过将OGC API流程实现与WPS一起部署来扩展WPS以支持OGC API流程,我们提供了引用CF Checker流程的示例。CF检查器是 developed 在哈德利气候预测和研究中心,英国气象局。CF卡检查器的开发和维护现已由NCAS计算建模服务(NCAS-CMS)接管。

通过HTTP GET操作发送的DescribeProcess请求示例 cfchecker 流程如下所示。

https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird/wps?
service=WPS&
version=1.0.0&
request=DescribeProcess&
identifier=cfchecker

DescribeProcess响应的摘录如下所示。

<wps:ProcessDescriptions xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd" service="WPS" version="1.0.0" xml:lang="en-US">
  <ProcessDescription wps:processVersion="3.0.5" storeSupported="true" statusSupported="true">
    <ows:Identifier>cfchecker</ows:Identifier>
    <ows:Title>CF Checker by CEDA</ows:Title>
    <ows:Abstract>The NetCDF Climate Forcast Conventions compliance checker by CEDA. </ows:Abstract>
    <DataInputs>
      <Input minOccurs="1" maxOccurs="1">
        <ows:Identifier>cf_version</ows:Identifier>
        <ows:Title>Check against CF version</ows:Title>
        <ows:Abstract>Version of CF conventions that the NetCDF file should be check against.</ows:Abstract>
        <LiteralData>
          <ows:DataType ows:reference="urn:ogc:def:dataType:OGC:1.1:string">string</ows:DataType>
          <ows:AllowedValues>
            <ows:Value>auto</ows:Value>
            <ows:Value>1.6</ows:Value>
            <ows:Value>1.5</ows:Value>
            <ows:Value>1.4</ows:Value>
            <ows:Value>1.3</ows:Value>
            <ows:Value>1.2</ows:Value>
            <ows:Value>1.1</ows:Value>
            <ows:Value>1.0</ows:Value>
          </ows:AllowedValues>
          <DefaultValue>auto</DefaultValue>
        </LiteralData>
      </Input>
      <Input minOccurs="0" maxOccurs="1024">
        <ows:Identifier>dataset</ows:Identifier>
        <ows:Title>Dataset</ows:Title>
        <ows:Abstract>You may provide a URL or upload a NetCDF file.</ows:Abstract>
        <ComplexData>
          <Default>
            <Format>
              <MimeType>application/x-netcdf</MimeType>
            </Format>
          </Default>
          <Supported>
            <Format>
              <MimeType>application/x-netcdf</MimeType>
            </Format>
          </Supported>
        </ComplexData>
      </Input>
      <Input minOccurs="0" maxOccurs="1024">
        <ows:Identifier>dataset_opendap</ows:Identifier>
        <ows:Title>Remote OpenDAP Data URL</ows:Title>
        <ows:Abstract>Or provide a remote OpenDAP data URL, for example: http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2.dailyavgs/surface/mslp.2016.nc</ows:Abstract>
        <ows:Metadata xlink:href="https://www.iana.org/assignments/media-types/media-types.xhtml" xlink:title="application/x-ogc-dods" xlink:type="simple"/>
        <LiteralData>
          <ows:DataType ows:reference="urn:ogc:def:dataType:OGC:1.1:string">string</ows:DataType>
          <ows:AnyValue/>
        </LiteralData>
      </Input>
    </DataInputs>
    <ProcessOutputs>
      <Output>
        <ows:Identifier>output</ows:Identifier>
        <ows:Title>CF Checker Report</ows:Title>
        <ows:Abstract>Summary of the CF compliance check</ows:Abstract>
        <ComplexOutput>
          <Default>
            <Format>
              <MimeType>text/plain</MimeType>
            </Format>
          </Default>
          <Supported>
            <Format>
              <MimeType>text/plain</MimeType>
            </Format>
          </Supported>
        </ComplexOutput>
      </Output>
    </ProcessOutputs>
  </ProcessDescription>
</wps:ProcessDescriptions>

通过HTTP GET操作发送的执行请求示例 cfchecker 流程如下所示。

https://pavics.ouranos.ca/twitcher/ows/proxy/hummingbird/wps?
service=WPS&
version=1.0.0&
request=Execute&
identifier=cfchecker&
DataInputs=dataset_opendap=http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2.dailyavgs/surface/mslp.2016.nc

通过HTTP POST操作发送的执行请求示例 cfchecker 流程如下所示。

<wps:Execute version="1.0.0" service="WPS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wps/1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wcs="http://www.opengis.net/wcs/1.1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd">
  <ows:Identifier>cfchecker</ows:Identifier>
  <wps:DataInputs>
    <wps:Input>
      <ows:Identifier>cf_version</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>auto</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>dataset_opendap</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2.dailyavgs/surface/mslp.2016.nc</wps:LiteralData>
      </wps:Data>
    </wps:Input>
  </wps:DataInputs>
  <wps:ResponseForm/>
</wps:Execute>

示例执行请求的响应如下所示。

<wps:ExecuteResponse xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecute_response.xsd" service="WPS" version="1.0.0" xml:lang="en-US" serviceInstance="https://pavics.ouranos.ca:443/wps?service=WPS&amp;request=GetCapabilities" statusLocation="https://pavics.ouranos.ca:443/wpsoutputs/hummingbird/0e370b90-9316-11ec-8f55-0242ac120018.xml">
    <wps:Process wps:processVersion="3.0.5">
        <ows:Identifier>cfchecker</ows:Identifier>
        <ows:Title>CF Checker by CEDA</ows:Title>
        <ows:Abstract>The NetCDF Climate Forcast Conventions compliance checker by CEDA. </ows:Abstract>
    </wps:Process>
    <wps:Status creationTime="2022-02-21T12:59:28Z">
        <wps:ProcessSucceeded>PyWPS Process CF Checker by CEDA finished</wps:ProcessSucceeded>
    </wps:Status>
    <wps:ProcessOutputs>
        <wps:Output>
            <ows:Identifier>output</ows:Identifier>
            <ows:Title>CF Checker Report</ows:Title>
            <ows:Abstract>Summary of the CF compliance check</ows:Abstract>
            <wps:Reference xlink:href="https://pavics.ouranos.ca:443/wpsoutputs/hummingbird/0e370b90-9316-11ec-8f55-0242ac120018/cfchecker_output_RpMAsU.txt" mimeType="text/plain"/>
        </wps:Output>
    </wps:ProcessOutputs>
</wps:ExecuteResponse>

在WPS前创建OGC API-进程代理

为了演示如何在WPS前面创建实现OGC API流程的代理,我们使用 pygeoapi +一个PYTHON服务器实现了许多OGC API标准。

安装PYOGIAPI

首先,按照中所述安装pygeapi pygeoapi 主页。

以下是一系列步骤。

python3 -m venv pygeoapi
cd pygeoapi
. bin/activate
git clone https://github.com/geopython/pygeoapi.git
cd pygeoapi
pip3 install -r requirements.txt
python3 setup.py install
cp pygeoapi-config.yml example-config.yml
vi example-config.yml  # edit as required
export PYGEOAPI_CONFIG=example-config.yml
export PYGEOAPI_OPENAPI=example-openapi.yml
pygeoapi openapi generate $PYGEOAPI_CONFIG > $PYGEOAPI_OPENAPI
pygeoapi serve
# in another terminal
curl http://localhost:5000  # or open in a web browser

安装了pygeapi后,请验证您是否可以访问 landing page 以及 process list

登录页面的屏幕截图如下所示。列出的路径中将包括进程资源,通过该资源可以检索进程列表。

../../_images/pygeoapi_1.png

流程列表的屏幕截图如下所示。进程列表将显示名为“Hello World”的单个进程。

../../_images/pygeoapi_2.png

单击流程名称可转到流程描述。这个 description Hello World流程的声明该流程接受两个字符串作为输入,一个名为‘name’,另一个名为‘Message’。

../../_images/pygeoapi_3.png

流程描述的JSON编码可在http://localhost:5000/processes/hello-world?f=json获得

查看流程描述后,我们可以使用cURL或Postman等Web工具创建处理作业。使用Postman发送的请求和响应的屏幕截图如下所示。

../../_images/pygeoapi_5.png

为方便起见,下面提供了请求的有效负载。

{
  "inputs": {
    "message": "An optional message.",
    "name": "World"
  }
}

创建代理cfcheck进程

现在我们已经安装了pygeapi,让我们在pygeapi中创建进程,该进程将通过实现OGC API进程的接口公开cfcheck。

首先,我们将新流程添加到示例配置文件中,该配置文件位于 resources 元素。

resources:
     proxy-cfchecker:
         type: process
         processor:
             name: ProxyCFChecker

然后,我们将新流程添加到Example-Openapi.yml配置文件。

/processes/proxy-cfchecker:
     get:
       description: An example process that checks the validity of a NetCDF-CF file.
       operationId: describeProxy-cfcheckerProcess
       parameters:
       - $ref: '#/components/parameters/f'
       responses:
         '200':
           $ref: '#/components/responses/200'
         default:
           $ref: '#/components/responses/default'
       summary: Get process metadata
       tags:
       - proxy-cfchecker
   /processes/proxy-cfchecker/execution:
     post:
       description: An example process that checks the validity of a NetCDF-CF file.
       operationId: executeProxy-cfcheckerJob
       requestBody:
         content:
           application/json:
             example:
               inputs:
                 dataset_opendap: http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2.dailyavgs/surface/mslp.2016.nc
             schema:
               $ref: http://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/schemas/execute.yaml
         description: Mandatory execute request JSON
         required: true
       responses:
         '200':
           $ref: '#/components/responses/200'
         '201':
           $ref: http://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/responses/ExecuteAsync.yaml
         '404':
           $ref: http://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/responses/NotFound.yaml
         '500':
           $ref: http://schemas.opengis.net/ogcapi/processes/part1/1.0/openapi/responses/ServerError.yaml
         default:
           $ref: '#/components/responses/default'
       summary: Process Proxy CFChecker execution
       tags:
       - proxy-cfchecker

我们还将新流程的标记添加到Example-Openapi.yml配置文件中。

tags:
 - description: An example process that checks the validity of a NetCDF-CF file.
   name: proxy-cfchecker

接下来,我们将新进程添加到 resources 元素。

resources:
     proxy-cfchecker:
         type: process
         processor:
             name: ProxyCFChecker

接下来,我们将新流程添加到plugin.py配置文件的 process 元素。

'process': {
    'ProxyCFChecker': 'pygeoapi.process.proxy_cfchecker.ProxyCFCheckerProcessor'
}

完成配置后,我们接下来实施该过程。

要完成-添加一个指向Python代码的链接。

现在,让我们通过执行以下命令来重新构建PYOGIAPI python3 setup.py install 从命令行,然后通过执行以下命令来运行pygeapi pygeoapi serve 从命令行。

现在,我们可以看到Proxy-cfcheck进程列在进程列表中。

../../_images/cfcheckerapi_1.png

打开Proxy-cfcheck的描述,我们可以看到它接受的输入。

../../_images/cfcheckerapi_2.png

现在,我们可以通过使用cURL或Postman等工具发送请求来创建处理作业。

../../_images/cfcheckerapi_3.png

为方便起见,下面提供了请求的有效负载。

{
  "inputs": {
    "dataset_opendap": "http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2.dailyavgs/surface/mslp.2016.nc"
  }
}

确认

WPS电子学习模块的这一部分由 Climate Intelligence (CLINT) 项目。