---
title: GeoServer中的WPS服务
date: 2021-05-10
author: ac
tags:
- WPS
categories:
- GIS
---
> 本文中示例使用的是GeoServer 服务器,所以请先安装好GeoServer对WPS服务的扩展模块
## 1. WPS简介
`Web Processing Service`(WPS)最初被称为`Geoprocessing Service`。在其发展初期,该名称被改为`Web Processing Service`,以避免首字母缩写GPS,因为这可能会与全球定位系统(Global Positioning System)这个缩写的传统用法相混淆。
自从`WPS`成为OGC的规范以来,术语`geospatial`变得有点冗余。
WPS定义了一个标准化接口,该接口有助于发布(`Publishing`)地理处理的流程(`Processes`),以及客户机发现和绑定这些流程。
- `Processes`:这些流程包括任何运行在空间参考数据上的算法,计算和模型。
- `Publishing`:发布意味着提供机器可读的绑定信息以及人类可读的元数据,从而允许服务被发现和使用。
WPS可以通过网络为客户端配置和提供任何类型的GIS功能。
Web处理服务(WPS)向客户端提供对预先编程的空间数据进行操作的计算模型的访问。服务所需的数据可以通过网络传递,也可以在服务器上获取。这些数据可以是使用图像数据格式或数据交换标准,如GML。计算可以是简单到从一组空间参考数据中减去另一组数据(例如,确定两个不同季节流感病例的差异),也可以是复杂到全球气候变化的模型。
在网络上实现地理空间处理需要开发各种各样的web服务来支持原子地理空间操作以及复杂的建模能力。标准化这些流程的调用方式非常重要,以减少所需的编程量,并促进新服务的实现和采用。WPS旨在帮助OGC成员实现这些目标。
## 2. WPS 操作
WPS接口指定了客户端可以请求并由WPS服务器执行的三种操作,这些操作都是所有服务器必须实现的。操作如下:
- `GetCapabilities` :此操作允许客户端请求并接收描述服务器实现能力的服务元数据(或能力)文档。GetCapabilities操作提供了WPS实例提供的每个进程的名称和一般描述。
- `DescribeProcess` :此操作允许客户端请求并接收关于可在服务实例上运行的流程的详细信息,包括所需的输入、允许的格式和可生成的输出。
- `Execute` :此操作允许客户端运行由WPS实现的指定进程,使用提供的输入参数值并返回生成的输出
这些操作与其他OGC Web服务(WMS、WFS、WCS)有许多相似之处。OWS规范中指定了与这些其他OpenGIS Web Services共同的接口。
从上面的类图可以看到WPS服务也实现了OWS接口,所以也遵循OWS规范中的请求和响应相关的规则。
> 每个server服务只实例化该服务类一个实例对象,当服务可用时,该对象始终存在。
举个栗子,考虑一个简单的Process流程:求两个面的交集(`intersect`)。
- `GetCapabilities`请求返回的结果可以查看该WPS服务是否支持`intersect`操作,以及操作的限制,如`intersect`仅限于一个多边形与另一个多边形相交;
- `DescribeProcess`请求返回的结果可以查看到`intersect`流程需要两个输入,"FirstPolygon"和"SecondPolygon"需要是GML2.2版本的面要素,结果还描述了WPS服务的输出结果和版本格式(GML2.2或GML3.1),它可以作为Web可访问资源进行传输;
- 客户端将通过调用`Execute`操作来运行流程,并且可以选择将提供的两个输入多边形直接嵌入在请求中,并确定输出应该作为web可访问的资源存储。
完成后,流程将返回一个`ExecuteResponse` XML文档,该文档标识输入和输出,指示流程是否成功执行,如果成功,则包含对web可访问资源的引用。

上述表格是WPS各操作支持的请求编码格式。
### 2.1 GetCapabilities
`GetCapabilities`操作允许客户端从服务器检索服务元数据。
对GetCapabilities请求的响应应该是一个XML文档,其中包含关于服务器的服务元数据,包括描述所有已实现的Process进程的简短元数据,以及描述其功能。
`GetCapabilities`操作请求参数:
| name | multiplicity |
| -------------- | --------------------- |
| service | One(mandatory) |
| Request | One(mandatory) |
| AcceptVersions | Zero or one(optional) |
| language | Zero or one(optional) |
示例:
**KVP的形式**:
`http://localhost:8080/geoserver/wps?service=WPS&Request=GetCapabilities&AcceptVersions=1.0.0`
> GeoServer 安装完WPS扩展后,发起上述请求,可以得到下面结果。
>
> 注意:WPS扩展模块实现的是WPS1.0.0规范
**XML文本的形式**:
请求URL:http://localhost:8080/geoserver/ows或http://localhost:8080/geoserver/wps
请求数据:
```xml
1.0.0
```

