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



------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Geoserver-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Reply via email to