Skip to content

GeoServer processes

GeoServer WPS includes a few processes created especially for use with GeoServer. These are usually GeoServer-specific functions, such as bounds and reprojection. They use an internal connection to the GeoServer WFS/WCS, not part of the WPS specification, for reading and writing data.

As with the "geo" processes, the names and definitions of these processes are subject to change, so they have not been included here. For a full list of GeoServer-specific processes, please see the GeoServer WPS capabilities document (or browse with the WPS Request Builder.)

Aggregation process

The aggregation process is used to perform common aggregation functions (sum, average, count) on vector data. The available outputs formats for this process are text/xml and application/json.

The process parameters are described in the table bellow:

Parameter Description Mandatory Multiple
features Input feature collection. yes no
aggregationAttribute Attribute on which to perform aggregation. yes no
function An aggregate function to compute. Functions include Count, Average, Max, Median, Min, StdDev, and Sum. yes yes
singlePass If TRUE computes all aggregation values in a single pass. This will defeat DBMS-specific optimizations. If a group by attribute is provided this parameter will be ignored. yes no
groupByAttributes Group by attribute. no yes

Follow some examples of the invocation of this process using GeoServer shipped topp:states layer.

The examples can be tested with CURL:

curl -u admin:geoserver -H 'Content-type: xml' -XPOST -d@'wps-request.xml' http://localhost:8080/geoserver/wps

where wps-request.xml is the file that contains the request.

Aggregate Example

Counts the total number of states, sum all the number of persons, computes the average number of persons per state and give the maximum and minimum number of persons in a state.

Request:

<?xml version="1.0" encoding="UTF-8"?><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>gs:Aggregate</ows:Identifier>
  <wps:DataInputs>
    <wps:Input>
      <ows:Identifier>features</ows:Identifier>
      <wps:Reference mimeType="text/xml" xlink:href="http://geoserver/wfs" method="POST">
        <wps:Body>
          <wfs:GetFeature service="WFS" version="1.0.0" outputFormat="GML2" xmlns:sf="http://www.openplans.org/spearfish">
            <wfs:Query typeName="topp:states"/>
          </wfs:GetFeature>
        </wps:Body>
      </wps:Reference>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>aggregationAttribute</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>PERSONS</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>function</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>Count</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>function</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>Average</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>function</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>Sum</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>function</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>Min</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>function</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>Max</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>singlePass</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>false</wps:LiteralData>
      </wps:Data>
    </wps:Input>
  </wps:DataInputs>
  <wps:ResponseForm>
    <wps:RawDataOutput mimeType="application/json">
      <ows:Identifier>result</ows:Identifier>
    </wps:RawDataOutput>
  </wps:ResponseForm>
</wps:Execute>

The result:

{
  "AggregationAttribute": "PERSONS",
  "AggregationFunctions": ["Max", "Min", "Average", "Sum", "Count"],
  "GroupByAttributes": [],
  "AggregationResults": [
    [29760021, 453588, 5038397.020408163, 246881454, 49]
  ]
}

The value of AggregationResults attribute should be read in a tabular way. The group by attributes come first in the order they appear in GroupByAttributes attribute. After comes the result of the aggregation functions in the order they appear in the AggregationFunctions attribute. In this case there is no group by attributes so the result only contains a row with the aggregation functions results. This is very similar to the result of an SQL query.

This result should be interpreted like this:

Max Min Average Sum Count
29760021 453588 5038397.020408163 246881454 49

To obtain the result in the XML format the request wps:ResponseForm element needs to be changed to:

<wps:ResponseForm>
  <wps:RawDataOutput mimeType="text/xml">
    <ows:Identifier>result</ows:Identifier>
  </wps:RawDataOutput>
</wps:ResponseForm>

The result in XML format:

<?xml version="1.0" encoding="UTF-8"?>
<AggregationResults>
  <Min>453588.0</Min>
  <Max>2.9760021E7</Max>
  <Average>5038397.020408163</Average>
  <Sum>2.46881454E8</Sum>
  <Count>49</Count>
</AggregationResults>

Aggregate GroupBy Example

