Hi,
I'm trying to perform by use of Geoserver the equivalent of the Postgis ST_intersection and ST_Union functions. The server I'm working with is the os indipendent binary with jetty.
In the first case, I need to compute the intersection between a polygon (a rectangle) and a postgis table published as a WFS vector layer via Geoserver. The simple intersects, which I performed succesfully, is not sufficient since I need to minimize the information transimitted over the network, because the application will run on mobile clients.
First I tried with a simple WFS request, since I found on the GetCapabilities response for the WFS service that the "intersection" function was supported, as intersects is. So I tried this simple XML, which works with intersects:
<wfs:GetFeature service="WFS" version="1.1.0"
xmlns:topp="http://www.openplans.org/topp"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns="http://www.opengis.net/ogc"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
<wfs:Query typeName="navteq:geoserver_comuni">
<Filter>
<Intersection>
<PropertyName>geom</PropertyName>
<gml:Polygon srsName="urn:ogc:def:crs:EPSG:6.9:4326">
<gml:exterior>
<gml:LinearRing>
<gml:posList>45.429299 11.82518 45.429299 12.540665 45.77327 12.540665 45.77327 11.82518 45.429299 11.82518</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</Intersection>
</Filter>
</wfs:Query>
</wfs:GetFeature>
However, I got a "Unable to find function Intersection" response from the server.
I did some research, and found the preferred way to do this kind of computation seems to be using a WPS approach, so I installed the WPS extension and looked for some examples.
I tried this example, which was assembled by a mixture of the WPS builder and an example I found on this thread: http://osgeo-org.1560.n6.nabble.com/Geoserver-2-2-Insertection-with-buffer-td5009029.html
This is the code I tried:
<?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:IntersectionFeatureCollection</ows:Identifier>
<wps:DataInputs>
<wps:Input>
<ows:Identifier>first feature collection</ows:Identifier>
<wps:Reference mimeType="text/xml; subtype=wfs-collection/1.0" xlink:href="http://geoserver/wps" method="POST">
<wps:Body>
<wps:Execute version="1.0.0" service="WPS">
<ows:Identifier>gs:Feature</ows:Identifier>
<wps:DataInputs>
<wps:Input>
<ows:Identifier>geometry</ows:Identifier>
<wps:Data>
<wps:ComplexData mimeType="application/wkt"><![CDATA[POLYGON((45.429299 11.82518,45.429299 12.540665,45.77327 12.540665,45.77327 11.82518,45.429299 11.82518))]]></wps:ComplexData>
</wps:Data>
</wps:Input>
<wps:Input>
<ows:Identifier>crs</ows:Identifier>
<wps:Data>
<wps:LiteralData>EPSG:4326</wps:LiteralData>
</wps:Data>
</wps:Input>
<wps:Input>
<ows:Identifier>typeName</ows:Identifier>
<wps:Data>
<wps:LiteralData>buf</wps:LiteralData>
</wps:Data>
</wps:Input>
</wps:DataInputs>
<wps:ResponseForm>
<wps:RawDataOutput mimeType="text/xml; subtype=wfs-collection/1.0">
<ows:Identifier>result</ows:Identifier>
</wps:RawDataOutput>
</wps:ResponseForm>
</wps:Execute>
</wps:Body>
</wps:Reference>
</wps:Input>
<wps:Input>
<ows:Identifier>second feature collection</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:navteq="navteq">
<wfs:Query typeName="navteq:comuni_ita"/>
</wfs:GetFeature>
</wps:Body>
</wps:Reference>
</wps:Input>
<wps:Input>
<ows:Identifier>intersectionMode</ows:Identifier>
<wps:Data>
<wps:LiteralData>INTERSECTION</wps:LiteralData>
</wps:Data>
</wps:Input>
</wps:DataInputs>
<wps:ResponseForm>
<wps:RawDataOutput mimeType="text/xml; subtype=wfs-collection/1.0">
<ows:Identifier>result</ows:Identifier>
</wps:RawDataOutput>
</wps:ResponseForm>
</wps:Execute>
I thought this would give me back the set of intersecting geometries, however I got this response, seems to be the bbox I put as input:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:ogc="http://www.opengis.net/ogc"
xmlns:gml="http://www.opengis.net/gml"
xmlns:wfs="http://www.opengis.net/wfs">
<gml:boundedBy>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>45.429299</gml:X><gml:Y>11.82518</gml:Y></gml:coord><gml:coord><gml:X>45.77327</gml:X><gml:Y>12.540665</gml:Y></gml:coord></gml:Box>
</gml:boundedBy>
</wfs:FeatureCollection>
I'm pretty new to Geoserver, so I've got no big clues on what to do now.
1) Is WPS and gs:IntersectionFeatureCollection the right way to do this, or is something wrong with the WFS intersection example I tried before?
2) Could anyone give me a clue on what is wrong with my WPS example?
3) I need to do the same with ST_Union, I gave a look at the description of gs:union, however it seems to work only with 2 single features, while I'd need to perform an aggregate
function on an entire set of geometries, based on attributes.
The most important issue for me, however, is that I'm trying to use Geoserver because I'd like to put a layer between the database and the application running on the client.
I could do the same with a java webapp performing only the operations I need, basicly mapping them to calls to postgis functions, but I'd really like to avoid all the coding,
mainly because we already have a lot of custom code to mantain. I'd like to switch from implementing code to wiring applications in an infrastructure.
Is Geoserver the right tool to use from this perspective, or should I code the "transactional" operations in Java and use Geoserver just for simple WMS and WFS requests?
Thank you in advance for any response.
Regards.
--
Paolo Crosato