**响应示例**:
```xml
Prototype GeoServer WPSWPS1.0.0The Ancient GeographersJTS:areaAreaReturns the area of a geometry, in the units of the geometry. Assumes a Cartesian plane, so this process is only recommended for non-geographic CRSes.JTS:boundaryBoundaryReturns a geometry boundary. For polygons, returns a linear ring or multi-linestring equal to the boundary of the polygon(s). For linestrings, returns a multipoint equal to the endpoints of the linestring. For points, returns an empty geometry collection.JTS:bufferBufferReturns a polygonal geometry representing the input geometry enlarged by a given distance around its exterior.JTS:centroidCentroidReturns the geometric centroid of a geometry. Output is a single point. The centroid point may be located outside the geometry.
...
en-USen-US
```
响应结果分析:
- `Service Identification`:关于服务的元数据,服务类型和版本。
- `OperationsMetadata`:关于服务支持的由服务器端实现的操作的元数据信息,包括用于操作请求的url。
- `ProcessOfferings`:提供服务器端已经实现了的`Process`进程的简要描述的无序列表。
### 2.2 DescribeProcess
`DescribeProcess`操作允许WPS客户端请求可由Execute操作执行的一个或多个进程的完整描述。这个描述包括输入和输出参数和格式。此描述可用于自动构建用户界面,以捕获用于执行流程实例的参数值。
`DescribeProcess`操作请求的参数:
| name | descirption | m/o |
| ---------- | --------------------------------------------------------- | ---- |
| service | 服务类型,值是"WPS" | m |
| request | 操作名称,值为"DescribeProcess" | m |
| version | 操作的版本,不能为空,值由每个WPS实现的规范和模式版本决定 | m |
| language | 语言标识 | o |
| Identifier | Process流程的标识 | m |
示例:
**KVP的形式**:
`http://localhost:8080/geoserver/wps?service=WPS&Request=DescribeProcess&version=1.0.0&language=en-US&Identifier=JTS:centroid,JTS:buffer`
> 多个Process流程用`,`号隔开
**XML文本的形式**:
请求URL地址:http://localhost:8080/geoserver/ows
```xml
JTS:bufferJTS:centroid
```