This example count the number of states and the population average grouped by region.

Request:

<?xml version="1.0" encoding="UTF-8"?><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>gs:Aggregate</ows:Identifier>
  <wps:DataInputs>
    <wps:Input>
      <ows:Identifier>features</ows:Identifier>
      <wps:Reference mimeType="text/xml" xlink:href="http://geoserver/wfs" method="POST">
        <wps:Body>
          <wfs:GetFeature service="WFS" version="1.0.0" outputFormat="GML2" xmlns:sf="http://www.openplans.org/spearfish">
            <wfs:Query typeName="topp:states"/>
          </wfs:GetFeature>
        </wps:Body>
      </wps:Reference>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>aggregationAttribute</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>PERSONS</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>function</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>Count</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>function</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>Average</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>singlePass</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>false</wps:LiteralData>
      </wps:Data>
    </wps:Input>
    <wps:Input>
      <ows:Identifier>groupByAttributes</ows:Identifier>
      <wps:Data>
        <wps:LiteralData>SUB_REGION</wps:LiteralData>
      </wps:Data>
    </wps:Input>
  </wps:DataInputs>
  <wps:ResponseForm>
    <wps:RawDataOutput mimeType="application/json">
      <ows:Identifier>result</ows:Identifier>
    </wps:RawDataOutput>
  </wps:ResponseForm>
</wps:Execute>

The result:

{ 
  "AggregationAttribute": "PERSONS",
  "AggregationFunctions": ["Average", "Count"],
  "GroupByAttributes": ["SUB_REGION"], 
  "AggregationResults": [ 
    [ "N Eng", 2201157.1666666665, 6 ], 
    [ "W N Cen", 2522812.8571428573, 7 ], 
    [ "Pacific", 12489678, 3 ], 
    [ "Mtn", 1690408.25, 8 ], 
    [ "E S Cen", 3998821.25, 4 ], 
    [ "S Atl", 4837695.666666667, 9 ], 
    [ "Mid Atl", 12534095.333333334, 3 ], 
    [ "E N Cen", 8209477.2, 5 ], 
    [ "W S Cen", 6709575.75, 4 ]
  ]
}

Since there is a group by attribute the result contains a row for each different value of the group by attribute. Very similar to the result of an SQL query. If there is more that one group by attribute (which is not the case) their values will be in the order they appear in the GroupByAttributes attribute.

This result should be interpreted like this:

Sub Region Average count
N Eng 2201157.1666666665 6
W N Cen 2522812.8571428573 7
Pacific 12489678 3
Mtn 1690408.25 8
E S Cen 3998821.25 4
S Atl 4837695.666666667 9
Mid Atl 12534095.333333334 3
E N Cen 8209477.2 5
W S Cen 6709575.75 4

The result in XML format:

<?xml version="1.0" encoding="UTF-8"?>
<AggregationResults>
  <GroupByResult>
    <object-array>
      <string>N Eng</string>
      <double>2201157.1666666665</double>
      <int>6</int>
    </object-array>
    <object-array>
      <string>W N Cen</string>
      <double>2522812.8571428573</double>
      <int>7</int>
    </object-array>
    <object-array>
      <string>Pacific</string>
      <double>1.2489678E7</double>
      <int>3</int>
    </object-array>
    <object-array>
      <string>Mtn</string>
      <double>1690408.25</double>
      <int>8</int>
    </object-array>
    <object-array>
      <string>E S Cen</string>
      <double>3998821.25</double>
      <int>4</int>
    </object-array>
    <object-array>
      <string>S Atl</string>
      <double>4837695.666666667</double>
      <int>9</int>
    </object-array>
    <object-array>
      <string>Mid Atl</string>
      <double>1.2534095333333334E7</double>
      <int>3</int>
    </object-array>
    <object-array>
      <string>E N Cen</string>
      <double>8209477.2</double>
      <int>5</int>
    </object-array>
    <object-array>
      <string>W S Cen</string>
      <double>6709575.75</double>
      <int>4</int>
    </object-array>
  </GroupByResult>
</AggregationResults>