> statusSupported="true"表示该Process流程支持异步请求,服务器也会持续更新Process流程的状态,与存储在`ExecuteResponse`XML文档中Process状态的值一致。客户机可以通过`GetExecutions`查看Process状态。
**响应结果**:
响应的XML文档包含有关每个请求的Process流程的元数据,包含以下内容:
- Process流程名称、标题和摘要
- 对每个输入和输出参数:标识符、标题、摘要、多重性以及支持的数据类型和格式
```xml
JTS:centroidCentroidReturns the geometric centroid of a geometry. Output is a single point. The centroid point may be located outside the geometry.geomgeomInput geometrytext/xml; subtype=gml/3.1.1text/xml; subtype=gml/3.1.1text/xml; subtype=gml/2.1.2application/wktapplication/gml-3.1.1application/gml-2.1.2application/jsonJTS:bufferBufferReturns a polygonal geometry representing the input geometry enlarged by a given distance around its exterior.geomgeomInput geometrytext/xml; subtype=gml/3.1.1text/xml; subtype=gml/3.1.1text/xml; subtype=gml/2.1.2application/wktapplication/gml-3.1.1application/gml-2.1.2application/jsondistancedistanceDistance to buffer the input geometry, in the units of the geometryxs:doublequadrantSegmentsquadrantSegmentsNumber determining the style and smoothness of buffer corners. Positive numbers create round corners with that number of segments per quarter-circle, 0 creates flat corners.xs:intcapStylecapStyleStyle for the buffer end caps. Values are: Round - rounded ends (default), Flat - flat ends; Square - square ends.RoundFlatSquare
```
- `ProcessDescription`:Process流程的完整信息的描述,包含流程标识Identifier、输入参数类型DataInputs、输出参数ProcessOutputs以及数据格式类型和约束等。
- `ComplexData`:复合数据类型,表示该数据是`Supported`标签内支持的数据类型中的组合。
- `LiteralData`:文字数据,可以是任何文本字符串。用于传递单个参数,如数字和文本参数(数据类型常是整数、浮点、字符串)
### 2.3 Execute
`Execute`操作允许WPS客户机运行由服务器实现的指定`Process`流程,使用提供的输入参数值并返回生成的输出值。
- 输入参数可以直接包含在Execute请求中,或者引用web可访问的资源。
- 输出可以以XML响应文档的形式返回,可以嵌入在响应文档中,也可以作为web可访问资源存储。
如果存储输出,则响应结果应该为包含每个存储输出的URL的XML文档,这样客户机可以使用这些URL来检索那些输出。或者,对于单个输出,可以指示服务器返回原始形式的输出,而不需要包装在XML响应文档中。
`Execute`请求参数:
| name | description | m/o |
| ------------- | ---------------------------------------- | :--: |
| service | 服务类型标识,值为"WPS" | m |
| request | 操作名称,值为"Execute" | m |
| version | 服务版本,不能为空 | m |
| Identifier | Process流程的标识 | m |
| DataInputs | 执行Process需要的输入参数 | o |
| Response Form | Process结果的响应格式(Raw data or XML) | o |
| language | 语言标识 | o |
操作请求提供对多个输入的支持。每个输入都引用单个Execute请求可能需要的一种输入形式。
向WPS提供大型输入的通常方法是提供一个或多个输入值的uri(通常是url),除非输入是简单标量值。这不是用来促进批处理的(例如,通过一个算法处理多个图像)。如果一个流程要运行多次(可能每次使用不同的输入),那么每次运行都应作为单独的Execute操作的请求来提交。
> java中标量可以理解为是Date、String、基本类型等。
注意,Process的输入和输出是无序的。当一个Process需要大量输入或有较多输出数据时,服务端或客户端花在数据解析上的时间会很多,所以建议接口实现者以一种有效的方式打包和对输入/输出进行排序,并在Process流程描述中确定这个最佳排序需求。
**数据输入类型的数据结构**
InputType data structure
| name | description | data type | m/o |
| --------------------- | ----------- | ------------ | ---- |
| Identifier | wps服务标识 | ows:CodeType | m |
| Title | 标题 | 字符类型 | o |
| Abstract | 简介 | 字符类型 | o |
| InputData Form Choice | 数据表单 | 详见下表 | m |
InputData Form Choice
| name | description | Multiplicity | data type |
| --------- | --------------------------------------------- | ------------ | -------------- |
| Reference | 将输入数据标识为web可访问的资源,并引用该资源 | Zero or one | InputReference |
| Data | 将此输入数据标识为封装在Execute请求中 | Zero or one | DataType |
`InputReference`类型更多的是使用URL引用Web资源,可以指定`href`属性和`method`属性来标识资源和请求资源的方式。
`DataType`类型是之前介绍的`ComplexData`和`LiteralData`,以及`BoundingBoxData`。
> `BoundingBoxData`是指定两对坐标(用于2d和3d空间)描述边界的矩形,使用左下角(最小值)和右上角(最大值)的坐标、空间参考CRS以及描述边界维度的值组成。如:46,102,47,103,urn:ogc:def:crs:EPSG:6.6:4326,2
**响应数据格式的数据结构**
ResponseForm data structure
| name | description | Data type | multiplicity |
| ------------------ | ------------------------------------------------- | --------- | ------------ |
| Response Document | 指示输出应作为WPS响应文档的一部分返回。 | | Zero or one |
| RawData Output | 指示输出应直接作为原始数据返回,不应有WPS响应文档 | | Zero or one |
ResponseDocument data structure
| name | description | datatype | Multiplicity |
| -------------------- | ------------------------------------------------------------ | -------- | ------------ |
| storeExecuteResponse | 指示execute请求的响应结果是否存储 | boolean | Zero or one |
| lineage | 指示Execute操作的响应结果是否包含DataInputs和OutputDefinitions元素 | boolean | Zero or one |
| status | 指示是否更新Process流程的状态 | boolean | Zero or one |
| Output | 指定响应结果的格式、编码和schema约束 | | One or more |
示例:
```xml
result
```
> asReference属性指定该输出是否应被Process进程存储为Web可访问的资源。