← Back to team overview

zorba-coders team mailing list archive

[Merge] lp:~zorba-coders/zorba/update3.0_geo-module into lp:zorba/geo-module

 

Juan Zacarias has proposed merging lp:~zorba-coders/zorba/update3.0_geo-module into lp:zorba/geo-module.

Commit message:
Changes for Update 3.0

Requested reviews:
  Chris Hillery (ceejatec)
Related bugs:
  Bug #1188047 in Zorba: "Update non-core module "geo""
  https://bugs.launchpad.net/zorba/+bug/1188047

For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/update3.0_geo-module/+merge/170212

Changes for Update 3.0
-- 
The attached diff has been truncated due to its size.
https://code.launchpad.net/~zorba-coders/zorba/update3.0_geo-module/+merge/170212
Your team Zorba Coders is subscribed to branch lp:zorba/geo-module.
=== modified file 'src/CMakeLists.txt'
--- src/CMakeLists.txt	2012-08-07 18:06:15 +0000
+++ src/CMakeLists.txt	2013-06-18 22:41:25 +0000
@@ -12,9 +12,27 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# all external module libraries are generated in the directory
-# of the corresponding .xq file
-MESSAGE(STATUS "Add org")
-ADD_SUBDIRECTORY(org)
-
-MESSAGE(STATUS "End modules")
+#
+#Geos
+#
+IF (ZORBA_SUPPRESS_GEOS)
+  MESSAGE (STATUS "ZORBA_SUPPRESS_GEOS is true - not searching for Geos.")
+ELSE (ZORBA_SUPPRESS_GEOS)
+
+  MESSAGE (STATUS "Looking for Geos")
+  FIND_PACKAGE(Geos)
+
+  IF(GEOS_FOUND)
+    MESSAGE (STATUS "Found Geos library -- " ${GEOS_LIBRARIES})
+    SET (GEO_LINK_LIBRARIES ${GEOS_LIBRARIES})
+    
+    INCLUDE_DIRECTORIES(${GEOS_INCLUDE_DIR})
+    INCLUDE_DIRECTORIES("geo.xq.src")   
+    DECLARE_ZORBA_MODULE (URI "http://zorba.io/modules/geo"; VERSION 1.0 FILE "geo.xq" LINK_LIBRARIES "${GEOS_LIBRARIES}")
+    
+    ADD_TEST_DIRECTORY("${PROJECT_SOURCE_DIR}/test")    
+  ELSE(GEOS_FOUND)
+    MESSAGE(STATUS "Geos Library Not Found. You need to install Geos library in order to compile the Geo Module.")
+  ENDIF(GEOS_FOUND)
+ENDIF (ZORBA_SUPPRESS_GEOS)
+MESSAGE(STATUS "")
\ No newline at end of file

=== added file 'src/geo.xq'
--- src/geo.xq	1970-01-01 00:00:00 +0000
+++ src/geo.xq	2013-06-18 22:41:25 +0000
@@ -0,0 +1,1352 @@
+xquery version "1.0";
+
+(:
+ : Copyright 2006-2009 The FLWOR Foundation.
+ :
+ : Licensed under the Apache License, Version 2.0 (the "License");
+ : you may not use this file except in compliance with the License.
+ : You may obtain a copy of the License at
+ :
+ : http://www.apache.org/licenses/LICENSE-2.0
+ :
+ : Unless required by applicable law or agreed to in writing, software
+ : distributed under the License is distributed on an "AS IS" BASIS,
+ : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ : See the License for the specific language governing permissions and
+ : limitations under the License.
+:)
+
+(:~
+ : Function library providing geo processing using Simple Features api API GMLSF format. <br/>
+ : It uses the GEOS third party library, license LGPL. Version 3.2.2 or above is required.<br/>
+ : <br/>
+ : The data format supported is GML SF profile 0/1.<br/>
+ : This is a subset of GML, and covers the basic geometries of Point, Line and Surface and collections of those.<br/>
+ : GMLSF nodes have the namespace "http://www.opengis.net/gml";.<br/>
+ : <br/>
+ : Possible GMLSF geometric structures are:
+ : <dl>
+ :  <dt><b>Point</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:Point [srsDimension='2|3']?>
+ :    <gml:pos [srsDimension='2|3']?>double_x double_y </gml:pos>
+ :  </gml:Point>]]></pre>
+ :  <dt><b>LineString</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:LineString [srsDimension='2|3']?>
+ :    <gml:posList [srsDimension='2|3']?> double_x1 double_y1 double_x2 double_y2 ... </gml:posList>
+ :  </gml:LineString>]]></pre>
+ :  <dt><b>Curve</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:Curve [srsDimension='2|3']?>
+ :    <gml:segments>
+ :    [<gml:LineStringSegment interpolation="linear" [srsDimension='2|3']?>
+ :       <gml:posList [srsDimension='2|3']?> double_x1 double_y1 double_x2 double_y2 ... </gml:posList>;
+ :     <gml:LineStringSegment>]*
+ :    </gml:segments>
+ :  </gml:Curve>]]></pre>
+ :  <dt><b>LinearRing</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:LinearRing [srsDimension='2|3']?>
+ :    <gml:posList [srsDimension='2|3']?> double_x1 double_y1 double_x2 double_y2 ... </gml:posList>
+ :  </gml:LinearRing>]]></pre>
+ :  <dt><b>Surface</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:Surface [srsDimension='2|3']?>
+ :    <gml:patches>
+ :    [<gml:PolygonPatch [srsDimension='2|3']?>
+ :       <gml:exterior>
+ :         <gml:LinearRing> ... </gml:LinearRing>
+ :       </gml:exterior>
+ :       <gml:interior>
+ :         <gml:LinearRing> ... </gml:LinearRing>
+ :       </gml:interior>]*
+ :     </gml:PolygonPatch>]*
+ :    </gml:patches>
+ :  </gml:Surface>]]></pre>
+ :  <dt><b>Polygon</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:Polygon [srsDimension='2|3']?>
+ :    <gml:exterior>
+ :      <gml:LinearRing> ... </gml:LinearRing>
+ :    </gml:exterior>
+ :    [<gml:interior>
+ :       <gml:LinearRing> ... </gml:LinearRing>
+ :     </gml:interior>]*
+ :  </gml:Polygon>]]></pre>
+ :  <dt><b>MultiPoint</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:MultiPoint [srsDimension='2|3']?>
+ :    [<gml:Point> ... </gml:Point>]*
+ :  </gml:MultiPoint>]]></pre>
+ :  <dt><b>MultiCurve</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:MultiCurve [srsDimension='2|3']?>
+ :    [<gml:LineString> ... </gml:LineString>]*
+ :  </gml:MultiCurve>]]></pre>
+ :  <dt><b>MultiSurface</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:MultiSurface [srsDimension='2|3']?>
+ :    [<gml:Polygon> ... </gml:Polygon>]*
+ :  </gml:MultiSurface>
+ :  ]]></pre>
+ :  <dt><b>MultiGeometry (this is from GML 3 schema)</b></dt>
+ :  <pre class="ace-static" ace-mode="xquery"><![CDATA[<gml:MultiGeometry [srsDimension='2|3']?>
+ :     [<gml:geometryMember>
+ :          ...one geometry...
+ :     </gml:geometryMember>]*
+ :    [<gml:geometryMembers>
+ :      ...a list of geometries...
+ :    </gml:geometryMembers>]?
+ :  </gml:MultiGeometry>]]></pre>
+ : </dl><br/><br/>
+ : Note: When using gml:posList, it is possible to replace this element with a list of gml:pos.<br/>
+ : Note: XLink referencing is not supported.<br/>
+ : Note: The <i>srsDimension</i> optional attribute specifies the coordinate dimension. The default value is 2 (for 2D).
+ :    Another possible value is 3 (for 3D) in which case every point has to have three double values (x, y, z).
+ :    This is an extension borrowed from GML 3 spec. <br/>
+ : The operations made on 3D objects work only on x-y coordinates, the z coordinate is not taken into account.
+ : When returning the result, the original z-coordinates of the points are preserved.
+ : For computed points, the z-coordinate is interpolated.<br/>
+ : <br/>
+ : The coordinates values have to be in cartesian coordinates, not in polar coordinates. <br/>
+ : Converting between coordinate systems and doing projections from polar to cartesian is outside the scope of this geo module. <br/>
+ : <br/>
+ : For operations between two geometries, the DE-9IM matrix is used. The DE-9IM matrix is defined like this:
+ : <table>
+ :	<tr>
+ :		 <td></td>
+ :		 <td><b>Interior</b></td>
+ :		 <td><b>Boundary</b></td>
+ :		 <td><b>Exterior</b></td>
+ :		</tr>
+ :		<tr>
+ :		 <td><b>Interior</b></td>
+ :		 <td>dim(intersection of interior1 and interior2)</td>
+ :		 <td>dim(intersection of interior1 and boundary2)</td>
+ :		 <td>dim(intersection of interior1 and exterior2)</td>
+ :		</tr>
+ :		<tr>
+ :		 <td><b>Boundary</b></td>
+ :		 <td>dim(intersection of boundary1 and interior2)</td>
+ :		 <td>dim(intersection of boundary1 and boundary2)</td>
+ :		 <td>dim(intersection of boundary1 and exterior2)</td>
+ :		</tr>
+ :		<tr>
+ :		 <td><b>Exterior</b></td>
+ :		 <td>dim(intersection of exterior1 and interior2)</td>
+ :		 <td>dim(intersection of exterior1 and boundary2)</td>
+ :		 <td>dim(intersection of exterior1 and exterior2)</td>
+ :		</tr>
+ :	</table>
+ :	<br/>
+ :	The values in the DE-9IM can be T, F, *, 0, 1, 2 .<br/>
+ :  - T means the intersection gives a non-empty result.<br/>
+ :  - F means the intersection gives an empty result.<br/>
+ :  - * means any result.<br/>
+ :  - 0, 1, 2 gives the expected dimension of the result (point, curve, surface)<br/>
+ : <br/><br/>
+ :
+ : How to build geo module:<br/>
+ : - You need GEOS library from here http://trac.osgeo.org/geos/ . Make sure it is version 3.2.2, or better 3.3.0 or above.
+ : - After installing or compiling GEOS, on Windows you need to set the cmake variables GEOS_INCLUDE_DIR and GEOS_LIBRARY.
+ : On Linux the variables are set automatically by cmake.
+ : 
+ : @author Daniel Turcanu
+ :
+ : @see http://expath.org/spec/geo
+ : @see http://www.opengeospatial.org/standards/sfa
+ : @see http://www.opengeospatial.org/standards/gml
+ : @see http://trac.osgeo.org/geos/
+ : @library <a href="http://trac.osgeo.org/geos/";>GEOS (Geometry Engine - Open Source)</a>
+ : @project EXPath/Geo
+ :)
+module namespace geo = "http://zorba.io/modules/geo";;
+
+(:~
+ : Declare the namespace for the gml geometry objects.
+:)
+declare namespace gml="http://www.opengis.net/gml";;
+
+(:~
+ : Declare the expath errors namespace.
+:)
+declare namespace geo-err="http://expath.org/ns/error";;
+
+declare namespace ver = "http://www.zorba-xquery.com/options/versioning";;
+declare option ver:module-version "1.0";
+
+
+(:~
+ : Return the dimension of the geo object. 
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return 0 for point, 1 for line, 2 for surface.
+ : @error geo-err:UnrecognizedGeoObject
+ : @example test/Queries/geo/dimension1.xq
+ : @example test/Queries/geo/dimension2.xq
+ : @example test/Queries/geo/dimension3.xq
+ : @example test/Queries/geo/dimension4.xq
+ : @example test/Queries/geo/dimension5.xq
+ : @example test/Queries/geo/dimension6.xq
+ : @example test/Queries/geo/dimension7.xq
+ : @example test/Queries/geo/dimension8.xq
+ : @example test/Queries/geo/dimension9.xq
+ : @example test/Queries/geo/dimension10.xq
+:)
+declare function geo:dimension( $geometry as element()) as xs:integer external;
+
+(:~
+ : Return the coordinate dimension of the geo object, as specified in the srsDimension attribute.<br/>
+ : Only two-dimensional and three-dimensional coordinates are supported.
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return 2 for 2D, 3 for 3D.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/coordinate_dimension1.xq
+ : @example test/Queries/geo/coordinate_dimension2.xq
+ : @example test/Queries/geo/coordinate_dimension3.xq
+ : @example test/Queries/geo/coordinate_dimension4.xq
+ : @example test/Queries/geo/coordinate_dimension5.xq
+ : @example test/Queries/geo/coordinate_dimension6.xq
+:)
+declare function geo:coordinate-dimension( $geometry as element()) as xs:integer external;
+
+(:~
+ : Return the qname type of geo object. <br/>
+ : Returns empty sequence if the geometry is not recognized. <br/>
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return "gml:Point" for Point, "gml:LineString" for LineString, "gml:Curve" for Curve, "gml:LineString" for LinearRing,
+ :     "gml:Surface" for Surface, "gml:Polygon" for Polygon and PolygonPatch, 
+ :     "gml:MultiPoint" for MultiPoint, "gml:MultiCurve" for MultiCurve,
+ :     "gml:MultiSurface" for MultiSurface, "gml:MultiGeometry" for MultiGeometry
+ : @error geo-err:UnrecognizedGeoObject
+ : @example test/Queries/geo/geometry_type1.xq
+ : @example test/Queries/geo/geometry_type2.xq
+ : @example test/Queries/geo/geometry_type3.xq
+ : @example test/Queries/geo/geometry_type4.xq
+ : @example test/Queries/geo/geometry_type5.xq
+ : @example test/Queries/geo/geometry_type6.xq
+ : @example test/Queries/geo/geometry_type7.xq
+ : @example test/Queries/geo/geometry_type8.xq
+ : @example test/Queries/geo/geometry_type9.xq
+ : @example test/Queries/geo/geometry_type10.xq
+ : @example test/Queries/geo/geometry_type11.xq
+:)
+declare function geo:geometry-type( $geometry as element()) as xs:QName? external;
+
+(:~
+ : Return the srid URI of geo object. 
+ : SRID is contained in the srsName attribute in the geo element, or one of the parents,
+ : or in the boundedBy/Envelope element in one of the parents.<br/>
+ : This function searches recursively from this element up to the top-most parent.<br/>
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return the SRID if it is found
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/srid1.xq
+ : @example test/Queries/geo/srid2.xq
+ : @example test/Queries/geo/srid3.xq
+ : @example test/Queries/geo/srid4.xq
+ : @example test/Queries/geo/srid5.xq
+:)
+declare function geo:srid( $geometry as element()) as xs:anyURI? external;
+
+(:~
+ : Return the number of geometries in the collection, or 1 for non-collection. 
+ : For gml:Point, gml:LineString, gml:LinearRing, gml:Polygon, return 1.
+ : For gml:Curve and gml:Surface, they are treated as geometric collections.
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return number of geometries in collection
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/num-geometries1.xq
+ : @example test/Queries/geo/num-geometries2.xq
+ : @example test/Queries/geo/num-geometries3.xq
+:)
+declare function geo:num-geometries( $geometry as element()) as xs:unsignedInt external;
+
+(:~
+ : Return the n-th geometry in the collection. 
+ : Return this geometry if it is not a collection.
+ : For gml:Point, gml:LineString, gml:LinearRing, gml:Polygon, return this item if n is zero, otherwise error.
+ : For gml:Curve and gml:Surface, they are treated as geometric collections.
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $n zero-based index in the collection
+ : @return n-th geometry in collection. The node is the original node, not a copy.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/geometry-n1.xq
+ : @example test/Queries/geo/geometry-n2.xq
+ : @example test/Queries/geo/geometry-n3.xq
+ : @example test/Queries/geo/geometry-n4.xq
+:)
+declare function geo:geometry-n( $geometry as element(), $n as xs:unsignedInt) as element() external;
+
+(:~
+ : The envelope is the minimum bounding box of this geometry.
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return An gml:Envelope element with content <br/>
+ :         &lt;gml:Envelope><br/>
+ :         &lt;gml:lowerCorner><i>minx miny</i>&lt;/gml:lowerCorner><br/>
+ :         &lt;gml:upperCorner><i>maxx maxy</i>&lt;/gml:upperCorner><br/>
+ :         &lt;/gml:Envelope>
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/envelope1.xq
+ : @example test/Queries/geo/envelope2.xq
+ : @example test/Queries/geo/envelope3.xq
+ : @example test/Queries/geo/envelope4.xq
+ : @example test/Queries/geo/envelope5.xq
+ : @example test/Queries/geo/envelope6.xq
+ : @example test/Queries/geo/envelope7.xq
+ : @example test/Queries/geo/envelope8.xq
+ : @example test/Queries/geo/envelope9.xq
+ : @example test/Queries/geo/envelope11.xq
+ : @example test/Queries/geo/envelope12.xq
+:)
+declare function geo:envelope( $geometry as element()) as element(gml:Envelope) external;
+
+(:~
+ : Return the Well-known Text Representation of Geometry. <br/>
+ : This is defined in the Simple Features spec from OGC.<br/>
+ : gml:Curve is represented as MultiLineString.<br/>
+ : gml:Surface is represented as MultiPolygon.<br/>
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return the Well-known Text Representation for the geo object.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/as_text1.xq
+ : @example test/Queries/geo/as_text2.xq
+ : @example test/Queries/geo/as_text3.xq
+ : @example test/Queries/geo/as_text4.xq
+ : @example test/Queries/geo/as_text5.xq
+ : @example test/Queries/geo/as_text6.xq
+ : @example test/Queries/geo/as_text7.xq
+ : @example test/Queries/geo/as_text8.xq
+ : @example test/Queries/geo/as_text9.xq
+:)
+declare function geo:as-text( $geometry as element()) as xs:string external;
+
+(:~
+ : Return the Well-known Binary Representation of Geometry. <br/>
+ : This is defined in the Simple Features spec from OGC.<br/>
+ : gml:Curve is represented as MultiLineString.<br/>
+ : gml:Surface is represented as MultiPolygon.<br/>
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return the Well-known Binary Representation for the geo object as base64.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/as_binary1.xq
+:)
+declare function geo:as-binary( $geometry as element()) as xs:base64Binary external;
+
+(:~
+ : Checks if the argument is empty or not and if it is a valid geometry or not. <br/>
+ : A geometry is considered empty if it has no points.<br/>
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if $geometry is not a valid gmlsf object or if is empty.
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/is_empty1.xq
+ : @example test/Queries/geo/is_empty2.xq
+ : @example test/Queries/geo/is_empty3.xq
+ : @example test/Queries/geo/is_empty4.xq
+ : @example test/Queries/geo/is_empty5.xq
+:)
+declare function geo:is-empty( $geometry as element()?) as xs:boolean external;
+
+(:~
+ : Checks if this geometric object has no anomalous geometric points, such
+ :	as self intersection or self tangency. <br/>
+ : Does not work for gml:Surface and gml:MultiGeometry.
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString,
+ :    gml:LinearRing, gml:Curve, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface
+ : @return true if $geometry is simple.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/is_simple1.xq
+ : @example test/Queries/geo/is_simple2.xq
+ : @example test/Queries/geo/is_simple3.xq
+ : @example test/Queries/geo/is_simple4.xq
+ : @example test/Queries/geo/is_simple5.xq
+ : @example test/Queries/geo/is_simple6.xq
+ : @example test/Queries/geo/is_simple7.xq
+ : @example test/Queries/geo/is_simple8.xq
+ : @example test/Queries/geo/is_simple9.xq
+ : @example test/Queries/geo/is_simple10.xq
+ : @example test/Queries/geo/is_simple11.xq
+ : @example test/Queries/geo/is_simple12.xq
+ : @example test/Queries/geo/is_simple13.xq
+ : @example test/Queries/geo/is_simple14.xq
+:)
+declare function geo:is-simple( $geometry as element()) as xs:boolean external;
+
+(:~
+ : Checks if this geometric object is 2D or 3D, as specified in srsDimension optional attribute.<br/>
+ : 
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if $geometry is 3D. 
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/is_3D1.xq
+ : @example test/Queries/geo/is_3D2.xq
+:)
+declare function geo:is-3d( $geometry as element()) as xs:boolean external;
+
+(:~
+ : Checks if this geometric object has measurements.<br/>
+ : Measurements is not supported in this geo module, so the function returns false.
+ : 
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return false. 
+ : @error geo-err:UnrecognizedGeoObject
+ : @example test/Queries/geo/is_measured1.xq
+:)
+declare function geo:is-measured( $geometry as element()) as xs:boolean external;
+
+(:~
+ : A boundary is a set that represents the limit of an geometry.<br/>
+ : For a Point or MultiPoint, the boundary is the empty geometry, nothing is returned.<br/>
+ : For a LineString, the boundary is the MultiPoint set of start point and end point.<br/>
+ : For a LinearRing, the boundary is empty MultiPoint.<br/>
+ : For a Curve, it is treated as a MultiCurve.<br/>
+ : For a Polygon, the boundary is the MultiCurve set of exterior and interior rings.<br/>
+ : For a Surface, the boundary is the MultiCurve set formed from the exterior ring of all patches
+ :  seen as a single surface and all the interior rings from all patches.<br/>
+ : For MultiCurve, the boundary is the MultiPoint set of all start and end points that appear
+ :  in an odd number of linestrings.<br/>
+ : For MultiGeometry, a sequence of boundaries is returned, corresponding to each child geometry.<br/>
+ : <br/>
+ : 
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:LinearRing,
+ :    gml:Curve, gml:Polygon, gml:Surface, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return the boundary of a Geometry as a set of Geometries of the next lower dimension.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/boundary1.xq
+ : @example test/Queries/geo/boundary2.xq
+ : @example test/Queries/geo/boundary3.xq
+ : @example test/Queries/geo/boundary4.xq
+ : @example test/Queries/geo/boundary5.xq
+ : @example test/Queries/geo/boundary6.xq
+ : @example test/Queries/geo/boundary7.xq
+ : @example test/Queries/geo/boundary8.xq
+ : @example test/Queries/geo/boundary9.xq
+ : @example test/Queries/geo/boundary10.xq
+ : @example test/Queries/geo/boundary11.xq
+ : @example test/Queries/geo/boundary12.xq
+ : @example test/Queries/geo/boundary13.xq
+ : @example test/Queries/geo/boundary14.xq
+:)
+declare function geo:boundary( $geometry as element()) as element()* external;
+
+
+
+
+
+(:~
+ : Checks if the two geometries are equal.<br/>
+ :<br/>
+ : Note: Does not work for gml:Surface and gml:MultiSurface if they have multiple Polygons.<br/>
+ : 
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if the DE-9IM intersection matrix for the two Geometrys is T*F**FFF*.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/equals1.xq
+ : @example test/Queries/geo/equals2.xq
+ : @example test/Queries/geo/equals3.xq
+ : @example test/Queries/geo/equals4.xq
+ : @example test/Queries/geo/equals5.xq
+ : @example test/Queries/geo/equals6.xq
+ : @example test/Queries/geo/equals7.xq
+ : @example test/Queries/geo/equals8.xq
+ : @example test/Queries/geo/equals9.xq
+:)
+declare function geo:equals( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 covers geometry2.<br/>
+ : It has to fulfill one of these conditions:<br/>
+ :  - every point of geometry2 is a point of geometry1<br/>
+ :  - the DE-9IM Intersection Matrix for the two geometries is
+ :     T*****FF* or *T****FF* or ***T**FF* or ****T*FF*.<br/>
+ : <br/>
+ : Unlike contains it does not distinguish between points in the boundary and in the interior of geometries.
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 covers geometry2.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/covers6.xq
+:)
+declare function geo:covers( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 does not touch or intersects geometry2.<br/>
+ : It has to fulfill these conditions:<br/>
+ :  - they have no point in common<br/>
+ :  - the DE-9IM Intersection Matrix for the two geometries is
+ :     FF*FF****.<br/>
+ :  - geometry1 does not intersect geometry2<br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 and geometry2 are disjoint.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/disjoint1.xq
+ : @example test/Queries/geo/disjoint2.xq
+ : @example test/Queries/geo/disjoint3.xq
+ : @example test/Queries/geo/disjoint4.xq
+ : @example test/Queries/geo/disjoint5.xq
+ : @example test/Queries/geo/disjoint6.xq
+ : @example test/Queries/geo/disjoint7.xq
+ : @example test/Queries/geo/disjoint8.xq
+ : @example test/Queries/geo/disjoint9.xq
+:)
+declare function geo:disjoint( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 intersects geometry2.<br/>
+ : This is true if disjoint returns false.
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 and geometry2 are not disjoint.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/intersects1.xq
+ : @example test/Queries/geo/intersects2.xq
+ : @example test/Queries/geo/intersects3.xq
+ : @example test/Queries/geo/intersects4.xq
+ : @example test/Queries/geo/intersects5.xq
+ : @example test/Queries/geo/intersects6.xq
+ : @example test/Queries/geo/intersects6_3d.xq
+ : @example test/Queries/geo/intersects7.xq
+ : @example test/Queries/geo/intersects8.xq
+ : @example test/Queries/geo/intersects9.xq
+:)
+declare function geo:intersects( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 touches geometry2.<br/>
+ : Returns true if the DE-9IM intersection matrix for the two
+ : geometries is FT*******, F**T***** or F***T****.
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 touches geometry2.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/touches1.xq
+ : @example test/Queries/geo/touches2.xq
+ : @example test/Queries/geo/touches3.xq
+ : @example test/Queries/geo/touches4.xq
+ : @example test/Queries/geo/touches5.xq
+ : @example test/Queries/geo/touches6.xq
+ : @example test/Queries/geo/touches7.xq
+ : @example test/Queries/geo/touches8.xq
+ : @example test/Queries/geo/touches9.xq
+:)
+declare function geo:touches( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 crosses geometry2.<br/>
+ : That is if the geometries have some but not all interior points in common.
+ : Returns true if the DE-9IM intersection matrix for the two
+ : geometries is<br/>
+ : T*T****** (for P/L, P/A, and L/A situations)<br/> 
+ : T*****T** (for L/P, A/P, and A/L situations) <br/>
+ : 0******** (for L/L situations).<br/>
+ : <br/>
+ : This applies for situations:  P/L, P/A, L/L, L/A, L/P, A/P and A/L.
+ : For other situations it returns false.
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 crosses geometry2.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/crosses1.xq
+ : @example test/Queries/geo/crosses2.xq
+ : @example test/Queries/geo/crosses3.xq
+ : @example test/Queries/geo/crosses4.xq
+ : @example test/Queries/geo/crosses5.xq
+ : @example test/Queries/geo/crosses6.xq
+ : @example test/Queries/geo/crosses7.xq
+ : @example test/Queries/geo/crosses8.xq
+ : @example test/Queries/geo/crosses9.xq
+ : @example test/Queries/geo/crosses10.xq
+:)
+declare function geo:crosses( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 is within geometry2.<br/>
+ : Returns true if the DE-9IM intersection matrix for the two
+ : geometries is T*F**F***.
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 is within geometry2.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/within1.xq
+ : @example test/Queries/geo/within2.xq
+ : @example test/Queries/geo/within3.xq
+ : @example test/Queries/geo/within4.xq
+ : @example test/Queries/geo/within5.xq
+ : @example test/Queries/geo/within6.xq
+ : @example test/Queries/geo/within7.xq
+ : @example test/Queries/geo/within8.xq
+ : @example test/Queries/geo/within9.xq
+:)
+declare function geo:within( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 contains geometry2.<br/>
+ : Returns true if within(geometry2, geometry1) is true.
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 contains geometry2.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/contains1.xq
+ : @example test/Queries/geo/contains2.xq
+ : @example test/Queries/geo/contains3.xq
+ : @example test/Queries/geo/contains4.xq
+ : @example test/Queries/geo/contains5.xq
+ : @example test/Queries/geo/contains6.xq
+ : @example test/Queries/geo/contains7.xq
+ : @example test/Queries/geo/contains8.xq
+ : @example test/Queries/geo/contains9.xq
+ : @example test/Queries/geo/contains10.xq
+:)
+declare function geo:contains( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 overlaps with geometry2.<br/>
+ : Returns true if DE-9IM intersection matrix for the two
+ : geometries is T*T***T** (for two points or two surfaces)
+ :	 or * 1*T***T** (for two curves).
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return true if geometry1 overlaps geometry2.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/overlaps1.xq
+ : @example test/Queries/geo/overlaps2.xq
+ : @example test/Queries/geo/overlaps3.xq
+ : @example test/Queries/geo/overlaps4.xq
+ : @example test/Queries/geo/overlaps5.xq
+ : @example test/Queries/geo/overlaps6.xq
+ : @example test/Queries/geo/overlaps7.xq
+ : @example test/Queries/geo/overlaps8.xq
+ : @example test/Queries/geo/overlaps9.xq
+ : @example test/Queries/geo/overlaps10.xq
+ : @example test/Queries/geo/overlaps11.xq
+ : @example test/Queries/geo/overlaps12.xq
+:)
+declare function geo:overlaps( $geometry1 as element(),  $geometry2 as element()) as xs:boolean external;
+
+(:~
+ : Checks if geometry1 relates with geometry2 relative to a DE-9IM matrix.<br/>
+ : The DE-9IM matrix is defined like this:
+ : <table>
+ :	<tr>
+ :		 <td></td>
+ :		 <td><b>Interior</b></td>
+ :		 <td><b>Boundary</b></td>
+ :		 <td><b>Exterior</b></td>
+ :		</tr>
+ :		<tr>
+ :		 <td><b>Interior</b></td>
+ :		 <td>dim(intersection of interior1 and interior2)</td>
+ :		 <td>dim(intersection of interior1 and boundary2)</td>
+ :		 <td>dim(intersection of interior1 and exterior2)</td>
+ :		</tr>
+ :		<tr>
+ :		 <td><b>Boundary</b></td>
+ :		 <td>dim(intersection of boundary1 and interior2)</td>
+ :		 <td>dim(intersection of boundary1 and boundary2)</td>
+ :		 <td>dim(intersection of boundary1 and exterior2)</td>
+ :		</tr>
+ :		<tr>
+ :		 <td><b>Exterior</b></td>
+ :		 <td>dim(intersection of exterior1 and interior2)</td>
+ :		 <td>dim(intersection of exterior1 and boundary2)</td>
+ :		 <td>dim(intersection of exterior1 and exterior2)</td>
+ :		</tr>
+ :	</table>
+ :	<br/>
+ :	The values in the DE-9IM can be T, F, *, 0, 1, 2 .<br/>
+ :  - T means the intersection gives a non-empty result.<br/>
+ :  - F means the intersection gives an empty result.<br/>
+ :  - * means any result.<br/>
+ :  - 0, 1, 2 gives the expected dimension of the result (point, curve, surface)<br/>
+ : <br/><br/>
+ : For example, the matrix of "T*T***T**" checks for intersections of interior1 with interior2,
+ : interior1 with exterior2 and exterior1 with interior2.
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString,
+ :    gml:LinearRing, gml:Polygon
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString,
+ :    gml:LinearRing, gml:Polygon
+ : @param $intersection_matrix the DE-9IM matrix, with nine chars, three chars for each line in DE-9IM matrix.
+ : @return true if geometry1 relates to geometry2 according to the intersection matrix.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/relate1.xq
+ : @example test/Queries/geo/relate2.xq
+ : @example test/Queries/geo/relate3.xq
+ : @example test/Queries/geo/relate4.xq
+:)
+declare function geo:relate( $geometry1 as element(),  $geometry2 as element(), $intersection_matrix as xs:string) as xs:boolean external;
+
+
+
+
+(:~
+ : Compute the shortest distance between any two Points in geometry1 and geometry2.<br/>
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return minimum distance as xs:double.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/distance1.xq
+:)
+declare function geo:distance( $geometry1 as element(),  $geometry2 as element()) as xs:double external;
+
+(:~
+ : Returns a polygon that represents all Points whose distance
+ :   from this geometric object is less than or equal to distance.<br/>
+ : <br/>
+ :
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $distance the distance from geometry, expressed in units of the current coordinate system
+ : @return new geometry surrounding the input geometry.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/buffer1.xq
+ : @example test/Queries/geo/buffer2.xq
+ : @example test/Queries/geo/buffer3.xq
+ : @example test/Queries/geo/buffer4.xq
+ : @example test/Queries/geo/buffer5.xq
+ : @example test/Queries/geo/buffer6.xq
+ : @example test/Queries/geo/buffer7.xq
+ : @example test/Queries/geo/buffer8.xq
+ : @example test/Queries/geo/buffer9.xq
+ : @example test/Queries/geo/buffer10.xq
+:)
+declare function geo:buffer( $geometry as element(),  $distance as xs:double) as element() external;
+
+(:~
+ : Returns the smallest convex Polygon that contains all the points in the Geometry.<br/>
+ : Actually returns the object of smallest dimension possible (possible Point or LineString).<br/>
+ : <br/>
+ :
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return the convex polygon node.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/convex-hull1.xq
+ : @example test/Queries/geo/convex-hull2.xq
+ : @example test/Queries/geo/convex-hull3.xq
+ : @example test/Queries/geo/convex-hull3_3d.xq
+ : @example test/Queries/geo/convex-hull4.xq
+ : @example test/Queries/geo/convex-hull5.xq
+ : @example test/Queries/geo/convex-hull6.xq
+ : @example test/Queries/geo/convex-hull7.xq
+ : @example test/Queries/geo/convex-hull8.xq
+ : @example test/Queries/geo/convex-hull9.xq
+ : @example test/Queries/geo/convex-hull10.xq
+:)
+declare function geo:convex-hull( $geometry as element()) as element() external;
+
+(:~
+ : Returns a geometric object that represents the Point set intersection of
+ :    geometry1 and geometry2.<br/>
+ : For intersection of two polygons interiors, returns a polygon.<br/>
+ : If intersection is void, empty sequence is returned.
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return point set geometry node.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/intersection1.xq
+ : @example test/Queries/geo/intersection2.xq
+ : @example test/Queries/geo/intersection3.xq
+ : @example test/Queries/geo/intersection4.xq
+ : @example test/Queries/geo/intersection5.xq
+ : @example test/Queries/geo/intersection6.xq
+ : @example test/Queries/geo/intersection7.xq
+ : @example test/Queries/geo/intersection8.xq
+ : @example test/Queries/geo/intersection8_3d.xq
+ : @example test/Queries/geo/intersection9.xq
+ : @example test/Queries/geo/intersection10.xq
+:)
+declare function geo:intersection( $geometry1 as element(),  $geometry2 as element()) as element()? external;
+
+(:~
+ : Returns a geometric object that represents the Point set union of
+ :    geometry1 and geometry2.<br/>
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return point set geometry node.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/union1.xq
+ : @example test/Queries/geo/union2.xq
+ : @example test/Queries/geo/union3.xq
+ : @example test/Queries/geo/union4.xq
+ : @example test/Queries/geo/union5.xq
+ : @example test/Queries/geo/union5_3d.xq
+ : @example test/Queries/geo/union6.xq
+ : @example test/Queries/geo/union7.xq
+ : @example test/Queries/geo/union8.xq
+ : @example test/Queries/geo/union9.xq
+:)
+declare function geo:union( $geometry1 as element(),  $geometry2 as element()) as element() external;
+
+(:~
+ : Returns a geometric object that represents the Point set difference of
+ :    geometry1 and geometry2. Points that are in geometry1 and are not in geometry2.<br/>
+ : If difference is empty geometry, empty sequence is returned.
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return point set geometry node.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/difference1.xq
+ : @example test/Queries/geo/difference2.xq
+ : @example test/Queries/geo/difference3.xq
+ : @example test/Queries/geo/difference4.xq
+ : @example test/Queries/geo/difference5.xq
+ : @example test/Queries/geo/difference6.xq
+ : @example test/Queries/geo/difference7.xq
+ : @example test/Queries/geo/difference8.xq
+ : @example test/Queries/geo/difference9.xq
+ : @example test/Queries/geo/difference10.xq
+:)
+declare function geo:difference( $geometry1 as element(),  $geometry2 as element()) as element()? external;
+
+(:~
+ : Returns a geometric object that represents the Point set symmetric difference of
+ :    geometry1 and geometry2. Points that are in geometry1 and are not in geometry2
+ :    and points that are in geometry2 and are not in geometry1.<br/>
+ : If difference is empty geometry, empty sequence is returned.
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return point set geometry node.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/sym-difference1.xq
+ : @example test/Queries/geo/sym-difference2.xq
+ : @example test/Queries/geo/sym-difference3.xq
+ : @example test/Queries/geo/sym-difference4.xq
+ : @example test/Queries/geo/sym-difference5.xq
+ : @example test/Queries/geo/sym-difference6.xq
+ : @example test/Queries/geo/sym-difference7.xq
+ : @example test/Queries/geo/sym-difference8.xq
+ : @example test/Queries/geo/sym-difference9.xq
+:)
+declare function geo:sym-difference( $geometry1 as element(),  $geometry2 as element()) as element()? external;
+
+
+
+
+(:~
+ : Returns the area of this geometry.<br/>
+ : Returns zero for Point and Lines.<br/>
+ : <br/>
+ :
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return geometry area as xs:double.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/area1.xq
+ : @example test/Queries/geo/area2.xq
+ : @example test/Queries/geo/area3.xq
+ : @example test/Queries/geo/area4.xq
+ : @example test/Queries/geo/area5.xq
+ : @example test/Queries/geo/area6.xq
+ : @example test/Queries/geo/area7.xq
+ : @example test/Queries/geo/area8.xq
+ : @example test/Queries/geo/area9.xq
+ : @example test/Queries/geo/area10.xq
+:)
+declare function geo:area( $geometry as element()) as xs:double external;
+
+(:~
+ : Returns the length of the lines of this geometry.<br/>
+ : Returns zero for Points.<br/>
+ : <br/>
+ :
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return geometry length as xs:double.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/length1.xq
+ : @example test/Queries/geo/length2.xq
+ : @example test/Queries/geo/length3.xq
+ : @example test/Queries/geo/length4.xq
+ : @example test/Queries/geo/length5.xq
+ : @example test/Queries/geo/length6.xq
+ : @example test/Queries/geo/length7.xq
+ : @example test/Queries/geo/length8.xq
+ : @example test/Queries/geo/length9.xq
+ : @example test/Queries/geo/length10.xq
+:)
+declare function geo:length( $geometry as element()) as xs:double external;
+
+(:~
+ : Checks if geometry2 is within a certain distance of geometry1.<br/>
+ : <br/>
+ :
+ : @param $geometry1 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $geometry2 node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @param $distance the distance from geometry1, expressed in units of the current coordinate system
+ : @return true if distance from geometry1 to geometry2 is less than $distance.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:SRSNotIdenticalInBothGeometries
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/is-within-distance1.xq
+ : @example test/Queries/geo/is-within-distance2.xq
+ : @example test/Queries/geo/is-within-distance3.xq
+ : @example test/Queries/geo/is-within-distance4.xq
+ : @example test/Queries/geo/is-within-distance5.xq
+ : @example test/Queries/geo/is-within-distance6.xq
+ : @example test/Queries/geo/is-within-distance7.xq
+ : @example test/Queries/geo/is-within-distance8.xq
+ : @example test/Queries/geo/is-within-distance9.xq
+:)
+declare function geo:is-within-distance( $geometry1 as element(),  $geometry2 as element(), $distance as xs:double) as xs:boolean external;
+
+(:~
+ : Returns a Point that is the mathematical centroid of this geometry.
+ : The result is not guaranteed to be on the surface. <br/>
+ : <br/>
+ :
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return centroid Point.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/centroid1.xq
+ : @example test/Queries/geo/centroid2.xq
+ : @example test/Queries/geo/centroid3.xq
+ : @example test/Queries/geo/centroid4.xq
+ : @example test/Queries/geo/centroid5.xq
+ : @example test/Queries/geo/centroid6.xq
+ : @example test/Queries/geo/centroid7.xq
+ : @example test/Queries/geo/centroid8.xq
+ : @example test/Queries/geo/centroid9.xq
+ : @example test/Queries/geo/centroid10.xq
+:)
+declare function geo:centroid( $geometry as element()) as element(gml:Point) external;
+
+(:~
+ : Returns a Point that is interior of this geometry.
+ : If it cannot be inside the geometry, then it will be on the boundary. <br/>
+ : <br/>
+ :
+ : @param $geometry node of one of GMLSF objects: gml:Point, gml:LineString, gml:Curve, gml:LinearRing, 
+ :    gml:Surface, gml:Polygon, gml:MultiPoint, gml:MultiCurve, gml:MultiSurface, gml:MultiGeometry
+ : @return a Point inside the geometry.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/interior-point1.xq
+ : @example test/Queries/geo/interior-point2.xq
+ : @example test/Queries/geo/interior-point3.xq
+ : @example test/Queries/geo/interior-point4.xq
+ : @example test/Queries/geo/interior-point5.xq
+ : @example test/Queries/geo/interior-point6.xq
+ : @example test/Queries/geo/interior-point7.xq
+ : @example test/Queries/geo/interior-point8.xq
+ : @example test/Queries/geo/interior-point9.xq
+ : @example test/Queries/geo/interior-point10.xq
+:)
+declare function geo:point-on-surface( $geometry as element()) as element(gml:Point) external;
+
+
+
+
+
+
+(:~
+ : Returns the X coordinate of a Point.
+ : <br/>
+ :
+ : @param $point node of one of GMLSF objects: gml:Point
+ : @return the X coordinate
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/point_xyz1.xq
+ : @example test/Queries/geo/point_xyz4.xq
+:)
+declare function geo:x( $point as element(gml:Point)) as xs:double external;
+
+(:~
+ : Returns the Y coordinate of a Point.
+ : <br/>
+ :
+ : @param $point node of one of GMLSF objects: gml:Point
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @return the Y coordinate
+ : @example test/Queries/geo/point_xyz2.xq
+:)
+declare function geo:y( $point as element(gml:Point)) as xs:double external;
+
+(:~
+ : Returns the Z coordinate of a Point, if is 3D.
+ : <br/>
+ :
+ : @param $point node of one of GMLSF objects: gml:Point
+ : @return the Z coordinate, or empty sequence if 2D
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/point_xyz3.xq
+ : @example test/Queries/geo/point_xyz5.xq
+:)
+declare function geo:z( $point as element(gml:Point)) as xs:double? external;
+
+(:~
+ : Should return the Measure of a Point, but is not implemented, 
+ : because it is not specified in GMLSF.
+ : <br/>
+ :
+ : @param $point node of one of GMLSF objects: gml:Point
+ : @return always empty sequence
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @example test/Queries/geo/point_xyz6.xq
+:)
+declare function geo:m( $point as element(gml:Point)) as xs:double? external;
+
+
+
+
+
+
+
+(:~
+ : Returns the start Point of a line.
+ : <br/>
+ :
+ : @param $line node of one of GMLSF objects: gml:LineString, gml:LinearRing, gml:Curve
+ : @return the starting gml:Point, constructed with the first coordinates in the line.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/start-point1.xq
+ : @example test/Queries/geo/start-point2.xq
+ : @example test/Queries/geo/start-point3.xq
+:)
+declare function geo:start-point( $line as element()) as element(gml:Point) external;
+
+(:~
+ : Returns the end Point of a line.
+ : <br/>
+ :
+ : @param $line node of one of GMLSF objects: gml:LineString, gml:LinearRing, gml:Curve
+ : @return the end gml:Point, constructed with the last coordinates in the line.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/end-point1.xq
+:)
+declare function geo:end-point( $line as element()) as element(gml:Point) external;
+
+(:~
+ : Checks if the line is closed loop. That is, if the start Point is same with end Point.
+ : For gml:Curve, checks if the start point of the first segment is the same with the
+ :   last point of the last segment. It also checks that all the segments are connected together,
+ :   and returns false if they aren't.<br/>
+ : For gml:MultiCurve, checks recursively for each LineString.<br/>
+ : For gml:Surface, checks if the exterior boundary of each patch touches completely other patches,
+ :   so the Surface encloses a solid.
+ :   For this to happen there is a need for 3D objects, and full 3D processing is not supported in GEOS library,
+ :   so the function always returns false in this case.
+ : <br/>
+ :
+ : @param $geom node of one of GMLSF objects: gml:LineString, gml:LinearRing, gml:Curve,
+ :      gml:MultiCurve, gml:Surface
+ : @return true if the line or surface is closed.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/is-closed1.xq
+ : @example test/Queries/geo/is-closed2.xq
+ : @example test/Queries/geo/is-closed3.xq
+ : @example test/Queries/geo/is-closed4.xq
+ : @example test/Queries/geo/is-closed5.xq
+ : @example test/Queries/geo/is-closed6.xq
+:)
+declare function geo:is-closed( $geom as element()) as xs:boolean external;
+
+(:~
+ : Checks if the line is a ring. That is, if the line is closed and simple.
+ : <br/>
+ :
+ : @param $line node of one of GMLSF objects: gml:LineString, gml:LinearRing, gml:Curve
+ : @return true if the line is a closed ring.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/is-ring1.xq
+ : @example test/Queries/geo/is-ring2.xq
+ : @example test/Queries/geo/is-ring3.xq
+ : @example test/Queries/geo/is-ring4.xq
+:)
+declare function geo:is-ring( $line as element()) as xs:boolean external;
+
+(:~
+ : Return the number of Points in a line.
+ : <br/>
+ :
+ : @param $line node of one of GMLSF objects: gml:LineString, gml:LinearRing, gml:Curve,
+ :   gml:MultiCurve
+ : @return number of points in the line
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/num-points1.xq
+ : @example test/Queries/geo/num-points2.xq
+ : @example test/Queries/geo/num-points3.xq
+:)
+declare function geo:num-points( $line as element()) as xs:unsignedInt external;
+
+(:~
+ : Return the n-th Point in a line.
+ :
+ : @param $line node of one of GMLSF objects: gml:LineString, gml:LinearRing, gml:Curve,
+ :    gml:MultiCurve
+ : @param $n index in the list of coordinates, zero based.
+ : @return n-th point in the line, zero-based. The node is gml:Point constructed with n-th coordinate from line.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/point-n1.xq
+ : @example test/Queries/geo/point-n2.xq
+ : @example test/Queries/geo/point-n3.xq
+:)
+declare function geo:point-n( $line as element(), $n as xs:unsignedInt) as element(gml:Point) external;
+
+
+
+
+
+
+(:~
+ : Return the exterior ring of a Polygon.
+ : <br/>
+ :
+ : @param $polygon node of one of GMLSF objects: gml:Polygon
+ : @return the original gml:LinearRing node for exterior ring
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/exterior-ring1.xq
+ : @example test/Queries/geo/exterior-ring2.xq
+:)
+declare function geo:exterior-ring( $polygon as element(gml:Polygon)) as element(gml:LinearRing) external;
+
+(:~
+ : Return the number of interior rings of a Polygon.
+ : <br/>
+ :
+ : @param $polygon node of one of GMLSF objects: gml:Polygon
+ : @return the number of interior rings
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/num-interior-ring1.xq
+:)
+declare function geo:num-interior-ring( $polygon as element(gml:Polygon)) as xs:unsignedInt external;
+
+(:~
+ : Return the n-th interior ring of a Polygon.
+ : <br/>
+ :
+ : @param $polygon node of one of GMLSF objects: gml:Polygon
+ : @param $n index in the list of interior rings, zero based.
+ : @return n-th interior ring. The node is the original node, not a copy.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:IndexOutsideRange
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/interior-ring-n1.xq
+:)
+declare function geo:interior-ring-n( $polygon as element(gml:Polygon), $n as xs:unsignedInt) as element(gml:LinearRing) external;
+
+(:~
+ : Return the number of surface patches inside a gml:Surface.<br/>
+ : This function has the same effect as num-geometries(), only it is restricted to gml:Surface.
+ : <br/>
+ :
+ : @param $polyhedral-surface node of one of GMLSF objects: gml:Surface
+ : @return the number of surface patches
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/num-patches1.xq
+ : @example test/Queries/geo/num-patches2.xq
+:)
+declare function geo:num-patches($polyhedral-surface as element(gml:Surface)) as xs:integer external;
+
+(:~
+ : Return the n-th Surface patch of a Surface.<br/>
+ : Only polygonal Surfaces are supported, so a gml:PolygonPatch is returned.<br/>
+ : The gml:PolygonPatch has the same content as gml:Polygon.<br/>
+ : This function has the same effect as geometry-n(), only it is restricted to gml:Surface.
+ : <br/>
+ :
+ : @param $polyhedral-surface node of one of GMLSF objects: gml:Surface
+ : @param $n index in the list of surface patches, zero based.
+ : @return n-th polygon patch. The node is the original node, not a copy.
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:IndexOutsideRange
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/patch-n1.xq
+ : @example test/Queries/geo/patch-n2.xq
+:)
+declare function geo:patch-n($polyhedral-surface as element(gml:Surface),
+																		$n as xs:unsignedInt) as element(gml:PolygonPatch) external;
+
+
+(:~
+ : Return the list of PolygonPatches that share a boundary with the given $polygon.<br/>
+ : The gml:PolygonPatch has the same content as gml:Polygon.<br/>
+ : This function tests the exterior ring of each polygon patch if it overlaps
+ : with the exterior ring of the given polygon.
+ : <br/>
+ :
+ : @param $polyhedral-surface node of one of GMLSF objects: gml:Surface
+ : @param $polygon, of type gml:Polygon or gml:PolygonPatch
+ : @return the list of neibourghing gml:PolygonPatch-es
+ : @error geo-err:UnrecognizedGeoObject
+ : @error geo-err:UnsupportedSRSDimensionValue
+ : @error geo-err:GEOSError
+ : @example test/Queries/geo/bounding-polygons1.xq
+ : @example test/Queries/geo/bounding-polygons2.xq
+ : @example test/Queries/geo/bounding-polygons3.xq
+:)
+declare function geo:bounding-polygons($polyhedral-surface as element(gml:Surface),
+																	 $polygon as element()) as element(gml:PolygonPatch)* external;

=== added directory 'src/geo.xq.src'
=== added file 'src/geo.xq.src/geo_functions.cpp'
--- src/geo.xq.src/geo_functions.cpp	1970-01-01 00:00:00 +0000
+++ src/geo.xq.src/geo_functions.cpp	2013-06-18 22:41:25 +0000
@@ -0,0 +1,4507 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string.h>
+#include <stdio.h>
+#include <cmath>
+#include <stdlib.h>
+
+#include "geo_functions.h"
+
+#include <geos/geom/PrecisionModel.h>
+#include <geos/geom/GeometryFactory.h>
+#include <geos/geom/Geometry.h>
+#include <geos/geom/Point.h>
+#include <geos/geom/LinearRing.h>
+#include <geos/geom/LineString.h>
+#include <geos/geom/Polygon.h>
+#include <geos/geom/GeometryCollection.h>
+#include <geos/geom/MultiPoint.h>
+#include <geos/geom/MultiLineString.h>
+#include <geos/geom/MultiPolygon.h>
+#include <geos/geom/Coordinate.h>
+#include <geos/geom/CoordinateSequence.h>
+#include <geos/geom/CoordinateArraySequence.h>
+#include <geos/geom/CoordinateArraySequenceFactory.h>
+#include <geos/geom/IntersectionMatrix.h>
+#include <geos/io/WKBReader.h>
+#include <geos/io/WKBWriter.h>
+#include <geos/io/WKTWriter.h>
+#include <geos/util/GeometricShapeFactory.h>
+#include <geos/util/GEOSException.h>
+#include <geos/util/IllegalArgumentException.h>
+#include <geos/opLinemerge.h>
+#include <geos/opPolygonize.h>
+#include <geos/version.h>
+#include <vector>
+#include <sstream>
+#include <iomanip>
+
+#include <zorba/empty_sequence.h>
+#include <zorba/singleton_item_sequence.h>
+#include <zorba/store_consts.h>
+#include <zorba/user_exception.h>
+#include <zorba/vector_item_sequence.h>
+#include <zorba/zorba.h>
+#include <zorba/zorba_functions.h>
+
+#include "geo_module.h"
+
+#if GEOS_VERSION_MAJOR < 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR < 2) || \
+  (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR == 2)
+#error Zorba geo module can be linked only with GEOS version 3.2.2 or above, preferably 3.3
+#endif
+
+#define DONT_CHECK_FOR_CURVE_SURFACE true
+
+#define RETURN_RESULT_ITEM            return result_item.isNull() ? ItemSequence_t(NULL) : ItemSequence_t(new SingletonItemSequence(result_item))
+
+namespace zorba { namespace geomodule {
+
+GeoFunction::GeoFunction(const GeoModule* aModule)
+        : theModule(aModule)
+{
+//  geo_factory = NULL;
+}
+
+GeoFunction::~GeoFunction()
+{
+//  delete geo_factory;
+}
+
+String
+GeoFunction::getURI() const
+{
+  return theModule->getURI();
+}
+
+void
+GeoFunction::throwError(
+    const char *err_localname,
+    const std::string aErrorMessage)
+{
+    Item errWrongParamQName;
+    String errNS("http://expath.org/ns/error";);
+    String errName(err_localname);
+    Item errQName = GeoModule::getItemFactory()->createQName(errNS, errName);
+    String errDescription(aErrorMessage);
+    throw USER_EXCEPTION(errQName, errDescription);
+}
+
+enum GeoFunction::gmlsf_types GeoFunction::getGmlSFGeometricType(Item item) const
+{
+  Item  item_qname;
+  item.getNodeName(item_qname);
+  String  item_namespace = item_qname.getNamespace();
+  if(item_namespace != "http://www.opengis.net/gml";)
+    return GMLSF_INVALID;
+  String  localname = item_qname.getLocalName();
+
+  if(localname == "Point")
+    return GMLSF_POINT;
+  else if(localname == "LineString")
+    return GMLSF_LINESTRING;
+  else if(localname == "Curve")
+    return GMLSF_CURVE;
+  else if(localname == "LinearRing")
+    return GMLSF_LINEARRING;
+  else if(localname == "Surface")
+    return GMLSF_SURFACE;
+  else if(localname == "Polygon")
+    return GMLSF_POLYGON;
+  else if(localname == "PolygonPatch")
+    return GMLSF_POLYGON;
+  else if(localname == "MultiPoint")
+    return GMLSF_MULTIPOINT;
+  else if(localname == "MultiCurve")
+    return GMLSF_MULTICURVE;
+  else if(localname == "MultiSurface")
+    return GMLSF_MULTISURFACE;
+  else if(localname == "MultiGeometry")///from GML3
+    return GMLSF_MULTIGEOMETRY;
+  else
+    return GMLSF_INVALID;
+}
+
+enum GeoFunction::gmlsf_types GeoFunction::getGeometryNodeType(const ExternalFunction::Arguments_t& args,
+                                                               int arg_pos, zorba::Item &lItem) const
+{
+  Iterator_t args_iter = args[arg_pos]->getIterator();
+  args_iter->open();
+  if (!args_iter->next(lItem))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+
+  if(!lItem.isNode() || (lItem.getNodeKind() != store::StoreConsts::elementNode))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Argument must be a geometric node ";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  args_iter->close();
+  return getGmlSFGeometricType(lItem);
+}
+
+bool GeoFunction::getChild(zorba::Item &lItem, const char *localname, const char *ns,
+                           zorba::Item &child_item) const
+{
+  Iterator_t    children;
+  children = lItem.getChildren();
+  children->open();
+  bool retval = getChild(children, localname, ns, child_item);
+  children->close();
+  return retval;
+}
+
+bool GeoFunction::getChild(zorba::Iterator_t children, const char *localname, const char *ns,
+                           zorba::Item &child_item) const
+{
+  while(children->next(child_item))
+  {
+    if(child_item.getNodeKind() != store::StoreConsts::elementNode)
+      continue;
+    Item    child_name;
+    child_item.getNodeName(child_name);
+    String  item_namespace = child_name.getNamespace();
+    if(item_namespace != ns)
+    {
+      continue;//next child
+    }
+    String  item_name = child_name.getLocalName();
+    if(item_name != localname)
+    {
+      continue;//next child
+    }
+    return true;
+  }
+  return false;
+}
+
+bool GeoFunction::getAttribute(  zorba::Item &item,
+                                 const char *name,
+                                 const char *ns,
+                                 zorba::Item &attr_item) const
+{
+  Iterator_t    children;
+  children = item.getAttributes();
+  children->open();
+  while(children->next(attr_item))
+  {
+    zorba::Item   attr_qname;
+    attr_item.getNodeName(attr_qname);
+    String  attr_name = attr_qname.getLocalName();
+    if(attr_name != name)
+    {
+      continue;//next attr
+    }
+    if(!ns)
+    {
+      children->close();
+      return true;
+   }
+    String  attr_ns= attr_qname.getNamespace();
+    if(attr_ns == ns)
+    {
+      children->close();
+      return true;
+    }
+  }
+  children->close();
+  return false;
+}
+
+bool GeoFunction::checkOptionalAttribute(zorba::Item &item,
+                                         const char *name,
+                                         const char *ns,
+                                         const char *value) const
+{
+  zorba::Item attr_item;
+  if(!getAttribute(  item,
+                     name,
+                     ns,
+                     attr_item))
+     return true;
+  String  attr_value = attr_item.getStringValue();
+  return attr_value == value;
+}
+
+int GeoFunction::get_srsDimension(zorba::Item &item, int prev_srsdimension) const
+{
+  zorba::Item attr_item;
+  if(getAttribute(item,
+                   "srsDimension",
+                   NULL,
+                   attr_item))
+  {
+    String  attr_value = attr_item.getStringValue();
+    zfn::trim( attr_value );
+    int srs_dim = atoi(attr_value.c_str());
+    if((srs_dim != 2) && (srs_dim != 3))
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Geo module's supported values for srsDimension in GML are 2 and 3.";
+      throwError("UnsupportedSRSDimensionValue", lErrorMessage.str());
+    }
+    return srs_dim;
+  }
+  return prev_srsdimension;
+}
+
+const geos::geom::GeometryFactory   *GeoFunction::get_geometryFactory() const
+{
+//  if(!geo_factory)
+//    geo_factory = new geos::geom::GeometryFactory;
+//  return geo_factory;
+  return geos::geom::GeometryFactory::getDefaultInstance();
+}
+
+void GeoFunction::readPointPosCoordinates(zorba::Item &lItem,
+                                          double *x,
+                                          double *y,
+                                          double *z,
+                                          int &srs_dim) const
+{
+  Iterator_t    children;
+  children = lItem.getChildren();
+  children->open();
+  bool retval = readPointPosCoordinates(children, x, y, z, srs_dim);
+  children->close();
+  if(!retval)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "gml node must have a gml:pos child";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+}
+
+bool GeoFunction::readPointPosCoordinates(zorba::Iterator_t children,
+                                          double *x,
+                                          double *y,
+                                          double *z,
+                                          int &srs_dim) const
+{
+  zorba::Item   pos_item;
+  if(!getChild(children, "pos", "http://www.opengis.net/gml";, pos_item))
+  {//get upset
+    //std::stringstream lErrorMessage;
+    //lErrorMessage << "gml:Point node must have a gml:pos child";
+    //throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    return false;
+  }
+  srs_dim = get_srsDimension(pos_item, srs_dim);
+
+  String    pos_string;
+  pos_string = pos_item.getStringValue();
+  *x = 0;
+  *y = 0;
+  *z = 0;
+  const char *str = pos_string.c_str();
+  while(((*str == ' ') ||
+        (*str == '\t') ||
+        (*str == '\n') ||
+        (*str == '\r')) &&
+        (*str != 0))
+     str++;
+  sscanf(str, "%lf", x);
+  while((*str != ' ') &&
+        (*str != '\t') &&
+        (*str != '\n') &&
+        (*str != '\r') &&
+        (*str != 0))
+     str++;
+  while(((*str == ' ') ||
+      (*str == '\t') ||
+      (*str == '\n') ||
+      (*str == '\r')) &&
+      (*str != 0))
+     str++;
+  sscanf(str, "%lf", y);
+  if(srs_dim == 3)
+  {
+    while((*str != ' ') &&
+          (*str != '\t') &&
+          (*str != '\n') &&
+          (*str != '\r') &&
+          (*str != 0))
+       str++;
+    while(((*str == ' ') ||
+        (*str == '\t') ||
+        (*str == '\n') ||
+        (*str == '\r')) &&
+        (*str != 0))
+       str++;
+    sscanf(str, "%lf", z);
+  }
+  return true;
+}
+
+void GeoFunction::readPosListCoordinates(zorba::Item &lItem,
+                                         geos::geom::CoordinateSequence *&cl,
+                                         int &srs_dim) const
+{
+  zorba::Item   poslist_item;
+  if(srs_dim != 3)
+    srs_dim = 2;
+  if(getChild(lItem, "posList", "http://www.opengis.net/gml";, poslist_item))
+  {
+    srs_dim = get_srsDimension(poslist_item, srs_dim);
+    if(!cl)
+      cl = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, srs_dim);
+
+    String    poslist_string;
+    poslist_string = poslist_item.getStringValue();
+    double x, y, z;
+    int load_x = 0;
+    const char *str_poslist = poslist_string.c_str();
+    while(((*str_poslist == ' ') ||
+          (*str_poslist == '\t') ||
+          (*str_poslist == '\n') ||
+          (*str_poslist == '\r')) &&
+          (*str_poslist != 0))
+       str_poslist++;
+    x = 0; y = 0; z = 0;
+    while(str_poslist[0])
+    {
+      if(load_x == 0)
+        x = atof(str_poslist);
+      else if(load_x == 1)
+      {
+        y = atof(str_poslist);
+        if(srs_dim == 2)
+        {
+          cl->add(geos::geom::Coordinate(x, y));
+          x = 0; y = 0;
+        }
+      }
+      else if(load_x == 2)
+      {
+        z = atof(str_poslist);
+        cl->add(geos::geom::Coordinate(x, y, z));
+        x = 0; y = 0; z = 0;
+      }
+      load_x = (load_x + 1)%srs_dim;
+      while((*str_poslist != ' ') &&
+            (*str_poslist != '\t') &&
+            (*str_poslist != '\n') &&
+            (*str_poslist != '\r') &&
+            (*str_poslist != 0))
+         str_poslist++;
+      while(((*str_poslist == ' ') ||
+          (*str_poslist == '\t') ||
+          (*str_poslist == '\n') ||
+          (*str_poslist == '\r')) &&
+          (*str_poslist != 0))
+         str_poslist++;
+    }
+  }
+  else if(getChild(lItem, "pos", "http://www.opengis.net/gml";, poslist_item))
+  {
+    Iterator_t    children;
+    children = lItem.getChildren();
+    children->open();
+    double x = 0, y = 0, z = 0;
+    while(readPointPosCoordinates(children, &x, &y, &z, srs_dim))
+    {
+      if(!cl)
+        cl = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, srs_dim);
+
+      if(srs_dim == 3)
+      {
+        cl->add(geos::geom::Coordinate(x, y, z));
+      }
+      else
+      {
+        cl->add(geos::geom::Coordinate(x, y));
+      }
+      x = 0; y = 0; z = 0;
+    }
+    children->close();
+  }
+  else
+  {//get upset
+    std::stringstream lErrorMessage;
+    zorba::Item item_qname;
+    lItem.getNodeName(item_qname);
+    lErrorMessage << item_qname.getLocalName() << " node must have a gml:posList child";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+
+}
+
+int GeoFunction::getCoordinateDimension(const geos::geom::Geometry *geos_geometry) const
+{
+  if(!geos_geometry)
+    return 2;
+  switch(geos_geometry->getGeometryTypeId())
+  {
+  case 	geos::geom::GEOS_POINT:
+  {
+    const geos::geom::Coordinate  *c;
+    c = geos_geometry->getCoordinate();
+      if(!ISNAN(c->z))
+        return 3;
+      else
+        return 2;
+  }
+	/// a linestring
+  case geos::geom::GEOS_LINESTRING:
+	/// a linear ring (linestring with 1st point == last point)
+  case geos::geom::GEOS_LINEARRING:
+  {
+    std::auto_ptr<geos::geom::CoordinateSequence>  cs;
+    cs.reset(geos_geometry->getCoordinates());
+    size_t    cs_size = cs->getSize();
+    for(size_t i=0;i<cs_size;i++)
+    {
+      double z = cs->getAt(i).z;
+      if(!ISNAN(z))
+        return 3;
+    }
+    return 2;
+  }
+	/// a polygon
+  case geos::geom::GEOS_POLYGON:
+  {
+    const geos::geom::LineString*   exterior_ring;
+    const geos::geom::Polygon   *polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry);
+    exterior_ring = polygon->getExteriorRing();
+    int exterior_dim = getCoordinateDimension(exterior_ring);
+    if(exterior_dim == 3)
+      return 3;
+
+    size_t interior_rings = polygon->getNumInteriorRing();
+    for(size_t i=0;i<interior_rings;i++)
+    {
+      const geos::geom::LineString*   interior_ring;
+      interior_ring = polygon->getInteriorRingN(i);
+      int interior_dim = getCoordinateDimension(interior_ring);
+      if(interior_dim == 3)
+        return 3;
+    }
+    return 2;
+  }
+	/// a collection of points
+  case geos::geom::GEOS_MULTIPOINT:
+  {
+    size_t    nr_geoms = geos_geometry->getNumGeometries();
+    for(size_t i=0;i<nr_geoms;i++)
+    {
+      const geos::geom::Geometry  *point;
+      point = geos_geometry->getGeometryN(i);
+      if(getCoordinateDimension(point) == 3)
+        return 3;
+    }
+    return 2;
+  }
+	/// a collection of linestrings
+  case geos::geom::GEOS_MULTILINESTRING:
+  {
+    size_t    nr_geoms = geos_geometry->getNumGeometries();
+    for(size_t i=0;i<nr_geoms;i++)
+    {
+      const geos::geom::Geometry  *linestring;
+      linestring = geos_geometry->getGeometryN(i);
+      if(getCoordinateDimension(linestring) == 3)
+        return 3;
+    }
+    return 2;
+  }
+	/// a collection of polygons
+  case geos::geom::GEOS_MULTIPOLYGON:
+  {
+    size_t    nr_geoms = geos_geometry->getNumGeometries();
+    for(size_t i=0;i<nr_geoms;i++)
+    {
+      const geos::geom::Geometry  *polygon;
+      polygon = geos_geometry->getGeometryN(i);
+      if(getCoordinateDimension(polygon) == 3)
+        return 3;
+    }
+    return 2;
+  }
+	/// a collection of heterogeneus geometries
+  case geos::geom::GEOS_GEOMETRYCOLLECTION:
+  {
+    //can be either gml:Surface or gml:Curve
+    size_t    nr_geoms = geos_geometry->getNumGeometries();
+    if(!nr_geoms)
+      return 2;//unreachable
+    for(size_t i=0;i<nr_geoms;i++)
+    {
+      const geos::geom::Geometry *child;
+      child = geos_geometry->getGeometryN(i);
+      if(getCoordinateDimension(child) == 3)
+        return 3;
+    }
+    return 2;
+  }
+  default:
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Geometry type " << geos_geometry->getGeometryType() << " is not supported";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  }
+
+  return 2;
+}
+
+void GeoFunction::getSrsName(zorba::Item lItem, zorba::Item &srs_uri) const
+{
+  zorba::Item attr_item;
+  if(getAttribute(lItem,
+                   "srsName",
+                   NULL,
+                   attr_item))
+  {
+    String attr_value = attr_item.getStringValue();
+    srs_uri = theModule->getItemFactory()->createAnyURI(attr_value);
+    return;
+  }
+
+  zorba::Item parent_item = lItem.getParent();
+  if(parent_item.isNull())
+    return;
+  zorba::Item bounded_item;
+  zorba::Item envelope_item;
+  if(getChild(parent_item, "boundedBy", "http://www.opengis.net/gml";, bounded_item) &&
+     getChild(bounded_item, "Envelope", "http://www.opengis.net/gml";, envelope_item))
+  {
+    getSrsName(envelope_item, srs_uri);
+    if(!srs_uri.isNull())
+      return;
+  }
+  getSrsName(parent_item, srs_uri);
+  if(!srs_uri.isNull())
+    return;
+}
+
+geos::geom::Geometry  *GeoFunction::buildGeosGeometryFromItem(zorba::Item &lItem,
+                                                              enum GeoFunction::gmlsf_types geometric_type,
+                                                              int srs_dim,
+                                                              zorba::Item *srs_uri,
+                                                              enum GeoFunction::action_item what_action,
+                                                              uint32_t *optional_child_index_or_count,
+                                                              zorba::Item *result_item) const
+{
+  srs_dim = get_srsDimension(lItem, srs_dim);
+  if(srs_uri)
+    getSrsName(lItem, *srs_uri);
+  geos::geom::Geometry *result;
+
+  switch(geometric_type)
+  {
+  case GMLSF_POINT:
+  {
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      double x, y, z;
+      readPointPosCoordinates(lItem, &x, &y, &z, srs_dim);
+	    geos::geom::Coordinate c(x, y);
+      if(srs_dim == 3)
+        c.z = z;
+      try{
+      result = get_geometryFactory()->createPoint(c);
+      result->setUserData((void*)GMLSF_POINT);
+      return result;
+      }catch(std::exception &excep)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createPoint : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+    else if(what_action == COUNT_CHILDREN)
+      (*optional_child_index_or_count) = 1;
+    else if(what_action == GET_NTH_CHILD)
+    {
+      if((*optional_child_index_or_count) == 0)
+        *result_item = lItem;
+    }
+    else
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in GMLSF_POINT";
+      throwError("InternalError", lErrorMessage.str());
+    }
+  }break;
+  case GMLSF_LINESTRING:
+  {
+    geos::geom::CoordinateSequence *cl = NULL;//new geos::geom::CoordinateArraySequence();
+    readPosListCoordinates(lItem, cl, srs_dim);
+    uint32_t  last_index = (uint32_t)cl->size()-1;
+    if(what_action == GET_END_POINT)
+    {
+      optional_child_index_or_count = &last_index;
+      what_action = GET_NTH_POINT;
+    }
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+      result = get_geometryFactory()->createLineString(cl);
+      result->setUserData((void*)GMLSF_LINESTRING);
+      return result;
+      }catch(std::exception &excep)
+      {
+        //delete cl;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createLineString : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+    else if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
+    {
+      (*optional_child_index_or_count) = (uint32_t)cl->size();
+      delete cl;
+    }
+    else if((what_action == GET_NTH_CHILD) || (what_action == GET_NTH_POINT))
+    {
+      if((*optional_child_index_or_count) < cl->size())
+      {
+        Item  item_name;
+        Item  item_type;
+        zorba::Item   null_parent;
+        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Point");
+        NsBindings ns_binding;
+        ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
+        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+        *result_item = theModule->getItemFactory()->createElementNode(null_parent, item_name, item_type, false, false, ns_binding);
+
+
+        zorba::Item pos_item;
+        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "pos");
+        addNewLineIndentText(*result_item, 2);
+        pos_item = theModule->getItemFactory()->createElementNode(*result_item, item_name, item_type, false, false, ns_binding);
+
+        if(srs_dim == 3)
+        {
+          zorba::Item attr_value_item;
+          item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+          item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
+          char  strdim[10];
+          sprintf(strdim, "%d", srs_dim);
+          zorba::String   strvalue(strdim);
+          attr_value_item = theModule->getItemFactory()->createString(strvalue);
+          theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
+        }
+        char strtemp[100];
+        if(srs_dim == 3)
+        {
+          if(!ISNAN(cl->getAt((*optional_child_index_or_count)).z))
+            sprintf(strtemp, "%lf %lf %lf", cl->getAt((*optional_child_index_or_count)).x,
+                                          cl->getAt((*optional_child_index_or_count)).y,
+                                          cl->getAt((*optional_child_index_or_count)).z);
+          else
+            sprintf(strtemp, "%lf %lf 0", cl->getAt((*optional_child_index_or_count)).x,
+                                          cl->getAt((*optional_child_index_or_count)).y);
+        }
+        else
+        {
+          sprintf(strtemp, "%lf %lf", cl->getAt((*optional_child_index_or_count)).x,
+                                      cl->getAt((*optional_child_index_or_count)).y);
+        }
+
+        zorba::Item text_item;
+        text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
+        addNewLineIndentText(*result_item, 0);
+      }
+      delete cl;
+    }
+    else
+    {
+      delete cl;
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in GMLSF_LINESTRING";
+      throwError("InternalError", lErrorMessage.str());
+    }
+  }break;
+  case GMLSF_CURVE:
+  {  //not supported in GEOS; emulate through MultiLineString
+    zorba::Item   segments_item;
+    if(!getChild(lItem, "segments", "http://www.opengis.net/gml";, segments_item))
+    {//get upset
+      std::stringstream lErrorMessage;
+      lErrorMessage << "gml:Curve node must have a gml:segments child";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
+    {
+      (*optional_child_index_or_count) = 0;
+    }
+    unsigned int   child_nr = 0;
+    Iterator_t    segments_children;
+    Item          line_segment_item;
+    std::vector<geos::geom::Geometry*>    *segments_vector = NULL;
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      segments_vector = new std::vector<geos::geom::Geometry*>;
+    }
+    segments_children = segments_item.getChildren();
+    segments_children->open();
+    while(segments_children->next(line_segment_item))
+    {
+      if(line_segment_item.getNodeKind() != store::StoreConsts::elementNode)
+        continue;
+      Item    item_qname;
+      line_segment_item.getNodeName(item_qname);
+      String  item_namespace = item_qname.getNamespace();
+      if(item_namespace != "http://www.opengis.net/gml";)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:Curve/gml:segments must be of type gml:LineStringSegment only";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      String  local_name = item_qname.getLocalName();
+      if(local_name != "LineStringSegment")
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:Curve/gml:segments must be of type gml:LineStringSegment only";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      if(!checkOptionalAttribute(line_segment_item, "interpolation", "http://www.opengis.net/gml";, "linear"))
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "gml:Curve/gml:segments/gml:LineStringSegment supports only linear interpolation";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+  	
+      if(what_action == BUILD_GEOS_GEOMETRY)
+      {
+        segments_vector->push_back(buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim));
+      }
+      else if(what_action == COUNT_CHILDREN)
+      {
+        (*optional_child_index_or_count)++;
+      }
+      else if(what_action == GET_NUM_POINTS)
+      {
+        uint32_t    nr_points;
+        buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
+        (*optional_child_index_or_count) += nr_points;
+      }
+      else if(what_action == GET_NTH_CHILD)
+      {
+        if((*optional_child_index_or_count) == child_nr)
+        {
+          *result_item = line_segment_item;
+          return NULL;
+        }
+      }
+      else if(what_action == GET_NTH_POINT)
+      {
+        buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NTH_POINT, optional_child_index_or_count, result_item);
+        if(!result_item->isNull())
+          return NULL;
+        uint32_t    nr_points;
+        buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
+        (*optional_child_index_or_count) -= nr_points;
+      }
+      else
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GMLSF_CURVE";
+        throwError("InternalError", lErrorMessage.str());
+      }
+      child_nr++;
+   }
+
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+        result = get_geometryFactory()->createMultiLineString(segments_vector);
+        result->setUserData((void*)GMLSF_CURVE);
+        return result;
+      }catch(std::exception &excep)
+      {
+        std::vector<geos::geom::Geometry*>::iterator  vec_it;
+        for(vec_it = segments_vector->begin(); vec_it != segments_vector->end(); vec_it++)
+        {
+          delete (*vec_it);
+        }
+        delete segments_vector;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createGeometryCollection for gml:Curve: " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+  }break;
+  case GMLSF_LINEARRING:
+  {
+    geos::geom::CoordinateSequence *cl = NULL;//new geos::geom::CoordinateArraySequence();
+    readPosListCoordinates(lItem, cl, srs_dim);
+    uint32_t  last_index = (uint32_t)cl->size()-1;
+    if(what_action == GET_END_POINT)
+    {
+      optional_child_index_or_count = &last_index;
+      what_action = GET_NTH_POINT;
+    }
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+      result = get_geometryFactory()->createLinearRing(cl);
+      result->setUserData((void*)GMLSF_LINEARRING);
+      return result;
+      }catch(std::exception &excep)
+      {
+        //delete cl;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createLinearRing : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+    else if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
+    {
+      (*optional_child_index_or_count) = (uint32_t)cl->size();
+      delete cl;
+    }
+    else if((what_action == GET_NTH_CHILD) || (what_action == GET_NTH_POINT))
+    {
+      if((*optional_child_index_or_count) < cl->size())
+      {
+        Item  item_name;
+        Item  item_type;
+        zorba::Item   null_parent;
+        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Point");
+        NsBindings ns_binding;
+        ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
+        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+        *result_item = theModule->getItemFactory()->createElementNode(null_parent, item_name, item_type, false, false, ns_binding);
+
+        zorba::Item pos_item;
+        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "pos");
+        addNewLineIndentText(*result_item, 2);
+        pos_item = theModule->getItemFactory()->createElementNode(*result_item, item_name, item_type, false, false, ns_binding);
+
+        if(srs_dim == 3)
+        {
+          zorba::Item attr_value_item;
+          item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+          item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
+          char  strdim[10];
+          sprintf(strdim, "%d", srs_dim);
+          zorba::String   strvalue(strdim);
+          attr_value_item = theModule->getItemFactory()->createString(strvalue);
+          theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
+        }
+        char strtemp[100];
+        if(srs_dim == 3)
+        {
+          if(!ISNAN(cl->getAt((*optional_child_index_or_count)).z))
+            sprintf(strtemp, "%lf %lf %lf", cl->getAt((*optional_child_index_or_count)).x,
+                                          cl->getAt((*optional_child_index_or_count)).y,
+                                          cl->getAt((*optional_child_index_or_count)).z);
+          else
+            sprintf(strtemp, "%lf %lf 0", cl->getAt((*optional_child_index_or_count)).x,
+                                          cl->getAt((*optional_child_index_or_count)).y);
+        }
+        else
+        {
+          sprintf(strtemp, "%lf %lf", cl->getAt((*optional_child_index_or_count)).x,
+                                      cl->getAt((*optional_child_index_or_count)).y);
+        }
+
+        zorba::Item text_item;
+        text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
+        addNewLineIndentText(*result_item, 0);
+      }
+      delete cl;
+    }
+    else
+    {
+      delete cl;
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in GMLSF_LINEARRING";
+      throwError("InternalError", lErrorMessage.str());
+    }
+  }break;
+  case GMLSF_SURFACE:
+  {  //not supported in GEOS; emulate through MultiPolygon
+    zorba::Item   patches_item;
+    if(!getChild(lItem, "patches", "http://www.opengis.net/gml";, patches_item))
+    {//get upset
+      std::stringstream lErrorMessage;
+      lErrorMessage << "gml:Surface node must have a gml:patches child";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    if(what_action == COUNT_CHILDREN)
+    {
+      (*optional_child_index_or_count) = 0;
+    }
+    unsigned int   child_nr = 0;
+    Iterator_t    patches_children;
+    Item          polygon_patch_item;
+    std::vector<geos::geom::Geometry*>    *polygon_vector = NULL;
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      polygon_vector = new std::vector<geos::geom::Geometry*>;
+    }
+    patches_children = patches_item.getChildren();
+    patches_children->open();
+    while(patches_children->next(polygon_patch_item))
+    {
+      if(polygon_patch_item.getNodeKind() != store::StoreConsts::elementNode)
+        continue;
+      Item    item_qname;
+      polygon_patch_item.getNodeName(item_qname);
+      String  item_namespace = item_qname.getNamespace();
+      if(item_namespace != "http://www.opengis.net/gml";)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:Surface/gml:patches must be of type gml:PolygonPatch only";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      String  item_name = item_qname.getLocalName();
+      if(item_name != "PolygonPatch")
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:Surface/gml:patches must be of type gml:PolygonPatch only";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+
+      if(what_action == BUILD_GEOS_GEOMETRY)
+      {
+        polygon_vector->push_back(buildGeosGeometryFromItem(polygon_patch_item, GMLSF_POLYGON, srs_dim));
+      }
+      else if(what_action == COUNT_CHILDREN)
+      {
+        (*optional_child_index_or_count)++;
+      }
+      else if(what_action == GET_NTH_CHILD)
+      {
+        if((*optional_child_index_or_count) == child_nr)
+        {
+          *result_item = polygon_patch_item;
+          return NULL;
+        }
+      }
+      else
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GMLSF_CURVE";
+        throwError("InternalError", lErrorMessage.str());
+      }
+      child_nr++;
+    }
+
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+        result = get_geometryFactory()->createMultiPolygon(polygon_vector);
+        result->setUserData((void*)GMLSF_SURFACE);
+        return result;
+      }catch(std::exception &excep)
+      {
+        std::vector<geos::geom::Geometry*>::iterator  vec_it;
+        for(vec_it = polygon_vector->begin(); vec_it != polygon_vector->end(); vec_it++)
+        {
+          delete (*vec_it);
+        }
+        delete polygon_vector;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createGeometryCollection for gml:Surface : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+  }break;
+  case GMLSF_POLYGON:
+  {
+    Iterator_t    polygon_children;
+    Item          extint_item;
+    unsigned int           nr_child = 0;
+    geos::geom::LinearRing    *exterior = NULL;
+    std::vector<geos::geom::Geometry*>    *interior_vector = NULL;
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      interior_vector = new std::vector<geos::geom::Geometry*>;
+    }
+    else if(what_action == COUNT_CHILDREN)
+    {
+      (*optional_child_index_or_count) = 0;
+    }
+    polygon_children = lItem.getChildren();
+    polygon_children->open();
+    while(polygon_children->next(extint_item))
+    {
+      if(extint_item.getNodeKind() != store::StoreConsts::elementNode)
+        continue;
+      Item    item_qname;
+      extint_item.getNodeName(item_qname);
+      String  item_namespace = item_qname.getNamespace();
+      if(item_namespace != "http://www.opengis.net/gml";)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:Polygon must be gml:exterior or gml:interior";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      String  item_name = item_qname.getLocalName();
+      if(nr_child == 0)
+      {
+        if(item_name != "exterior")
+        {
+          std::stringstream lErrorMessage;
+          lErrorMessage << "First child of gml:Polygon must be gml:exterior";
+          throwError("UnrecognizedGeoObject", lErrorMessage.str());
+        }
+        zorba::Item   linearring_item;
+        if(!getChild(extint_item, "LinearRing", "http://www.opengis.net/gml";, linearring_item))
+        {//get upset
+          std::stringstream lErrorMessage;
+          lErrorMessage << "gml:Polygon/gml:exterior node must have a gml:LinearRing child";
+          throwError("UnrecognizedGeoObject", lErrorMessage.str());
+        }
+        if(what_action == BUILD_GEOS_GEOMETRY)
+        {
+          exterior = dynamic_cast<geos::geom::LinearRing*>(buildGeosGeometryFromItem(linearring_item, GMLSF_LINEARRING, srs_dim));
+        }
+        else if(what_action == GET_EXTERIOR_RING)
+        {
+          *result_item = linearring_item;
+          return NULL;
+        }
+      }
+      else
+      {
+        if(item_name != "interior")
+        {
+          std::stringstream lErrorMessage;
+          lErrorMessage << "Non-first child of gml:Polygon must be gml:interior";
+          throwError("UnrecognizedGeoObject", lErrorMessage.str());
+        }
+        zorba::Item   linearring_item;
+        if(!getChild(extint_item, "LinearRing", "http://www.opengis.net/gml";, linearring_item))
+        {//get upset
+          std::stringstream lErrorMessage;
+          lErrorMessage << "gml:Polygon/gml:interior node must have a gml:LinearRing child";
+          throwError("UnrecognizedGeoObject", lErrorMessage.str());
+        }
+        if(what_action == BUILD_GEOS_GEOMETRY)
+        {
+          interior_vector->push_back(buildGeosGeometryFromItem(linearring_item, GMLSF_LINEARRING, srs_dim));
+        }
+        else if(what_action == COUNT_CHILDREN)
+        {
+          (*optional_child_index_or_count)++;
+        }
+        else if(what_action == GET_NTH_CHILD)
+        {
+          if((*optional_child_index_or_count) == (nr_child-1))
+          {
+            *result_item = linearring_item;
+            return NULL;
+          }
+        }
+        else
+        {
+          std::stringstream lErrorMessage;
+          lErrorMessage << "Error in GMLSF_POLYGON";
+          throwError("InternalError", lErrorMessage.str());
+        }
+      }
+      nr_child++;
+    }
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+      result = get_geometryFactory()->createPolygon(exterior, interior_vector);
+      result->setUserData((void*)GMLSF_POLYGON);
+      return result;
+      }catch(std::exception &excep)
+      {
+        delete exterior;
+        std::vector<geos::geom::Geometry*>::iterator  vec_it;
+        for(vec_it = interior_vector->begin(); vec_it != interior_vector->end(); vec_it++)
+        {
+          delete (*vec_it);
+        }
+        delete interior_vector;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createPolygon : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+  }break;
+  case GMLSF_MULTIPOINT:
+  {
+    Iterator_t    multipoint_children;
+    Item          point_item;
+    std::vector<geos::geom::Geometry*>    *point_vector = NULL;
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      point_vector = new std::vector<geos::geom::Geometry*>;
+    }
+    else if(what_action == COUNT_CHILDREN)
+    {
+      (*optional_child_index_or_count) = 0;
+    }
+    unsigned int nr_child = 0;
+    multipoint_children = lItem.getChildren();
+    multipoint_children->open();
+    while(multipoint_children->next(point_item))
+    {
+      if(point_item.getNodeKind() != store::StoreConsts::elementNode)
+        continue;
+      Item    item_qname;
+      point_item.getNodeName(item_qname);
+      String  item_namespace = item_qname.getNamespace();
+      if(item_namespace != "http://www.opengis.net/gml";)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:MultiPoint must be gml:Point";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      String  item_name = item_qname.getLocalName();
+      if(item_name != "Point")
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "First child of gml:MultiPoint must be gml:Point";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      if(what_action == BUILD_GEOS_GEOMETRY)
+      {
+        point_vector->push_back(buildGeosGeometryFromItem(point_item, GMLSF_POINT, srs_dim));
+      }
+      else if(what_action == COUNT_CHILDREN)
+      {
+        (*optional_child_index_or_count)++;
+      }
+      else if(what_action == GET_NTH_CHILD)
+      {
+        if((*optional_child_index_or_count) == nr_child)
+        {
+          *result_item = point_item;
+          return NULL;
+        }
+      }
+      else
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GMLSF_MULTIPOINT";
+        throwError("InternalError", lErrorMessage.str());
+      }
+      nr_child++;
+    }
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+      result = get_geometryFactory()->createMultiPoint(point_vector);
+      result->setUserData((void*)GMLSF_MULTIPOINT);
+      return result;
+      }catch(std::exception &excep)
+      {
+        std::vector<geos::geom::Geometry*>::iterator  vec_it;
+        for(vec_it = point_vector->begin(); vec_it != point_vector->end(); vec_it++)
+        {
+          delete (*vec_it);
+        }
+        delete point_vector;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createMultiPoint : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+  }break;
+  case GMLSF_MULTICURVE:
+  {
+    Iterator_t    multicurve_children;
+    Item          curve_item;
+    std::vector<geos::geom::Geometry*>    *curve_vector = NULL;
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      curve_vector = new std::vector<geos::geom::Geometry*>;
+    }
+    else if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
+    {
+      (*optional_child_index_or_count) = 0;
+    }
+    unsigned int nr_child = 0;
+    multicurve_children = lItem.getChildren();
+    multicurve_children->open();
+    while(multicurve_children->next(curve_item))
+    {
+      if(curve_item.getNodeKind() != store::StoreConsts::elementNode)
+        continue;
+      Item    item_qname;
+      curve_item.getNodeName(item_qname);
+      String  item_namespace = item_qname.getNamespace();
+      if(item_namespace != "http://www.opengis.net/gml";)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:MultiCurve must be gml:LineString";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      String  item_name = item_qname.getLocalName();
+      if(item_name != "LineString")
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:MultiCurve must be gml:LineString";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      if(what_action == BUILD_GEOS_GEOMETRY)
+      {
+        curve_vector->push_back(buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim));
+      }
+      else if(what_action == COUNT_CHILDREN)
+      {
+        (*optional_child_index_or_count)++;
+      }
+      else if(what_action == GET_NUM_POINTS)
+      {
+        uint32_t  nr_points;
+        buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
+        (*optional_child_index_or_count) += nr_points;
+      }
+      else if(what_action == GET_NTH_CHILD)
+      {
+        if((*optional_child_index_or_count) == nr_child)
+        {
+          *result_item = curve_item;
+          return NULL;
+        }
+      }
+      else if(what_action == GET_NTH_POINT)
+      {
+        buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NTH_POINT, optional_child_index_or_count, result_item);
+        if(!result_item->isNull())
+          return NULL;
+        uint32_t  nr_points;
+        buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
+        (*optional_child_index_or_count) -= nr_points;
+      }
+      else
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GMLSF_MULTICURVE";
+        throwError("InternalError", lErrorMessage.str());
+      }
+      nr_child++;
+    }
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+      result = get_geometryFactory()->createMultiLineString(curve_vector);
+      result->setUserData((void*)GMLSF_MULTICURVE);
+      return result;
+      }catch(std::exception &excep)
+      {
+        std::vector<geos::geom::Geometry*>::iterator  vec_it;
+        for(vec_it = curve_vector->begin(); vec_it != curve_vector->end(); vec_it++)
+        {
+          delete (*vec_it);
+        }
+        delete curve_vector;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createMultiLineString : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+  }break;
+  case GMLSF_MULTISURFACE:
+  {
+    Iterator_t    multisurface_children;
+    Item          surface_item;
+    std::vector<geos::geom::Geometry*>    *surface_vector = NULL;
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      surface_vector = new std::vector<geos::geom::Geometry*>;
+    }
+    else if(what_action == COUNT_CHILDREN)
+    {
+      (*optional_child_index_or_count) = 0;
+    }
+    unsigned int nr_child = 0;
+    multisurface_children = lItem.getChildren();
+    multisurface_children->open();
+    while(multisurface_children->next(surface_item))
+    {
+      if(surface_item.getNodeKind() != store::StoreConsts::elementNode)
+        continue;
+      Item    item_qname;
+      surface_item.getNodeName(item_qname);
+      String  item_namespace = item_qname.getNamespace();
+      if(item_namespace != "http://www.opengis.net/gml";)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:MultiSurface must be gml:Polygon";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      String  item_name = item_qname.getLocalName();
+      if(item_name != "Polygon")
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:MultiSurface must be gml:Polygon";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      if(what_action == BUILD_GEOS_GEOMETRY)
+      {
+        surface_vector->push_back(buildGeosGeometryFromItem(surface_item, GMLSF_POLYGON, srs_dim));
+      }
+      else if(what_action == COUNT_CHILDREN)
+      {
+        (*optional_child_index_or_count)++;
+      }
+      else if(what_action == GET_NTH_CHILD)
+      {
+        if((*optional_child_index_or_count) == nr_child)
+        {
+          *result_item = surface_item;
+          return NULL;
+        }
+      }
+      else
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GMLSF_MULTICURVE";
+        throwError("InternalError", lErrorMessage.str());
+      }
+      nr_child++;
+    }
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+      result = get_geometryFactory()->createMultiPolygon(surface_vector);
+      result->setUserData((void*)GMLSF_MULTISURFACE);
+      return result;
+      }catch(std::exception &excep)
+      {
+        std::vector<geos::geom::Geometry*>::iterator  vec_it;
+        for(vec_it = surface_vector->begin(); vec_it != surface_vector->end(); vec_it++)
+        {
+          delete (*vec_it);
+        }
+        delete surface_vector;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createMultiPolygon : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+  }break;
+  case GMLSF_MULTIGEOMETRY:
+  {
+    Iterator_t    multigeometry_children;
+    Item          geometry_item;
+    std::vector<geos::geom::Geometry*>    *geometry_vector = NULL;
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      geometry_vector = new std::vector<geos::geom::Geometry*>;
+    }
+    else if(what_action == COUNT_CHILDREN)
+    {
+      (*optional_child_index_or_count) = 0;
+    }
+    unsigned int nr_child = 0;
+    multigeometry_children = lItem.getChildren();
+    multigeometry_children->open();
+    while(multigeometry_children->next(geometry_item))
+    {
+      if(geometry_item.getNodeKind() != store::StoreConsts::elementNode)
+        continue;
+      Item    item_qname;
+      geometry_item.getNodeName(item_qname);
+      String  item_namespace = item_qname.getNamespace();
+      if(item_namespace != "http://www.opengis.net/gml";)
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:MultiGeometry must be gml:geometryMember or gml:geometryMembers";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+      String  item_name = item_qname.getLocalName();
+      if(item_name == "geometryMember" || item_name == "geometryMembers")
+      {
+        Iterator_t    member_children;
+        Item          member_item;
+        member_children = geometry_item.getChildren();
+        member_children->open();
+        while(member_children->next(member_item))
+        {
+          if(what_action == BUILD_GEOS_GEOMETRY)
+          {
+            geometry_vector->push_back(buildGeosGeometryFromItem(member_item, getGmlSFGeometricType(member_item), srs_dim));
+          }
+          else if(what_action == COUNT_CHILDREN)
+          {
+            (*optional_child_index_or_count)++;
+          }
+          else if(what_action == GET_NTH_CHILD)
+          {
+            if((*optional_child_index_or_count) == nr_child)
+            {
+              *result_item = member_item;
+              return NULL;
+            }
+          }
+          else
+          {
+            std::stringstream lErrorMessage;
+            lErrorMessage << "Error in GMLSF_MULTIGEOMETRY";
+            throwError("InternalError", lErrorMessage.str());
+          }
+          nr_child++;
+        }
+      }
+      else
+      {
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Children of gml:MultiGeometry must be gml:geometryMember or gml:geometryMembers";
+        throwError("UnrecognizedGeoObject", lErrorMessage.str());
+      }
+    }
+    if(what_action == BUILD_GEOS_GEOMETRY)
+    {
+      try{
+        result = get_geometryFactory()->createGeometryCollection(geometry_vector);
+        result->setUserData((void*)GMLSF_MULTIGEOMETRY);
+        return result;
+      }catch(std::exception &excep)
+      {
+        std::vector<geos::geom::Geometry*>::iterator  vec_it;
+        for(vec_it = geometry_vector->begin(); vec_it != geometry_vector->end(); vec_it++)
+        {
+          delete (*vec_it);
+        }
+        delete geometry_vector;
+        std::stringstream lErrorMessage;
+        lErrorMessage << "Error in GEOS function createGeometryCollection : " << excep.what();
+        throwError("GEOSError", lErrorMessage.str());
+      }
+    }
+  }break;
+  case GMLSF_INVALID:
+  default:
+  {
+    std::stringstream lErrorMessage;
+    zorba::Item item_qname;
+    lItem.getNodeName(item_qname);
+    lErrorMessage << "Unrecognized geometric type for element "
+         << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  break;
+  }
+
+  return NULL;
+}
+
+void GeoFunction::addNewLineIndentText(zorba::Item &parent, unsigned int indent) const
+{
+/*  zorba::Item text_item;
+  if(indent > 100)
+    indent = 100;
+  char *strtemp;
+  strtemp = new char[indent+10];
+  strtemp[0] = '\n';
+  memset(strtemp+1, ' ', indent);
+  strtemp[1+indent] = 0;
+  text_item = theModule->getItemFactory()->createTextNode(parent, strtemp);
+  delete[] strtemp;
+*/
+}
+
+void GeoFunction::appendIndent(char *&strtemp2, unsigned int indent) const
+{
+  strtemp2[0] = '\n';
+  memset(strtemp2+1, ' ', indent);
+  strtemp2 += indent+1;
+  strtemp2[0] = 0;
+}
+
+zorba::Item GeoFunction::getGMLItemFromGeosGeometry(zorba::Item &parent,
+                                                    const geos::geom::Geometry *geos_geometry,
+                                                    const zorba::Item *srs_uri,
+                                                    unsigned int indent,
+                                                    const char *tag_name,
+                                                    bool dont_check_for_curve_surface
+                                                    ) const
+{
+  zorba::Item   result_item;
+  zorba::Item   item_name;
+  zorba::Item   item_type;
+  NsBindings ns_binding;
+  ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
+  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+
+  if(!parent.isNull())
+    addNewLineIndentText(parent, indent);
+
+  switch(geos_geometry->getGeometryTypeId())
+  {
+  case 	geos::geom::GEOS_POINT:
+  {
+    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Point");
+    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+
+    zorba::Item pos_item;
+    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "pos");
+    addNewLineIndentText(result_item, indent+2);
+    pos_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
+
+    char strtemp[100];
+    const geos::geom::Coordinate  *c;
+    c = geos_geometry->getCoordinate();
+#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
+    if(geos_geometry->getCoordinateDimension() == 3)
+#else
+    if(getCoordinateDimension(geos_geometry) == 3)
+#endif
+    {
+      zorba::Item attr_value_item;
+      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
+      zorba::String   strvalue("3");
+      attr_value_item = theModule->getItemFactory()->createString(strvalue);
+      theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
+      if(!ISNAN(c->z))
+        sprintf(strtemp, "%lf %lf %lf", c->x, c->y, c->z);
+      else
+        sprintf(strtemp, "%lf %lf 0", c->x, c->y);
+    }
+    else
+      sprintf(strtemp, "%lf %lf", c->x, c->y);
+
+    zorba::Item text_item;
+    text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
+    addNewLineIndentText(result_item, indent);
+    break;
+  }
+	/// a linestring
+  case geos::geom::GEOS_LINESTRING:
+	/// a linear ring (linestring with 1st point == last point)
+  case geos::geom::GEOS_LINEARRING:
+  {
+    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml",
+      tag_name ? tag_name : ((geos_geometry->getGeometryTypeId() == geos::geom::GEOS_LINESTRING) ? "LineString" : "LinearRing"));
+    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+
+    zorba::Item pos_item;
+    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "posList");
+    addNewLineIndentText(result_item, indent+2);
+    pos_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
+
+#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
+    int coord_dim = geos_geometry->getCoordinateDimension();
+#else
+    int coord_dim = getCoordinateDimension(geos_geometry);
+#endif
+    if(coord_dim == 3)
+    {
+      zorba::Item attr_value_item;
+      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
+      zorba::String   strvalue("3");
+      attr_value_item = theModule->getItemFactory()->createString(strvalue);
+      theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
+    }
+    char *strtemp;
+    std::auto_ptr<geos::geom::CoordinateSequence>  cs;
+    cs.reset(geos_geometry->getCoordinates());
+    size_t    cs_size = cs->getSize();
+    strtemp = (char*)malloc((50+indent)*(cs_size+1) + 1);
+    strtemp[0] = 0;
+    char  *strtemp2 = strtemp;
+    for(size_t i=0;i<cs_size;i++)
+    {
+      appendIndent(strtemp2, indent+4);
+      if(coord_dim == 3)
+      {
+        if(!ISNAN(cs->getAt(i).z))
+          sprintf(strtemp2, "%lf %lf %lf", cs->getAt(i).x, cs->getAt(i).y, cs->getAt(i).z);
+        else
+          sprintf(strtemp2, "%lf %lf 0", cs->getAt(i).x, cs->getAt(i).y);
+      }
+      else
+        sprintf(strtemp2, "%lf %lf", cs->getAt(i).x, cs->getAt(i).y);
+      strtemp2 += strlen(strtemp2);
+    }
+
+    if(cs_size)
+    {
+      appendIndent(strtemp2, indent+2);
+      zorba::Item text_item;
+      text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
+      addNewLineIndentText(result_item, indent);
+    }
+    free(strtemp);
+    break;
+  }
+	/// a polygon
+  case geos::geom::GEOS_POLYGON:
+  {
+    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", tag_name ? tag_name : "Polygon");
+    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+
+    const geos::geom::LineString*   exterior_ring;
+    const geos::geom::Polygon   *polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry);
+    exterior_ring = polygon->getExteriorRing();
+    if(exterior_ring)
+    {
+      zorba::Item exterior_item;
+      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "exterior");
+      addNewLineIndentText(result_item, indent+2);
+      exterior_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
+      getGMLItemFromGeosGeometry(exterior_item, exterior_ring, NULL, indent+4);
+      addNewLineIndentText(exterior_item, indent+2);
+    }
+    size_t interior_rings = polygon->getNumInteriorRing();
+    for(size_t i=0;i<interior_rings;i++)
+    {
+      const geos::geom::LineString*   interior_ring;
+      interior_ring = polygon->getInteriorRingN(i);
+
+      zorba::Item interior_item;
+      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "interior");
+      addNewLineIndentText(result_item, indent+2);
+      interior_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
+      getGMLItemFromGeosGeometry(interior_item, interior_ring, NULL, indent+4);
+      addNewLineIndentText(interior_item, indent+2);
+    }
+    if(exterior_ring || interior_rings)
+      addNewLineIndentText(result_item, indent);
+    break;
+  }
+	/// a collection of points
+  case geos::geom::GEOS_MULTIPOINT:
+  {
+    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiPoint");
+    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+
+    size_t    nr_geoms = geos_geometry->getNumGeometries();
+    for(size_t i=0;i<nr_geoms;i++)
+    {
+      const geos::geom::Geometry  *point;
+      point = geos_geometry->getGeometryN(i);
+      getGMLItemFromGeosGeometry(result_item, point, NULL, indent+2);
+    }
+    if(nr_geoms)
+      addNewLineIndentText(result_item, indent);
+    break;
+  }
+	/// a collection of linestrings
+  case geos::geom::GEOS_MULTILINESTRING:
+  {
+    const geos::geom::MultiLineString *multiline = dynamic_cast<const geos::geom::MultiLineString*>(geos_geometry);
+    if(!dont_check_for_curve_surface && isCurve(multiline))
+    {
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Curve");
+      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+      zorba::Item segments_item;
+      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "segments");
+      addNewLineIndentText(result_item, indent+2);
+      segments_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
+
+      size_t    nr_geoms = multiline->getNumGeometries();
+      for(size_t i=0;i<nr_geoms;i++)
+      {
+        const geos::geom::Geometry  *linestring;
+        linestring = multiline->getGeometryN(i);
+
+        zorba::Item   linestring_item;
+        linestring_item = getGMLItemFromGeosGeometry(segments_item, linestring, NULL, indent+4, "LineStringSegment");
+
+        zorba::Item attr_value_item;
+        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "interpolation");
+        zorba::String   strvalue("liniar");
+        attr_value_item = theModule->getItemFactory()->createString(strvalue);
+        theModule->getItemFactory()->createAttributeNode(linestring_item, item_name, item_type, attr_value_item);
+      }
+      if(nr_geoms)
+        addNewLineIndentText(segments_item, indent+2);
+      addNewLineIndentText(result_item, indent);
+    }
+    else
+    {
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiCurve");
+      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+
+      size_t    nr_geoms = geos_geometry->getNumGeometries();
+      for(size_t i=0;i<nr_geoms;i++)
+      {
+        const geos::geom::Geometry  *linestring;
+        linestring = geos_geometry->getGeometryN(i);
+        getGMLItemFromGeosGeometry(result_item, linestring, NULL, indent+2);
+      }
+      if(nr_geoms)
+        addNewLineIndentText(result_item, indent);
+    }
+    break;
+  }
+	/// a collection of polygons
+  case geos::geom::GEOS_MULTIPOLYGON:
+  {
+    const geos::geom::MultiPolygon *multipoly = dynamic_cast<const geos::geom::MultiPolygon*>(geos_geometry);
+    if(!dont_check_for_curve_surface && isSurface(multipoly))
+    {
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Surface");
+      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+      zorba::Item patches_item;
+      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "patches");
+      addNewLineIndentText(result_item, indent+2);
+      patches_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
+
+      size_t    nr_geoms = multipoly->getNumGeometries();
+      for(size_t i=0;i<nr_geoms;i++)
+      {
+        const geos::geom::Geometry  *polygon;
+        polygon = multipoly->getGeometryN(i);
+
+        zorba::Item   polygon_item;
+        polygon_item = getGMLItemFromGeosGeometry(patches_item, polygon, NULL, indent+4, "PolygonPatch");
+      }
+      if(nr_geoms)
+        addNewLineIndentText(patches_item, indent+2);
+      addNewLineIndentText(result_item, indent);
+    }
+    else
+    {
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiSurface");
+      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+
+      size_t    nr_geoms = geos_geometry->getNumGeometries();
+      for(size_t i=0;i<nr_geoms;i++)
+      {
+        const geos::geom::Geometry  *polygon;
+        polygon = geos_geometry->getGeometryN(i);
+        getGMLItemFromGeosGeometry(result_item, polygon, NULL, indent+2);
+      }
+      if(nr_geoms)
+        addNewLineIndentText(result_item, indent);
+    }
+    break;
+  }
+	/// a collection of heterogeneus geometries
+  case geos::geom::GEOS_GEOMETRYCOLLECTION:
+  {
+    size_t    nr_geoms = geos_geometry->getNumGeometries();
+    if(!nr_geoms)
+      break;
+    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiGeometry");
+    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
+
+    for(size_t i=0;i<nr_geoms;i++)
+    {
+      zorba::Item geometryMember_item;
+      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "geometryMember");
+      addNewLineIndentText(result_item, indent+2);
+      geometryMember_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
+      const geos::geom::Geometry  *member;
+      member = geos_geometry->getGeometryN(i);
+
+      zorba::Item   geometry_item;
+      geometry_item = getGMLItemFromGeosGeometry(geometryMember_item, member, NULL, indent+4 );
+      if(!geometry_item.isNull())
+        addNewLineIndentText(geometryMember_item, indent+2);
+    }
+    if(nr_geoms)
+      addNewLineIndentText(result_item, indent);
+    break;
+  }
+  default:
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Geometry type " << geos_geometry->getGeometryType() << " is not supported";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  }
+
+  if(!result_item.isNull() && srs_uri && !srs_uri->isNull())
+  {
+    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+    item_name = theModule->getItemFactory()->createQName("", "srsName");
+    zorba::String   strvalue = srs_uri->getStringValue();
+    zorba::Item attr_value_item = theModule->getItemFactory()->createString(strvalue);
+    theModule->getItemFactory()->createAttributeNode(result_item, item_name, item_type, attr_value_item);
+  }
+
+//  if(!parent.isNull())
+//    addNewLineIndentText(parent, indent);
+  return result_item;
+}
+
+/*see if the end point from one segment is the start point for the next segment*/
+bool GeoFunction::isCurve(const geos::geom::MultiLineString *multiline) const
+{
+  geos::geom::MultiLineString::const_iterator line_it;
+  std::auto_ptr<geos::geom::Point> end_point;
+  for(line_it = multiline->begin(); line_it != multiline->end(); line_it++)
+  {
+    const geos::geom::LineString   *linestring = dynamic_cast<const geos::geom::LineString*>(*line_it);
+    if(end_point.get())
+    {
+      std::auto_ptr<geos::geom::Point> start_point;
+      start_point.reset(linestring->getStartPoint());
+      if(start_point->compareTo(end_point.get()))
+        return false;
+    }
+    end_point.reset(linestring->getEndPoint());
+  }
+  return true;
+}
+
+bool GeoFunction::isClosedCurve(const geos::geom::Geometry *geos_geometry) const
+{
+  //Curve is a MultiLineString
+  const geos::geom::MultiLineString *curve = dynamic_cast<const geos::geom::MultiLineString *>(geos_geometry);
+  unsigned int num_segments = (unsigned int)curve->getNumGeometries();
+  if(!num_segments)
+    return false;
+  unsigned int i;
+  //see if last point of a segment is the first of the next
+  const geos::geom::LineString *segment1 = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(0));
+  std::auto_ptr<const geos::geom::CoordinateSequence> coords1(segment1->getCoordinates());
+  const geos::geom::LineString *segment2;
+  std::auto_ptr<const geos::geom::CoordinateSequence> coords2;
+  for(i=1;i<num_segments;i++)
+  {
+    segment2 = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(i));
+    coords2.reset(segment2->getCoordinates());
+    if(coords1->getAt(coords1->size()-1) != coords2->getAt(0))
+      return false;
+    coords1 = coords2;
+    segment1 = segment2;
+  }
+  //check if last point is the same as the first point of the curve
+  segment2 = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(0));
+  coords2.reset(segment2->getCoordinates());
+  if(coords1->getAt(coords1->size()-1) != coords2->getAt(0))
+    return false;
+
+  return true;
+}
+
+geos::geom::LineString *GeoFunction::curveToLineString(const geos::geom::Geometry *geos_geometry) const
+{
+  const geos::geom::MultiLineString *curve = dynamic_cast<const geos::geom::MultiLineString *>(geos_geometry);
+  if(!isCurve(curve))
+    return NULL;
+  unsigned int num_segments = (unsigned int)curve->getNumGeometries();
+  if(!num_segments)
+    return NULL;
+  const geos::geom::LineString *segment;
+  std::auto_ptr<const geos::geom::CoordinateSequence> coords;
+  geos::geom::CoordinateSequence *linestring_coords = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, 2);
+  unsigned int i;
+  for(i=0;i<num_segments;i++)
+  {
+    segment = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(i));
+    coords.reset(segment->getCoordinates());
+    linestring_coords->add(coords.get(), true, true);
+  }
+  geos::geom::LineString *linestring = get_geometryFactory()->createLineString(linestring_coords);
+  linestring->setUserData((void*)GMLSF_LINESTRING);
+
+  return linestring;
+}
+
+bool GeoFunction::isRingCurve(const geos::geom::Geometry *geos_geometry) const
+{
+  geos::geom::LineString *linestring;
+  linestring = curveToLineString(geos_geometry);
+  if(!linestring)
+    return false;
+  //use GEOS
+  bool retval;
+  retval = linestring->isRing();
+  delete linestring;
+
+  return retval;
+}
+
+bool GeoFunction::isSimpleCurve(const geos::geom::Geometry *geos_geometry) const
+{
+  geos::geom::LineString *linestring;
+  linestring = curveToLineString(geos_geometry);
+  if(!linestring)
+    return false;
+  //use GEOS
+  bool retval;
+  retval = linestring->isSimple();
+  delete linestring;
+
+  return retval;
+}
+
+/*see if each polygon touches another polygon by at least a segment of external line and they are all connected together*/
+bool GeoFunction::isSurface(const geos::geom::MultiPolygon *multipolygon,
+                            bool *is_closed,
+                            geos::geom::LinearRing **exterior_boundary) const
+{
+/*
+  struct _tline
+  {
+    double x1, y1, x2, y2;
+    //bool taken;
+  };
+  struct _tpoly
+  {
+    std::vector<struct _tline> lines;
+    bool processed, touched;
+  };
+  std::vector<struct _tpoly>  polys;
+  int p = 0;
+  //init the data
+  if(!multipolygon->getNumGeometries())
+    return false;
+  polys.reserve(multipolygon->getNumGeometries());
+  geos::geom::MultiPolygon::const_iterator poly_it;
+  for(poly_it = multipolygon->begin(); poly_it != multipolygon->end(); poly_it++, p++)
+  {
+    polys[p].processed = false;
+    polys[p].touched = false;
+    const geos::geom::Polygon   *polygon = dynamic_cast<const geos::geom::Polygon*>(*poly_it);
+    const geos::geom::LineString*   exterior_ring;
+    int l, nr_points;
+    const geos::geom::Point *point;
+    exterior_ring = polygon->getExteriorRing();
+    nr_points = exterior_ring->getNumPoints();
+    polys[p].lines.reserve(nr_points);
+    for(l=0; l<nr_points; l++)
+    {
+      point = dynamic_cast<const geos::geom::Point*>(exterior_ring->getGeometryN(l));
+      //polys[p].lines[l].taken = false;
+      polys[p].lines[l].x1 = point->getX();
+      polys[p].lines[l].y1 = point->getY();
+      if(l)
+      {
+        polys[p].lines[l-1].x2 = point->getX();
+        polys[p].lines[l-1].y2 = point->getY();
+      }
+      else
+      {
+        polys[p].lines[nr_points-1].x2 = point->getX();
+        polys[p].lines[nr_points-1].y2 = point->getY();
+      }
+    }
+  }
+
+  //now check
+  std::vector<struct _tpoly>::iterator  tpoly_it;
+  bool first_round = true;
+  while(1)
+  {
+    if(first_round)
+      tpoly_it = polys.begin();
+    else
+    {
+      int total = 0;
+      int processed = 0;
+      for(tpoly_it = polys.begin(); tpoly_it != polys.end(); tpoly_it++)
+      {
+        total++;
+        if((*tpoly_it).processed)
+          processed++;
+        else if((*tpoly_it).touched)
+          break;
+      }
+      if(tpoly_it == polys.end())
+      {
+        if(total == processed)
+          return true;
+        else
+          return false;
+      }
+    }
+    first_round = false;
+    (*tpoly_it).processed = true;
+    //for every line, check there is at most one match with other line from other polygon
+    std::vector<struct _tline>::iterator line_it;
+    int all_matches = 0;
+    for(line_it = (*tpoly_it).lines.begin(); line_it != (*tpoly_it).lines.end(); line_it++)
+    {
+      int matches = 0;
+      std::vector<struct _tpoly>::iterator  tpoly_it2;
+      for(tpoly_it2 = polys.begin(); tpoly_it2 != polys.end(); tpoly_it2++)
+      {
+        if((*tpoly_it2).processed)
+          continue;
+        std::vector<struct _tline>::iterator line_it2;
+        for(line_it2 = (*tpoly_it2).lines.begin(); line_it2 != (*tpoly_it2).lines.end(); line_it2++)
+        {
+          if(((*line_it2).x1 == (*line_it).x1) && ((*line_it2).y1 == (*line_it).y1) &&
+            ((*line_it2).x2 == (*line_it).x2) && ((*line_it2).y2 == (*line_it).y2) ||
+            ((*line_it2).x1 == (*line_it).x2) && ((*line_it2).y1 == (*line_it).y2) &&
+            ((*line_it2).x2 == (*line_it).x1) && ((*line_it2).y2 == (*line_it).y1))
+          {
+            (*tpoly_it2).touched = true;
+            matches++;
+          }
+        }
+      }
+      if(matches > 1)
+        return false;
+      all_matches += matches;
+    }
+    if(!all_matches)
+      return false;
+  }
+  return true;
+*/
+
+  //another approach, using LineString::overlaps and LineString::intersection
+  //test each polygon if it touches another polygon and if they form a united surface
+  //all common boundaries should be disjoint
+
+  std::vector<int>    ids;
+  unsigned int i;
+  unsigned int nr_patches = (unsigned int)multipolygon->getNumGeometries();
+  if(!nr_patches)
+    return false;
+  ids.resize(nr_patches);
+  for(i=0;i<nr_patches;i++)
+  {
+    ids[i] = 1;//will be set -i-1 if it is touched by another polygon, and to zero when processed
+  }
+
+  if(is_closed)
+    *is_closed = true;
+  if(exterior_boundary)
+    *exterior_boundary = NULL;
+
+  std::vector<geos::geom::Geometry*> boundary_segments;//for computing exterior_boundary
+  bool is_united;
+
+  ids[0] = -1;
+  while(1)
+  {
+    is_united = true;
+    for(i=0;i<nr_patches;i++)
+      if(ids[i] > 0)
+        is_united = false;
+      else if(ids[i] < 0)
+        break;
+    if(i == nr_patches)
+      break;
+    ids[i] = 0;
+    std::vector<geos::geom::Geometry*>   common_segments;
+    const geos::geom::Polygon *patch1 = dynamic_cast<const geos::geom::Polygon *>(multipolygon->getGeometryN(i));
+    const geos::geom::LineString  *ring1 = patch1->getExteriorRing();
+
+    for(unsigned int j=0;(j<nr_patches);j++)
+    {
+      if(j==i)
+        continue;
+      const geos::geom::Polygon *patch2 = dynamic_cast<const geos::geom::Polygon *>(multipolygon->getGeometryN(j));
+      const geos::geom::LineString  *ring2 = patch2->getExteriorRing();
+      geos::geom::Geometry*  segment;
+      segment = ring1->intersection(ring2);
+      if(segment)
+      {
+        for(unsigned int s=0;s<segment->getNumGeometries();s++)
+        {
+          const geos::geom::Geometry *seg_piece = segment->getGeometryN(s);
+
+          if((seg_piece->getGeometryTypeId() == geos::geom::GEOS_LINESTRING) ||
+            (seg_piece->getGeometryTypeId() == geos::geom::GEOS_MULTILINESTRING))
+          {
+            if(ids[j] > 0)
+              ids[j] = -1;
+            for(unsigned int k=0;k<common_segments.size();k++)
+            {
+              if(seg_piece->overlaps(common_segments[k]))
+              {
+                delete segment;
+                for(unsigned int c=0;c<common_segments.size();c++)
+                  delete common_segments[c];
+                for(unsigned int b=0;b<boundary_segments.size();b++)
+                  delete boundary_segments[b];
+                return false;
+              }
+            }
+            common_segments.push_back(seg_piece->clone());
+          }
+        }
+        delete segment;
+      }//end if(segment)
+    }
+    if((is_closed && *is_closed) || exterior_boundary)
+    {
+      if(!common_segments.size())
+      {
+        if(is_closed)
+          *is_closed = false;
+      }
+      else
+      {
+        geos::geom::Geometry *segment_union;
+        geos::geom::Geometry *temp_union;
+        segment_union = common_segments[0]->clone();
+        for(unsigned int c=1;c<common_segments.size();c++)
+        {
+          temp_union = segment_union->Union(common_segments[c]);
+          delete segment_union;
+          segment_union = temp_union;
+        }
+        if(segment_union != ring1)
+        {
+          if(is_closed)
+            *is_closed = false;
+          if(exterior_boundary)
+          {
+            geos::geom::Geometry *diff;
+            diff = ring1->difference(segment_union);
+            boundary_segments.push_back(diff);
+          }
+        }
+        delete segment_union;
+      }
+    }
+    for(unsigned int c=0;c<common_segments.size();c++)
+      delete common_segments[c];
+    common_segments.clear();
+  }
+
+  if(is_united && exterior_boundary)
+  {
+    //do manual union of boundary_segments
+    //std::vector<const geos::geom::Point *> points;
+    geos::geom::CoordinateSequence      *cl = NULL;
+
+    std::vector<const geos::geom::LineString *> segments;
+    size_t nr_segments = 0;
+    for(unsigned int b=0;b<boundary_segments.size();b++)
+    {
+      nr_segments += boundary_segments[b]->getNumGeometries();
+    }
+    //points.reserve(nr_segments*4);
+    segments.reserve(nr_segments);
+    for(unsigned int b=0;b<boundary_segments.size();b++)
+    {
+      geos::geom::Geometry* segm = boundary_segments[b];
+      for(unsigned int s=0;s<segm->getNumGeometries();s++)
+      {
+        const geos::geom::Geometry* part = segm->getGeometryN(s);
+        if(part->getGeometryTypeId() == geos::geom::GEOS_LINESTRING)
+        {
+          segments.push_back(dynamic_cast<const geos::geom::LineString *>(part));
+        }
+      }
+    }
+    const geos::geom::Geometry* part = segments[0];
+    if(!cl)
+    {
+      int srs_dim;
+#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
+      srs_dim = part->getCoordinateDimension();
+#else
+      srs_dim = getCoordinateDimension(part);
+#endif
+      cl = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, srs_dim);
+    }
+    std::auto_ptr<const geos::geom::CoordinateSequence> coords(part->getCoordinates());
+    cl->add(coords.get(), false, true);
+
+    segments[0] = NULL;
+    while(1)
+    {
+      const geos::geom::Coordinate &last_point = cl->getAt(cl->size()-1);
+      bool added_points = false;
+      for(unsigned int s=1;s<segments.size();s++)
+      {
+        if(!segments[s])
+          continue;
+        const geos::geom::Geometry *segmn = segments[s];
+        std::auto_ptr<geos::geom::CoordinateSequence> coords(segmn->getCoordinates());
+        geos::geom::Coordinate point = coords->getAt(0);
+        if(last_point == point)
+        {
+          cl->add(coords.get(), false, true);
+          segments[s] = NULL;
+          added_points = true;
+          break;
+        }
+        else
+        {
+          point = coords->getAt(coords->size()-1);
+          if(last_point == point)
+          {
+            cl->add(coords.get(), false, false);
+            segments[s] = NULL;
+            added_points = true;
+            break;
+          }
+        }
+      }
+      if(!added_points)
+        break;
+    }
+    cl->add(cl->getAt(0), false);
+    *exterior_boundary = get_geometryFactory()->createLinearRing(cl);
+    (*exterior_boundary)->setUserData((void*)GMLSF_LINEARRING);
+    for(unsigned int b=0;b<boundary_segments.size();b++)
+      delete boundary_segments[b];
+  }
+  return is_united;
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFDimensionFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+  geos::geom::Dimension::DimensionType   dim_type = geos::geom::Dimension::DONTCARE;
+  try{
+    dim_type = geos_geometry->getDimension();
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS function getDimension : " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(
+      theModule->getItemFactory()->createInteger((int)dim_type)));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFCoordinateDimensionFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
+  int   coord_dim = geos_geometry->getCoordinateDimension();
+#else
+  int coord_dim = getCoordinateDimension(geos_geometry.get());
+#endif
+  return ItemSequence_t(new SingletonItemSequence(
+      theModule->getItemFactory()->createInteger(coord_dim)));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFGeometryTypeFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  zorba::String type_string;
+  switch(geometric_type)
+  {
+  case GMLSF_POINT:
+   type_string = "Point";break;
+  case GMLSF_LINESTRING:
+   type_string = "LineString";break;
+  case GMLSF_CURVE:
+   type_string = "Curve";break;
+  case GMLSF_LINEARRING:
+   type_string = "LineString";break;
+  case GMLSF_SURFACE:
+   type_string = "Surface";break;
+  case GMLSF_POLYGON:
+  //case GMLSF_POLYGONPATCH:
+   type_string = "Polygon";break;
+  case GMLSF_MULTIPOINT:
+   type_string = "MultiPoint";break;
+  case GMLSF_MULTICURVE:
+   type_string = "MultiCurve";break;
+  case GMLSF_MULTISURFACE:
+   type_string = "MultiSurface";break;
+  case GMLSF_MULTIGEOMETRY:
+   type_string = "MultiGeometry";break;
+
+  case GMLSF_INVALID:
+  default:
+  /*  {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+  */  break;
+  }
+
+  if(!type_string.empty())
+  {
+    String gmlns("http://www.opengis.net/gml";);
+    String gmlprefix("gml");
+    return ItemSequence_t(new SingletonItemSequence(
+      theModule->getItemFactory()->createQName(gmlns, gmlprefix, type_string)));
+  }
+  else
+  {
+    return ItemSequence_t(NULL);//new EmptySequence());
+  }
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFNumGeometriesFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_POINT:
+  case GMLSF_LINESTRING:
+  //case GMLSF_CURVE:
+  case GMLSF_LINEARRING:
+  //case GMLSF_SURFACE:
+  case GMLSF_POLYGON:
+    return ItemSequence_t(new SingletonItemSequence(
+      theModule->getItemFactory()->createUnsignedInt(1)));
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  uint32_t    num_geos = 0;
+  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, COUNT_CHILDREN, &num_geos);
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createUnsignedInt(num_geos)));
+}
+
+ItemSequence_t
+SFGeometryNFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  Item lItem2;
+  Iterator_t arg1_iter = args[1]->getIterator();
+  arg1_iter->open();
+  if (!arg1_iter->next(lItem2))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as second parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  arg1_iter->close();
+
+  uint32_t n;
+  n = lItem2.getUnsignedIntValue();
+
+  switch(geometric_type1)
+  {
+  case GMLSF_POINT:
+  case GMLSF_LINESTRING:
+  //case GMLSF_CURVE:
+  case GMLSF_LINEARRING:
+  //case GMLSF_SURFACE:
+  case GMLSF_POLYGON:
+    if(n == 0)
+      return ItemSequence_t(new SingletonItemSequence(lItem1));
+    else
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Index n (" << n << ") is outside the range ";
+      throwError("IndexOutsideRange", lErrorMessage.str());
+    }
+    break;
+  default:break;
+  }
+
+  Item    nth_child;
+  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_CHILD, &n, &nth_child);
+
+  if(nth_child.isNull())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Index n (" << n << ") is outside the range ";
+    throwError("IndexOutsideRange", lErrorMessage.str());
+  }
+  return ItemSequence_t(new SingletonItemSequence(nth_child));
+}
+
+
+
+///////////////////////////////////////////////////////////////////////
+#define DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(sfclass_name, geos_function_name)  \
+ItemSequence_t                                                                          \
+sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,              \
+         const StaticContext* aSctxCtx,                                                 \
+         const DynamicContext* aDynCtx) const                                           \
+{                                                                                       \
+  Item lItem;                                                                           \
+  gmlsf_types   geometric_type;                                                         \
+  geometric_type = getGeometryNodeType(args, 0, lItem);                                 \
+                                                                                        \
+  switch(geometric_type)                                                                \
+  {                                                                                     \
+  case GMLSF_INVALID:                                                                   \
+    {                                                                                   \
+      std::stringstream lErrorMessage;                                                  \
+      zorba::Item item_qname;                                                           \
+      lItem.getNodeName(item_qname);                                                    \
+      lErrorMessage << "Unrecognized geometric type for element "                       \
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                         \
+    }                                                                                   \
+    break;                                                                              \
+  default:                                                                              \
+    break;                                                                              \
+  }                                                                                     \
+                                                                                        \
+  zorba::Item srs_uri;                                                                  \
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));  \
+                                                                                        \
+  std::auto_ptr<geos::geom::Geometry>  geos_result;                                     \
+  try{                                                                                  \
+    geos_result.reset(geos_geometry->geos_function_name());                             \
+  }catch(std::exception &excep)                                                         \
+  {                                                                                     \
+    std::stringstream lErrorMessage;                                                    \
+    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
+    throwError("GEOSError", lErrorMessage.str());                                          \
+  }                                                                                     \
+                                                                                        \
+  zorba::Item   null_parent;                                                            \
+  zorba::Item   result_item;                                                            \
+  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri);         \
+                                                                                        \
+  RETURN_RESULT_ITEM;                                                                   \
+}
+
+//DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFBoundaryFunction, getBoundary)
+DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFConvexHullFunction, convexHull)
+DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFCentroidFunction, getCentroid)
+DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFPointOnSurfaceFunction, getInteriorPoint)
+
+zorba::Item GeoFunction::getBoundary(geos::geom::Geometry *geos_geometry, zorba::Item srs_uri) const
+{
+  std::auto_ptr<geos::geom::Geometry>  geos_result;
+  if(geos_geometry->getUserData() == (void*)GMLSF_SURFACE)
+  {
+    geos::geom::LinearRing *exterior_ring;
+    geos::geom::MultiPolygon* surface = dynamic_cast<geos::geom::MultiPolygon*>(geos_geometry);
+    if(!isSurface(surface, NULL, &exterior_ring))
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in Surface : the patches do not form a polyhedral surface";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    std::vector<geos::geom::Geometry*> *rings = new std::vector<geos::geom::Geometry*>;
+    rings->push_back(exterior_ring);
+    for(unsigned int i=0;i<surface->getNumGeometries();i++)
+    {
+      const geos::geom::Polygon* polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry->getGeometryN(i));
+      for(unsigned int r=0;r<polygon->getNumInteriorRing();r++)
+      {
+        rings->push_back((geos::geom::LineString*)polygon->getInteriorRingN(r));
+      }
+    }
+    geos_result.reset(get_geometryFactory()->createMultiLineString(rings));
+  }
+  /*else if(geometric_type == GMLSF_CURVE)
+  {
+    geos::geom::LineString *linestring = curveToLineString(geos_geometry);
+    try{
+      geos_result = linestring->getBoundary();
+    }catch(std::exception &excep)
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in GEOS function getBoundary : " << excep.what();
+      throwError("GEOSError", lErrorMessage.str());
+    }
+    delete linestring;
+  }
+  */
+  else
+  {
+    try{
+      geos_result.reset(geos_geometry->getBoundary());
+    }catch(std::exception &excep)
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in GEOS function getBoundary : " << excep.what();
+      throwError("GEOSError", lErrorMessage.str());
+    }
+  }
+
+  zorba::Item   null_parent;
+  zorba::Item   result_item;
+  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri, 0, NULL, DONT_CHECK_FOR_CURVE_SURFACE);
+  return result_item;
+}
+
+void GeoFunction::getMultiGeometryBoundary(geos::geom::Geometry *geos_geometry,
+                                           std::vector<zorba::Item> *boundaries,
+                                           zorba::Item srs_uri) const
+{
+  for(unsigned int i=0;i<geos_geometry->getNumGeometries();i++)
+  {
+    geos::geom::Geometry *geom = (geos::geom::Geometry *)geos_geometry->getGeometryN(i);
+    if(geom->getGeometryTypeId() == geos::geom::GEOS_GEOMETRYCOLLECTION)
+      getMultiGeometryBoundary(geom, boundaries, srs_uri);
+    else
+    {
+      zorba::Item boundary;
+      boundary = getBoundary(geom, srs_uri);
+      if(!boundary.isNull())
+        boundaries->push_back(boundary);
+    }
+  }
+}
+
+ItemSequence_t
+SFBoundaryFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  zorba::Item srs_uri;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));
+
+  if(geometric_type != GMLSF_MULTIGEOMETRY)
+  {
+    zorba::Item result_item;
+    result_item = getBoundary(geos_geometry.get(), srs_uri);
+    RETURN_RESULT_ITEM;
+  }
+  else
+  {
+    std::vector<zorba::Item>  boundaries;
+    getMultiGeometryBoundary(geos_geometry.get(), &boundaries, srs_uri);
+    return ItemSequence_t(new VectorItemSequence(boundaries));
+  }
+
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFSridFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  zorba::Item  srs_uri;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));
+
+  if(!srs_uri.isNull())
+    return ItemSequence_t(new SingletonItemSequence(srs_uri));
+  else
+    return ItemSequence_t(NULL);
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFEnvelopeFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  zorba::Item  srs_uri;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));
+
+  const geos::geom::Envelope  *envelope = NULL;
+  try{
+    envelope = geos_geometry->getEnvelopeInternal();
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS function getEnvelopeInternal : " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+
+
+  zorba::Item   envelope_item;
+  zorba::Item   corner_item;
+  zorba::Item   item_name;
+  zorba::Item   item_type;
+  zorba::Item   null_parent;
+  zorba::NsBindings ns_binding;
+  char strtemp[100];
+  ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
+  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+  item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Envelope");
+  envelope_item = theModule->getItemFactory()->createElementNode(null_parent, item_name, item_type, false, false, ns_binding);
+
+  if(!srs_uri.isNull())
+  {
+    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+    item_name = theModule->getItemFactory()->createQName("", "srsName");
+    zorba::String   strvalue = srs_uri.getStringValue();
+    zorba::Item attr_value_item = theModule->getItemFactory()->createString(strvalue);
+    theModule->getItemFactory()->createAttributeNode(envelope_item, item_name, item_type, attr_value_item);
+  }
+  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+  item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "lowerCorner");
+  addNewLineIndentText(envelope_item, 2);
+  corner_item = theModule->getItemFactory()->createElementNode(envelope_item, item_name, item_type, false, false, ns_binding);
+
+  sprintf(strtemp, "%lf %lf", envelope->getMinX(), envelope->getMinY());
+  theModule->getItemFactory()->createTextNode(corner_item, strtemp);
+
+  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
+  item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "upperCorner");
+  addNewLineIndentText(envelope_item, 2);
+  corner_item = theModule->getItemFactory()->createElementNode(envelope_item, item_name, item_type, false, false, ns_binding);
+
+  sprintf(strtemp, "%lf %lf", envelope->getMaxX(), envelope->getMaxY());
+  theModule->getItemFactory()->createTextNode(corner_item, strtemp);
+  addNewLineIndentText(envelope_item, 0);
+
+  return ItemSequence_t(new SingletonItemSequence(envelope_item));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFAsTextFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+  std::string as_text;
+  as_text = geos_geometry->toString();
+
+  return ItemSequence_t(new SingletonItemSequence(
+      theModule->getItemFactory()->createString(as_text)));
+}
+
+unsigned char GeoFunction::hex_to_bin(char hex) const
+{
+  if((hex >= '0') && (hex <= '9'))
+    return hex-'0';
+  else if((hex >= 'a') && (hex <= 'f'))
+    return hex-'a'+10;
+  else if((hex >= 'A') && (hex <= 'F'))
+    return hex-'A'+10;
+  else
+    return 0;
+}
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFAsBinaryFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+  std::ostringstream as_binary;
+  as_binary << *geos_geometry;
+
+  std::string binary_hex = as_binary.str();
+  size_t binary_len = binary_hex.size() / 2;
+  const char *hex_str = binary_hex.c_str();
+  unsigned char *binary_bin = new unsigned char[binary_len];
+  for(size_t i=0;i<binary_len;i++)
+  {
+    binary_bin[i] = ((hex_to_bin(hex_str[i*2]) << 4) | hex_to_bin(hex_str[i*2+1]));
+  }
+
+  zorba::Item base64_item = theModule->getItemFactory()->createBase64Binary(binary_bin, binary_len);
+  delete[] binary_bin;
+
+  return ItemSequence_t(new SingletonItemSequence(base64_item));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFIsEmptyFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  Iterator_t arg0_iter = args[0]->getIterator();
+  arg0_iter->open();
+  if (!arg0_iter->next(lItem))
+  {
+    return ItemSequence_t(new SingletonItemSequence(
+       theModule->getItemFactory()->createBoolean(true)));
+  }
+  arg0_iter->close();
+
+  if(!lItem.isNode() || (lItem.getNodeKind() != store::StoreConsts::elementNode))
+  {
+    return ItemSequence_t(new SingletonItemSequence(
+       theModule->getItemFactory()->createBoolean(true)));
+  }
+
+  GeoFunction::gmlsf_types geotype = getGmlSFGeometricType(lItem);
+  if(geotype == GMLSF_INVALID)
+  {
+    return ItemSequence_t(new SingletonItemSequence(
+      theModule->getItemFactory()->createBoolean(true)));
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geotype, -1));
+
+  bool is_empty = false;
+  try{
+  is_empty = (geos_geometry->getNumPoints() == 0);
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS function getNumGeometries : " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(is_empty)));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFIsSimpleFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+  bool is_simple = false;
+  if(geometric_type == GMLSF_CURVE)
+  {
+    is_simple = isSimpleCurve(geos_geometry.get());
+  }
+  else
+  {
+    try{
+    is_simple = geos_geometry->isSimple();
+    }catch(std::exception &excep)
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in GEOS function isSimple : " << excep.what();
+      throwError("GEOSError", lErrorMessage.str());
+    }
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(is_simple)));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFIs3DFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
+  bool is_3D = (geos_geometry->getCoordinateDimension() == 3);
+#else
+  bool is_3D = (getCoordinateDimension(geos_geometry.get()) == 3);//for GEOS 3.2.2
+#endif
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(is_3D)));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFIsMeasuredFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(false)));
+}
+
+///////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////
+#define DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(sfclass_name, geos_function_name)  \
+ItemSequence_t                                                                    \
+sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,        \
+         const StaticContext* aSctxCtx,                                           \
+         const DynamicContext* aDynCtx) const                                     \
+{                                                                                 \
+  Item lItem1;                                                                    \
+  gmlsf_types   geometric_type1;                                                  \
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);                         \
+                                                                                  \
+  switch(geometric_type1)                                                         \
+  {                                                                               \
+  case GMLSF_INVALID:                                                             \
+    {                                                                             \
+      std::stringstream lErrorMessage;                                            \
+      zorba::Item item_qname1;                                                    \
+      lItem1.getNodeName(item_qname1);                                            \
+      lErrorMessage << "Unrecognized geometric type for element "                 \
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";    \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
+    }                                                                             \
+    break;                                                                        \
+  default:                                                                        \
+    break;                                                                        \
+  }                                                                               \
+                                                                                  \
+  Item lItem2;                                                                    \
+  gmlsf_types   geometric_type2;                                                  \
+  geometric_type2 = getGeometryNodeType(args, 1, lItem2);                         \
+                                                                                  \
+  switch(geometric_type2)                                                         \
+  {                                                                               \
+  case GMLSF_INVALID:                                                             \
+    {                                                                             \
+      std::stringstream lErrorMessage;                                            \
+      zorba::Item item_qname2;                                                    \
+      lItem2.getNodeName(item_qname2);                                            \
+      lErrorMessage << "Unrecognized geometric type for element "                 \
+           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";   \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
+    }                                                                             \
+    break;                                                                        \
+  default:                                                                        \
+    break;                                                                        \
+  }                                                                               \
+                                                                                  \
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;                                          \
+  zorba::Item srs_uri1;                                                           \
+  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));            \
+                                                                                  \
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;                                          \
+  zorba::Item srs_uri2;                                                           \
+  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));            \
+                                                                                  \
+  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&                                  \
+    srs_uri1.getStringValue() != srs_uri2.getStringValue())                 \
+  {                                                                               \
+    std::stringstream lErrorMessage;                                              \
+    lErrorMessage << "SrsName is not the same in the two geometries: " <<         \
+                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();  \
+    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());           \
+  }                                                                               \
+                                                                                  \
+  bool retval = false;                                                            \
+  try{                                                                            \
+  retval = geos_geometry1->geos_function_name(geos_geometry2.get());                    \
+  }catch(std::exception &excep)                                                   \
+  {                                                                               \
+    std::stringstream lErrorMessage;                                              \
+    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
+    throwError("GEOSError", lErrorMessage.str());                                    \
+  }                                                                               \
+                                                                                  \
+                                                                                 \
+  return ItemSequence_t(new SingletonItemSequence(                                \
+     theModule->getItemFactory()->createBoolean(retval)));                        \
+}
+
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFEqualsFunction, equals)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFCoversFunction, covers)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFDisjointFunction, disjoint)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFIntersectsFunction, intersects)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFTouchesFunction, touches)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFCrossesFunction, crosses)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFWithinFunction, within)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFContainsFunction, contains)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFOverlapsFunction, overlaps)
+
+///////////////////////////////////////////////////////////////////////
+#define DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(sfclass_name, geos_function_name)  \
+ItemSequence_t                                                                    \
+sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,        \
+         const StaticContext* aSctxCtx,                                           \
+         const DynamicContext* aDynCtx) const                                     \
+{                                                                                 \
+  Item lItem1;                                                                    \
+  gmlsf_types   geometric_type1;                                                  \
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);                         \
+                                                                                  \
+  switch(geometric_type1)                                                         \
+  {                                                                               \
+  case GMLSF_INVALID:                                                             \
+    {                                                                             \
+      std::stringstream lErrorMessage;                                            \
+      zorba::Item item_qname1;                                                    \
+      lItem1.getNodeName(item_qname1);                                            \
+      lErrorMessage << "Unrecognized geometric type for element "                 \
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";    \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
+    }                                                                             \
+    break;                                                                        \
+  default:                                                                        \
+    break;                                                                        \
+  }                                                                               \
+                                                                                  \
+  Item lItem2;                                                                    \
+  gmlsf_types   geometric_type2;                                                  \
+  geometric_type2 = getGeometryNodeType(args, 1, lItem2);                         \
+                                                                                  \
+  switch(geometric_type2)                                                         \
+  {                                                                               \
+  case GMLSF_INVALID:                                                             \
+    {                                                                             \
+      std::stringstream lErrorMessage;                                            \
+      zorba::Item item_qname2;                                                    \
+      lItem2.getNodeName(item_qname2);                                            \
+      lErrorMessage << "Unrecognized geometric type for element "                 \
+           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";   \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
+    }                                                                             \
+    break;                                                                        \
+  default:                                                                        \
+    break;                                                                        \
+  }                                                                               \
+                                                                                  \
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;                                          \
+  zorba::Item srs_uri1;                                                           \
+  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));            \
+                                                                                  \
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;                                          \
+  zorba::Item srs_uri2;                                                           \
+  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));            \
+                                                                                  \
+  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&                                  \
+    srs_uri1.getStringValue() == srs_uri2.getStringValue())                 \
+  {                                                                               \
+    std::stringstream lErrorMessage;                                              \
+    lErrorMessage << "SrsName is not the same in the two geometries: " <<         \
+                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();  \
+    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());           \
+  }                                                                               \
+                                                                                  \
+  std::auto_ptr<geos::geom::Geometry>  geos_result;                               \
+  try{                                                                            \
+  geos_result.reset(geos_geometry1->geos_function_name(geos_geometry2.get()));          \
+  }catch(std::exception &excep)                                                   \
+  {                                                                               \
+    std::stringstream lErrorMessage;                                              \
+    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
+    throwError("GEOSError", lErrorMessage.str());                                    \
+  }                                                                               \
+                                                                                  \
+                                                                                  \
+  if(srs_uri1.isNull())                                                           \
+    srs_uri1 = srs_uri2;                                                          \
+  zorba::Item   null_parent;                                                      \
+  zorba::Item   result_item;                                                      \
+  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri1);   \
+                                                                                  \
+  RETURN_RESULT_ITEM;                                                             \
+}
+
+
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFIntersectionFunction, intersection)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFUnionFunction, Union)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFDifferenceFunction, difference)
+DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFSymDifferenceFunction, symDifference)
+
+
+///////////////////////////////////////////////////////////////////////
+#define DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_DOUBLE(sfclass_name, geos_function_name)    \
+ItemSequence_t                                                                          \
+sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,              \
+         const StaticContext* aSctxCtx,                                                 \
+         const DynamicContext* aDynCtx) const                                           \
+{                                                                                       \
+  Item lItem;                                                                           \
+  gmlsf_types   geometric_type;                                                         \
+  geometric_type = getGeometryNodeType(args, 0, lItem);                                 \
+                                                                                        \
+  switch(geometric_type)                                                                \
+  {                                                                                     \
+  case GMLSF_INVALID:                                                                   \
+    {                                                                                   \
+      std::stringstream lErrorMessage;                                                  \
+      zorba::Item item_qname;                                                           \
+      lItem.getNodeName(item_qname);                                                    \
+      lErrorMessage << "Unrecognized geometric type for element "                       \
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                        \
+    }                                                                                   \
+    break;                                                                              \
+  default:                                                                              \
+    break;                                                                              \
+  }                                                                                     \
+                                                                                        \
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;                                                 \
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));                 \
+                                                                                        \
+  double  retval = 0;                                                                   \
+  try{                                                                                  \
+  retval = geos_geometry->geos_function_name();                                         \
+  }catch(std::exception &excep)                                                         \
+  {                                                                                     \
+    std::stringstream lErrorMessage;                                                    \
+    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
+    throwError("GEOSError", lErrorMessage.str());                                          \
+  }                                                                                     \
+                                                                                        \
+  return ItemSequence_t(new SingletonItemSequence(                                      \
+     theModule->getItemFactory()->createDouble(retval)));                               \
+}
+
+DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_DOUBLE(SFAreaFunction, getArea)
+DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_DOUBLE(SFLengthFunction, getLength)
+
+ItemSequence_t
+SFRelateFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  Item lItem2;
+  gmlsf_types   geometric_type2;
+  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
+
+  switch(geometric_type2)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname2;
+      lItem2.getNodeName(item_qname2);
+      lErrorMessage << "Unrecognized geometric type for third element "
+           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
+  zorba::Item  srs_uri1;
+  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;
+  zorba::Item  srs_uri2;
+  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));
+
+  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&
+    srs_uri1.getStringValue()== srs_uri2.getStringValue())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "SrsName is not the same in the two geometries: " <<
+                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();
+    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());
+  }
+
+
+  Item lItem3;
+  Iterator_t arg2_iter = args[2]->getIterator();
+  arg2_iter->open();
+  if (!arg2_iter->next(lItem3))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  arg2_iter->close();
+
+  zorba::String intersection_matrix;
+  intersection_matrix = lItem3.getStringValue();
+
+  bool is_relate = false;
+  try{
+    is_relate = geos_geometry1->relate(geos_geometry2.get(), intersection_matrix.c_str());
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS relate function: " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(is_relate)));
+}
+
+ItemSequence_t
+SFIsWithinDistanceFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  Item lItem2;
+  gmlsf_types   geometric_type2;
+  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
+
+  switch(geometric_type2)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname2;
+      lItem2.getNodeName(item_qname2);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
+  zorba::Item  srs_uri1;
+  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;
+  zorba::Item  srs_uri2;
+  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));
+
+  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&
+    srs_uri1.getStringValue() == srs_uri2.getStringValue())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "SrsName is not the same in the two geometries: " <<
+                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();
+    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());
+  }
+
+  Item lItem3;
+  Iterator_t arg2_iter = args[2]->getIterator();
+  arg2_iter->open();
+  if (!arg2_iter->next(lItem3))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as third parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  arg2_iter->close();
+
+  double distance;
+  distance = lItem3.getDoubleValue();
+
+  bool is_within_distance = false;
+  try{
+  is_within_distance = geos_geometry1->isWithinDistance(geos_geometry2.get(), distance);
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS function isWithinDistance : " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(is_within_distance)));
+}
+
+ItemSequence_t
+SFDistanceFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  Item lItem2;
+  gmlsf_types   geometric_type2;
+  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
+
+  switch(geometric_type2)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname2;
+      lItem2.getNodeName(item_qname2);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
+  zorba::Item  srs_uri1;
+  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;
+  zorba::Item  srs_uri2;
+  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));
+
+  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&
+    srs_uri1.getStringValue() == srs_uri2.getStringValue())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "SrsName is not the same in the two geometries: " <<
+                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();
+    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());
+  }
+
+  double min_distance = 0;
+  try{
+  min_distance = geos_geometry1->distance(geos_geometry2.get());
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS function distance : " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createDouble(min_distance)));
+}
+
+ItemSequence_t
+SFBufferFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  default:
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
+  zorba::Item srs_uri;
+  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri));
+
+
+  Item lItem2;
+  Iterator_t arg1_iter = args[1]->getIterator();
+  arg1_iter->open();
+  if (!arg1_iter->next(lItem2))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as second parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  arg1_iter->close();
+
+  double distance;
+  distance = lItem2.getDoubleValue();
+
+  std::auto_ptr<geos::geom::Geometry>  geos_result;
+  try{
+  geos_result.reset(geos_geometry1->buffer(distance));
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS function buffer : " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+
+  zorba::Item   null_parent;
+  zorba::Item   result_item;
+  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri);
+
+  RETURN_RESULT_ITEM;
+}
+
+///////////////////////////////////////////////////////////////////////
+#define DEFINE_EVALUATE_ONE_POINT_RETURN_DOUBLE(sfclass_name, geos_function_name)       \
+ItemSequence_t                                                                          \
+sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,              \
+         const StaticContext* aSctxCtx,                                                 \
+         const DynamicContext* aDynCtx) const                                           \
+{                                                                                       \
+  Item lItem;                                                                           \
+  gmlsf_types   geometric_type;                                                         \
+  geometric_type = getGeometryNodeType(args, 0, lItem);                                 \
+                                                                                        \
+  switch(geometric_type)                                                                \
+  {                                                                                     \
+  case GMLSF_INVALID:                                                                   \
+    {                                                                                   \
+      std::stringstream lErrorMessage;                                                  \
+      zorba::Item item_qname;                                                           \
+      lItem.getNodeName(item_qname);                                                    \
+      lErrorMessage << "Unrecognized geometric type for element "                       \
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                         \
+    }                                                                                   \
+    break;                                                                              \
+  case GMLSF_POINT:                                                                     \
+    break;                                                                              \
+  default:                                                                              \
+    {                                                                                   \
+      std::stringstream lErrorMessage;                                                  \
+      zorba::Item item_qname;                                                           \
+      lItem.getNodeName(item_qname);                                                    \
+      lErrorMessage << "Geometry must be a point: "                                     \
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());                         \
+    }                                                                                   \
+    break;                                                                              \
+  }                                                                                     \
+                                                                                        \
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;                                   \
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));            \
+  geos::geom::Point   *geos_point = dynamic_cast<geos::geom::Point*>(geos_geometry.get());    \
+                                                                                        \
+  double  retval = 0;                                                                   \
+  try{                                                                                  \
+  retval = geos_point->geos_function_name();                                            \
+  }catch(std::exception &excep)                                                         \
+  {                                                                                     \
+    std::stringstream lErrorMessage;                                                    \
+    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
+    throwError("GEOSError", lErrorMessage.str());                                          \
+  }                                                                                     \
+                                                                                        \
+  return ItemSequence_t(new SingletonItemSequence(                                      \
+     theModule->getItemFactory()->createDouble(retval)));                               \
+}
+
+DEFINE_EVALUATE_ONE_POINT_RETURN_DOUBLE(SFXFunction, getX)
+DEFINE_EVALUATE_ONE_POINT_RETURN_DOUBLE(SFYFunction, getY)
+
+ItemSequence_t
+SFZFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_POINT:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a point: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+  const geos::geom::Coordinate  *c;
+  c = geos_geometry->getCoordinate();
+#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
+  if(geos_geometry->getCoordinateDimension() == 3)
+#else
+  if(getCoordinateDimension(geos_geometry.get()) == 3)
+#endif
+  {
+    double z = c->z;
+    return ItemSequence_t(new SingletonItemSequence(
+       theModule->getItemFactory()->createDouble(z)));
+  }
+  else
+  {
+    return zorba::ItemSequence_t(NULL);
+  }
+
+}
+
+ItemSequence_t
+SFMFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_POINT:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a point: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  //don't know how to get the Measure from Point
+  return zorba::ItemSequence_t(NULL);
+
+}
+
+
+ItemSequence_t
+SFStartPointFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_LINESTRING:
+  case GMLSF_LINEARRING:
+  case GMLSF_CURVE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Geometry must be a line: "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  uint32_t n = 0;
+
+  Item    nth_child;
+  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_POINT, &n, &nth_child);
+
+  if(nth_child.isNull())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "LineString has no points ";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(nth_child));
+}
+
+ItemSequence_t
+SFEndPointFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_LINESTRING:
+  case GMLSF_LINEARRING:
+  case GMLSF_CURVE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Geometry must be a line: "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  Item    nth_child;
+  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_END_POINT, NULL, &nth_child);
+
+  if(nth_child.isNull())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "LineString has no points ";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(nth_child));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFIsClosedFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_LINESTRING:
+  case GMLSF_LINEARRING:
+  case GMLSF_CURVE:
+  case GMLSF_MULTICURVE:
+  case GMLSF_SURFACE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a line or Surface: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+  bool  retval = 0;
+  if(geometric_type == GMLSF_SURFACE)
+  {
+    if(!isSurface(dynamic_cast<geos::geom::MultiPolygon*>(geos_geometry.get()), &retval))
+      retval = false;
+  }
+  else if(geometric_type == GMLSF_CURVE)
+  {
+    retval = isClosedCurve(geos_geometry.get());
+  }
+  else
+  {
+    try{
+    if(geometric_type != GMLSF_MULTICURVE)
+    {
+      geos::geom::LineString   *geos_line = dynamic_cast<geos::geom::LineString*>(geos_geometry.get());
+      retval = geos_line->isClosed();
+    }
+    else
+    {
+      geos::geom::MultiLineString   *geos_multiline = dynamic_cast<geos::geom::MultiLineString*>(geos_geometry.get());
+      retval = geos_multiline->isClosed();
+    }
+    }catch(std::exception &excep)
+    {
+      std::stringstream lErrorMessage;
+      lErrorMessage << "Error in GEOS function SFIsClosedFunction : " << excep.what();
+      throwError("GEOSError", lErrorMessage.str());
+    }
+  }
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(retval)));
+}
+
+ItemSequence_t
+SFIsRingFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_LINESTRING:
+  case GMLSF_LINEARRING:
+  case GMLSF_CURVE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a line: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
+  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
+
+  bool  retval = 0;
+  if(geometric_type != GMLSF_CURVE)
+  {
+  try{
+    geos::geom::LineString   *geos_line = dynamic_cast<geos::geom::LineString*>(geos_geometry.get());
+    retval = geos_line->isClosed();
+  }catch(std::exception &excep)
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Error in GEOS function isClosed : " << excep.what();
+    throwError("GEOSError", lErrorMessage.str());
+  }
+  }
+  else
+  {
+    retval = isRingCurve(geos_geometry.get());
+  }
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createBoolean(retval)));
+}
+
+ItemSequence_t
+SFNumPointsFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_LINESTRING:
+  case GMLSF_LINEARRING:
+  case GMLSF_CURVE:
+  case GMLSF_MULTICURVE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a line: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  uint32_t  num_children;
+  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, GET_NUM_POINTS, &num_children);
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createUnsignedInt(num_children)));
+}
+
+ItemSequence_t
+SFPointNFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_LINESTRING:
+  case GMLSF_LINEARRING:
+  case GMLSF_CURVE:
+  case GMLSF_MULTICURVE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Geometry must be a line: "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+
+  Item lItem2;
+  Iterator_t arg1_iter = args[1]->getIterator();
+  arg1_iter->open();
+  if (!arg1_iter->next(lItem2))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as second parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  arg1_iter->close();
+
+  uint32_t n;
+  n = lItem2.getUnsignedIntValue();
+
+  Item    nth_child;
+  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_POINT, &n, &nth_child);
+
+  if(nth_child.isNull())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Index n (" << n << ") is outside the range ";
+    throwError("IndexOutsideRange", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(nth_child));
+}
+
+///////////////////////////////////////////////////////////////////////
+ItemSequence_t
+SFExteriorRingFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_POLYGON:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a polygon: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  Item  result_item;
+  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, GET_EXTERIOR_RING, NULL, &result_item);
+
+  RETURN_RESULT_ITEM;
+}
+
+ItemSequence_t
+SFNumInteriorRingFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_POLYGON:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a polygon: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  uint32_t  num_children;
+  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, COUNT_CHILDREN, &num_children);
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createUnsignedInt(num_children)));
+}
+
+ItemSequence_t
+SFInteriorRingNFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_POLYGON:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Geometry must be a polygon: "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+
+
+  Item lItem2;
+  Iterator_t arg1_iter = args[1]->getIterator();
+  arg1_iter->open();
+  if (!arg1_iter->next(lItem2))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as second parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  arg1_iter->close();
+
+  uint32_t n;
+  n = lItem2.getUnsignedIntValue();
+
+  Item    nth_child;
+  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_CHILD, &n, &nth_child);
+
+  if(nth_child.isNull())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Index n (" << n << ") is outside the range ";
+    throwError("IndexOutsideRange", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(nth_child));
+}
+
+ItemSequence_t
+SFNumPatchesFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem;
+  gmlsf_types   geometric_type;
+  geometric_type = getGeometryNodeType(args, 0, lItem);
+
+  switch(geometric_type)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_SURFACE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname;
+      lItem.getNodeName(item_qname);
+      lErrorMessage << "Geometry must be a Surface: "
+           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  uint32_t  num_children;
+  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, COUNT_CHILDREN, &num_children);
+
+  return ItemSequence_t(new SingletonItemSequence(
+     theModule->getItemFactory()->createUnsignedInt(num_children)));
+}
+
+ItemSequence_t
+SFPatchNFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_SURFACE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Geometry must be a Surface: "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+
+
+  Item lItem2;
+  Iterator_t arg1_iter = args[1]->getIterator();
+  arg1_iter->open();
+  if (!arg1_iter->next(lItem2))
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "An empty-sequence is not allowed as second parameter";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+  arg1_iter->close();
+
+  uint32_t n;
+  n = lItem2.getUnsignedIntValue();
+
+  Item    nth_child;
+  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_CHILD, &n, &nth_child);
+
+  if(nth_child.isNull())
+  {
+    std::stringstream lErrorMessage;
+    lErrorMessage << "Index n (" << n << ") is outside the range ";
+    throwError("IndexOutsideRange", lErrorMessage.str());
+  }
+
+  return ItemSequence_t(new SingletonItemSequence(nth_child));
+}
+
+
+ItemSequence_t
+SFBoundingPolygonsFunction::evaluate(const ExternalFunction::Arguments_t& args,
+         const StaticContext* aSctxCtx,
+         const DynamicContext* aDynCtx) const
+{
+  Item lItem1;
+  gmlsf_types   geometric_type1;
+  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
+
+  switch(geometric_type1)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_SURFACE:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname1;
+      lItem1.getNodeName(item_qname1);
+      lErrorMessage << "Parameter 1 must be a Surface: "
+           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  Item lItem2;
+  gmlsf_types   geometric_type2;
+  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
+
+  switch(geometric_type2)
+  {
+  case GMLSF_INVALID:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname2;
+      lItem2.getNodeName(item_qname2);
+      lErrorMessage << "Unrecognized geometric type for element "
+           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in first parameter.";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  case GMLSF_POLYGON:
+  //case GMLSF_POLYGONPATCH:
+    break;
+  default:
+    {
+      std::stringstream lErrorMessage;
+      zorba::Item item_qname2;
+      lItem2.getNodeName(item_qname2);
+      lErrorMessage << "Parameter 2 must be a Polygon or PolygonPatch: "
+           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << ".";
+      throwError("UnrecognizedGeoObject", lErrorMessage.str());
+    }
+    break;
+  }
+
+  std::vector<Item>   result;
+  zorba::Item   patches_item;
+  if(!getChild(lItem1, "patches", "http://www.opengis.net/gml";, patches_item))
+  {//get upset
+    std::stringstream lErrorMessage;
+    lErrorMessage << "gml:Surface node must have a gml:patches child";
+    throwError("UnrecognizedGeoObject", lErrorMessage.str());
+  }
+
+  Iterator_t    patches_children;
+  Item          polygon_patch_item;
+
+  patches_children = patches_item.getChildren();
+  patches_children->open();
+  unsigned int patch_nr = 0;
+
+  std::auto_ptr<geos::geom::Geometry> geos_geometry1(buildGeosGeometryFromItem(lItem1, geometric_type1, -1));
+  std::auto_ptr<geos::geom::Geometry> geos_geometry2(buildGeosGeometryFromItem(lItem2, GMLSF_POLYGON, -1));
+
+  const geos::geom::MultiPolygon *surface = dynamic_cast<const geos::geom::MultiPolygon*>(geos_geometry1.get());
+  const geos::geom::Polygon *polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry2.get());
+  const geos::geom::LineString *exterior_ring = polygon->getExteriorRing();
+  //const geos::geom::CoordinateSequence *coords = exterior_ring->getCoordinates();
+
+
+  unsigned int nr_patches = (unsigned int)surface->getNumGeometries();
+  unsigned int i;
+  for(i=0;i<nr_patches;i++)
+  {
+    const geos::geom::Polygon *patch= dynamic_cast<const geos::geom::Polygon*>(surface->getGeometryN(i));
+    const geos::geom::LineString *patch_exterior_ring = patch->getExteriorRing();
+    //const geos::geom::CoordinateSequence *patch_coords = patch_exterior_ring->getCoordinates();
+    //see if this patch touches the input polygon
+    bool is_touching = false;
+    /*
+    for(unsigned int j=0;j<patch_coords->size();j++)
+    {
+      for(unsigned int k=0;k<coords->size();k++)
+      {
+        if(coords->getAt(k) == patch_coords->getAt(j))
+        {
+          geos::geom::Coordinate next1;
+          geos::geom::Coordinate next2;
+          if(k == (coords->size()-1))
+            next1 = coords->getAt(0);
+          else
+            next1 = coords->getAt(k+1);
+          if(j == (patch_coords->size()-1))
+            next2 = patch_coords->getAt(0);
+          else
+            next2 = patch_coords->getAt(j+1);
+          if(next1 == next2)
+          {
+            is_touching = true;
+            break;
+          }
+          if(j == 0)
+            next2 = patch_coords->getAt(patch_coords->size()-1);
+          else
+            next2 = patch_coords->getAt(j-1);
+          if(next1 == next2)
+          {
+            is_touching = true;
+            break;
+          }
+        }
+      }
+      if(is_touching)
+        break;
+    }
+    */
+    if(patch_exterior_ring->overlaps(exterior_ring))
+      is_touching = true;
+    if(is_touching)
+    {
+      //add the coresponding patch item to the list
+      while(patch_nr <= i)
+      {
+        patches_children->next(polygon_patch_item);
+        patch_nr++;
+      }
+      result.push_back(polygon_patch_item);
+    }
+  }
+
+  return ItemSequence_t(new VectorItemSequence(result));
+}
+
+
+} /* namespace geomodule */ } /* namespace zorba */

=== added file 'src/geo.xq.src/geo_functions.h'
--- src/geo.xq.src/geo_functions.h	1970-01-01 00:00:00 +0000
+++ src/geo.xq.src/geo_functions.h	2013-06-18 22:41:25 +0000
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ZORBA_GEOMODULE_GEOFUNCTION_H
+#define ZORBA_GEOMODULE_GEOFUNCTION_H
+
+
+#include <zorba/external_module.h>
+#include <zorba/function.h>
+#include <zorba/zorba_string.h>
+
+namespace geos{
+namespace geom{
+class GeometryFactory;
+class Geometry;
+class CoordinateSequence;
+class MultiLineString;
+class MultiPolygon;
+class LineString;
+class LinearRing;
+}}
+
+namespace zorba { namespace geomodule {
+
+  class GeoModule;
+
+  class GeoFunction : public ContextualExternalFunction
+  {
+    protected:
+      const GeoModule* theModule;
+      //geos::geom::GeometryFactory   *geo_factory;
+
+      static void
+        throwError(
+              const char *err_localname,
+              const std::string aErrorMessage);
+
+
+    public:
+      enum gmlsf_types{
+        GMLSF_POINT,
+        GMLSF_LINESTRING,
+        GMLSF_CURVE,
+        GMLSF_LINEARRING,
+        GMLSF_SURFACE,
+        GMLSF_POLYGON,
+        //GMLSF_POLYGONPATCH,
+        GMLSF_MULTIPOINT,
+        GMLSF_MULTICURVE,
+        GMLSF_MULTISURFACE,
+        GMLSF_MULTIGEOMETRY,
+
+        GMLSF_INVALID
+      };
+
+      enum action_item{
+        BUILD_GEOS_GEOMETRY,
+        COUNT_CHILDREN,
+        GET_NTH_CHILD,
+        GET_EXTERIOR_RING,
+        GET_NUM_POINTS,
+        GET_NTH_POINT,
+        GET_END_POINT
+      };
+    protected:
+      bool getChild(zorba::Item &lItem, const char *localname, const char *ns, 
+                    zorba::Item &child_item) const;
+      bool getChild(zorba::Iterator_t children, const char *localname, const char *ns, 
+                    zorba::Item &child_item) const;
+      bool getAttribute(  zorba::Item &item, 
+                           const char *name, 
+                           const char *ns,
+                           zorba::Item &attr_item) const;
+      bool checkOptionalAttribute(zorba::Item &item, const char *attr_name, const char *ns, const char *attr_value) const;
+      int get_srsDimension(zorba::Item &item, int prev_srsdimension) const;
+      const geos::geom::GeometryFactory   *get_geometryFactory() const;
+      void readPointPosCoordinates(zorba::Item &lItem, double *x, double *y, double *z, int &srs_dim) const;
+      bool readPointPosCoordinates(zorba::Iterator_t children, double *x, double *y, double *z, int &srs_dim) const;
+      void readPosListCoordinates(zorba::Item &lItem, geos::geom::CoordinateSequence *&cl, int &srs_dim) const;
+      int  getCoordinateDimension(const geos::geom::Geometry *geos_geometry) const;
+      void getSrsName(zorba::Item lItem, zorba::Item &srs_uri) const;
+      bool isCurve(const geos::geom::MultiLineString *multiline) const;
+      bool isSurface(const geos::geom::MultiPolygon *multipolygon,
+                     bool *is_closed = NULL,
+                     geos::geom::LinearRing **exterior_boundary = NULL) const;
+      geos::geom::LineString *curveToLineString(const geos::geom::Geometry *geos_geometry) const;
+      bool isClosedCurve(const geos::geom::Geometry *geos_geometry) const;
+      bool isRingCurve(const geos::geom::Geometry *geos_geometry) const;
+      bool isSimpleCurve(const geos::geom::Geometry *geos_geometry) const;
+      
+      zorba::Item getBoundary(geos::geom::Geometry *geos_geometry, zorba::Item srs_uri) const;
+      void getMultiGeometryBoundary(geos::geom::Geometry *geos_geometry, 
+                                    std::vector<zorba::Item> *boundaries,
+                                    zorba::Item srs_uri) const;
+      void addNewLineIndentText(zorba::Item &parent, unsigned int indent) const;
+      void appendIndent(char *&strtemp2, unsigned int indent) const;
+      unsigned char hex_to_bin(char hex) const;
+
+    public:
+      GeoFunction(const GeoModule* module);
+      virtual ~GeoFunction();
+
+      virtual String
+      getURI() const;
+
+      enum gmlsf_types getGmlSFGeometricType(Item item) const;
+      enum gmlsf_types getGeometryNodeType(const ExternalFunction::Arguments_t& args, int arg_pos, zorba::Item &lItem) const;
+      
+      geos::geom::Geometry  *buildGeosGeometryFromItem(zorba::Item &lItem, 
+                                                      enum GeoFunction::gmlsf_types geometric_type,
+                                                      int  srs_dim,
+                                                      zorba::Item *srs_uri = NULL,
+                                                      enum GeoFunction::action_item what_action = BUILD_GEOS_GEOMETRY,
+                                                      uint32_t *optional_child_index_or_count = NULL,
+                                                      zorba::Item *result_item = NULL) const;
+      zorba::Item getGMLItemFromGeosGeometry(zorba::Item &parent, 
+                                              const geos::geom::Geometry *geos_geometry,
+                                              const zorba::Item *srs_uri = NULL,
+                                              unsigned int indent = 0,
+                                              const char *tag_name = NULL,
+                                              bool dont_check_for_curve_surface = false) const;
+  };
+
+
+//*****************************************************************************
+#define DECLARE_GEOFUNCTION_CLASS(geoclass_name, function_name)                 \
+  class geoclass_name : public GeoFunction                                      \
+  {                                                                             \
+    public:                                                                     \
+      geoclass_name(const GeoModule* aModule) : GeoFunction(aModule) {}         \
+                                                                                \
+      virtual String                                                            \
+      getLocalName() const { return #function_name; }                           \
+                                                                                \
+      virtual ItemSequence_t                                                    \
+      evaluate(const ExternalFunction::Arguments_t& args,              \
+               const StaticContext* aSctxCtx,                                   \
+               const DynamicContext* aDynCtx) const;                            \
+  };
+
+DECLARE_GEOFUNCTION_CLASS(SFDimensionFunction, dimension)
+DECLARE_GEOFUNCTION_CLASS(SFCoordinateDimensionFunction, coordinate-dimension)
+DECLARE_GEOFUNCTION_CLASS(SFGeometryTypeFunction, geometry-type)
+DECLARE_GEOFUNCTION_CLASS(SFSridFunction, srid)
+DECLARE_GEOFUNCTION_CLASS(SFNumGeometriesFunction, num-geometries)
+DECLARE_GEOFUNCTION_CLASS(SFGeometryNFunction, geometry-n)
+DECLARE_GEOFUNCTION_CLASS(SFEnvelopeFunction, envelope)
+DECLARE_GEOFUNCTION_CLASS(SFAsTextFunction, as-text)
+DECLARE_GEOFUNCTION_CLASS(SFAsBinaryFunction, as-binary)
+DECLARE_GEOFUNCTION_CLASS(SFIsEmptyFunction, is-empty)
+DECLARE_GEOFUNCTION_CLASS(SFIsSimpleFunction, is-simple)
+DECLARE_GEOFUNCTION_CLASS(SFIs3DFunction, is-3d)
+DECLARE_GEOFUNCTION_CLASS(SFIsMeasuredFunction, is-measured)
+DECLARE_GEOFUNCTION_CLASS(SFBoundaryFunction, boundary)
+DECLARE_GEOFUNCTION_CLASS(SFEqualsFunction, equals)
+DECLARE_GEOFUNCTION_CLASS(SFCoversFunction, covers)
+DECLARE_GEOFUNCTION_CLASS(SFDisjointFunction, disjoint)
+DECLARE_GEOFUNCTION_CLASS(SFIntersectsFunction, intersects)
+DECLARE_GEOFUNCTION_CLASS(SFTouchesFunction, touches)
+DECLARE_GEOFUNCTION_CLASS(SFCrossesFunction, crosses)
+DECLARE_GEOFUNCTION_CLASS(SFWithinFunction, within)
+DECLARE_GEOFUNCTION_CLASS(SFContainsFunction, contains)
+DECLARE_GEOFUNCTION_CLASS(SFOverlapsFunction, overlaps)
+DECLARE_GEOFUNCTION_CLASS(SFRelateFunction, relate)
+DECLARE_GEOFUNCTION_CLASS(SFDistanceFunction, distance)
+DECLARE_GEOFUNCTION_CLASS(SFBufferFunction, buffer)
+DECLARE_GEOFUNCTION_CLASS(SFConvexHullFunction, convex-hull)
+DECLARE_GEOFUNCTION_CLASS(SFIntersectionFunction, intersection)
+DECLARE_GEOFUNCTION_CLASS(SFUnionFunction, union)
+DECLARE_GEOFUNCTION_CLASS(SFDifferenceFunction, difference)
+DECLARE_GEOFUNCTION_CLASS(SFSymDifferenceFunction, sym-difference)
+DECLARE_GEOFUNCTION_CLASS(SFAreaFunction, area)
+DECLARE_GEOFUNCTION_CLASS(SFLengthFunction, length)
+DECLARE_GEOFUNCTION_CLASS(SFIsWithinDistanceFunction, is-within-distance)
+DECLARE_GEOFUNCTION_CLASS(SFCentroidFunction, centroid)
+DECLARE_GEOFUNCTION_CLASS(SFPointOnSurfaceFunction, point-on-surface)
+
+DECLARE_GEOFUNCTION_CLASS(SFXFunction, x)
+DECLARE_GEOFUNCTION_CLASS(SFYFunction, y)
+DECLARE_GEOFUNCTION_CLASS(SFZFunction, z)
+DECLARE_GEOFUNCTION_CLASS(SFMFunction, m)
+
+DECLARE_GEOFUNCTION_CLASS(SFStartPointFunction, start-point)
+DECLARE_GEOFUNCTION_CLASS(SFEndPointFunction, end-point)
+DECLARE_GEOFUNCTION_CLASS(SFIsClosedFunction, is-closed)
+DECLARE_GEOFUNCTION_CLASS(SFIsRingFunction, is-ring)
+DECLARE_GEOFUNCTION_CLASS(SFNumPointsFunction, num-points)
+DECLARE_GEOFUNCTION_CLASS(SFPointNFunction, point-n)
+
+DECLARE_GEOFUNCTION_CLASS(SFExteriorRingFunction, exterior-ring)
+DECLARE_GEOFUNCTION_CLASS(SFNumInteriorRingFunction, num-interior-ring)
+DECLARE_GEOFUNCTION_CLASS(SFInteriorRingNFunction, interior-ring-n)
+
+DECLARE_GEOFUNCTION_CLASS(SFNumPatchesFunction, num-patches)
+DECLARE_GEOFUNCTION_CLASS(SFPatchNFunction, patch-n)
+DECLARE_GEOFUNCTION_CLASS(SFBoundingPolygonsFunction, bounding-polygons)
+} /* namespace geomodule */
+} /* namespace zorba */
+
+#endif /* ZORBA_FILEMODULE_FILEFUNCTION_H */

=== added file 'src/geo.xq.src/geo_module.cpp'
--- src/geo.xq.src/geo_module.cpp	1970-01-01 00:00:00 +0000
+++ src/geo.xq.src/geo_module.cpp	2013-06-18 22:41:25 +0000
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "geo_module.h"
+#include "geo_functions.h"
+
+namespace zorba { namespace geomodule {
+
+  ItemFactory* GeoModule::theFactory = 0;
+
+#ifdef WIN32
+#  define DLL_EXPORT __declspec(dllexport)
+#else
+#  define DLL_EXPORT __attribute__ ((visibility("default")))
+#endif
+
+extern "C" DLL_EXPORT zorba::ExternalModule* createModule() {
+  return new zorba::geomodule::GeoModule();
+}
+
+GeoModule::~GeoModule()
+{
+  for (FuncMap_t::const_iterator lIter = theFunctions.begin();
+       lIter != theFunctions.end(); ++lIter) {
+    delete lIter->second;
+  }
+  theFunctions.clear();
+}
+  
+ExternalFunction*
+GeoModule::getExternalFunction(const String& aLocalname)
+{
+  ExternalFunction*& lFunc = theFunctions[aLocalname];
+  if (!lFunc) {
+    if (1 == 0) {
+
+    }
+    else if (aLocalname == "dimension") {
+      lFunc = new SFDimensionFunction(this);
+    }
+    else if (aLocalname == "coordinate-dimension") {
+      lFunc = new SFCoordinateDimensionFunction(this);
+    }
+    else if (aLocalname == "geometry-type") {
+      lFunc = new SFGeometryTypeFunction(this);
+    }
+    else if (aLocalname == "srid") {
+      lFunc = new SFSridFunction(this);
+    }
+    else if (aLocalname == "num-geometries") {
+      lFunc = new SFNumGeometriesFunction(this);
+    }
+    else if (aLocalname == "geometry-n") {
+      lFunc = new SFGeometryNFunction(this);
+    }
+    else if (aLocalname == "envelope") {
+      lFunc = new SFEnvelopeFunction(this);
+    }
+    else if (aLocalname == "as-text") {
+      lFunc = new SFAsTextFunction(this);
+    }
+    else if (aLocalname == "as-binary") {
+      lFunc = new SFAsBinaryFunction(this);
+    }
+    else if (aLocalname == "is-empty") {
+      lFunc = new SFIsEmptyFunction(this);
+    }
+    else if (aLocalname == "is-simple") {
+      lFunc = new SFIsSimpleFunction(this);
+    }
+    else if (aLocalname == "is-3d") {
+      lFunc = new SFIs3DFunction(this);
+    }
+    else if (aLocalname == "is-measured") {
+      lFunc = new SFIsMeasuredFunction(this);
+    }
+    else if (aLocalname == "boundary") {
+      lFunc = new SFBoundaryFunction(this);
+    }
+    else if (aLocalname == "equals") {
+      lFunc = new SFEqualsFunction(this);
+    }
+    else if (aLocalname == "covers") {
+      lFunc = new SFCoversFunction(this);
+    }
+    else if (aLocalname == "disjoint") {
+      lFunc = new SFDisjointFunction(this);
+    }
+    else if (aLocalname == "intersects") {
+      lFunc = new SFIntersectsFunction(this);
+    }
+    else if (aLocalname == "touches") {
+      lFunc = new SFTouchesFunction(this);
+    }
+    else if (aLocalname == "crosses") {
+      lFunc = new SFCrossesFunction(this);
+    }
+    else if (aLocalname == "within") {
+      lFunc = new SFWithinFunction(this);
+    }
+    else if (aLocalname == "contains") {
+      lFunc = new SFContainsFunction(this);
+    }
+    else if (aLocalname == "overlaps") {
+      lFunc = new SFOverlapsFunction(this);
+    }
+    else if (aLocalname == "relate") {
+      lFunc = new SFRelateFunction(this);
+    }
+    else if (aLocalname == "distance") {
+      lFunc = new SFDistanceFunction(this);
+    }
+    else if (aLocalname == "buffer") {
+      lFunc = new SFBufferFunction(this);
+    }
+    else if (aLocalname == "convex-hull") {
+      lFunc = new SFConvexHullFunction(this);
+    }
+    else if (aLocalname == "intersection") {
+      lFunc = new SFIntersectionFunction(this);
+    }
+    else if (aLocalname == "union") {
+      lFunc = new SFUnionFunction(this);
+    }
+    else if (aLocalname == "difference") {
+      lFunc = new SFDifferenceFunction(this);
+    }
+    else if (aLocalname == "sym-difference") {
+      lFunc = new SFSymDifferenceFunction(this);
+    }
+    else if (aLocalname == "area") {
+      lFunc = new SFAreaFunction(this);
+    }
+    else if (aLocalname == "length") {
+      lFunc = new SFLengthFunction(this);
+    }
+    else if (aLocalname == "is-within-distance") {
+      lFunc = new SFIsWithinDistanceFunction(this);
+    }
+    else if (aLocalname == "centroid") {
+      lFunc = new SFCentroidFunction(this);
+    }
+    else if (aLocalname == "point-on-surface") {
+      lFunc = new SFPointOnSurfaceFunction(this);
+    }
+    else if (aLocalname == "x") {
+      lFunc = new SFXFunction(this);
+    }
+    else if (aLocalname == "y") {
+      lFunc = new SFYFunction(this);
+    }
+    else if (aLocalname == "z") {
+      lFunc = new SFZFunction(this);
+    }
+    else if (aLocalname == "m") {
+      lFunc = new SFMFunction(this);
+    }
+    else if (aLocalname == "start-point") {
+      lFunc = new SFStartPointFunction(this);
+    }
+    else if (aLocalname == "end-point") {
+      lFunc = new SFEndPointFunction(this);
+    }
+    else if (aLocalname == "is-closed") {
+      lFunc = new SFIsClosedFunction(this);
+    }
+    else if (aLocalname == "is-ring") {
+      lFunc = new SFIsRingFunction(this);
+    }
+    else if (aLocalname == "num-points") {
+      lFunc = new SFNumPointsFunction(this);
+    }
+    else if (aLocalname == "point-n") {
+      lFunc = new SFPointNFunction(this);
+    }
+    else if (aLocalname == "exterior-ring") {
+      lFunc = new SFExteriorRingFunction(this);
+    }
+    else if (aLocalname == "num-interior-ring") {
+      lFunc = new SFNumInteriorRingFunction(this);
+    }
+    else if (aLocalname == "interior-ring-n") {
+      lFunc = new SFInteriorRingNFunction(this);
+    }
+    else if (aLocalname == "num-patches") {
+      lFunc = new SFNumPatchesFunction(this);
+    }
+    else if (aLocalname == "patch-n") {
+      lFunc = new SFPatchNFunction(this);
+    }
+    else if (aLocalname == "bounding-polygons") {
+      lFunc = new SFBoundingPolygonsFunction(this);
+    }
+  }
+  return lFunc;
+}
+
+void
+GeoModule::destroy()
+{
+  if (!dynamic_cast<GeoModule*>(this)) {
+    return;
+  }
+  delete this;
+}
+
+} /* namespace GeoModule */ } /* namespace zorba */

=== added file 'src/geo.xq.src/geo_module.h'
--- src/geo.xq.src/geo_module.h	1970-01-01 00:00:00 +0000
+++ src/geo.xq.src/geo_module.h	2013-06-18 22:41:25 +0000
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2006-2008 The FLWOR Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ZORBA_GEOMODULE_GEOMODULE_H
+#define ZORBA_GEOMODULE_GEOMODULE_H
+
+#include <map>
+
+#include <zorba/zorba.h>
+#include <zorba/external_module.h>
+
+namespace zorba { namespace geomodule {
+
+class GeoModule : public ExternalModule
+{
+private:
+  static ItemFactory* theFactory;
+
+protected:
+  class ltstr
+  {
+  public:
+    bool operator()(const String& s1, const String& s2) const
+    {
+      return s1.compare(s2) < 0;
+    }
+  };
+  
+  typedef std::map<String, ExternalFunction*, ltstr> FuncMap_t;
+
+  FuncMap_t theFunctions;
+  
+public:
+  virtual ~GeoModule();
+  
+  virtual String
+  getURI() const { return "http://zorba.io/modules/geo";; }
+  
+  virtual ExternalFunction*
+  getExternalFunction(const String& aLocalname);
+
+  virtual void
+  destroy();
+
+  static ItemFactory*
+  getItemFactory()
+  {
+    if(!theFactory)
+    {
+      theFactory = Zorba::getInstance(0)->getItemFactory();
+    }
+    
+    return theFactory;
+  }
+};
+
+
+} /* namespace geomodule */ 
+} /* namespace zorba */
+
+#endif /* ZORBA_GEOMODULE_GEOMODULE_H */
+
+/*
+ * Local variables:
+ * mode: c++
+ * End:
+ */

=== removed file 'src/org/CMakeLists.txt'
--- src/org/CMakeLists.txt	2011-02-23 12:55:52 +0000
+++ src/org/CMakeLists.txt	1970-01-01 00:00:00 +0000
@@ -1,14 +0,0 @@
-# Copyright 2006-2008 The FLWOR Foundation.
-# 
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-ADD_SUBDIRECTORY(expath)

=== removed file 'src/org/expath/CMakeLists.txt'
--- src/org/expath/CMakeLists.txt	2011-02-23 12:55:52 +0000
+++ src/org/expath/CMakeLists.txt	1970-01-01 00:00:00 +0000
@@ -1,14 +0,0 @@
-# Copyright 2006-2008 The FLWOR Foundation.
-# 
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-ADD_SUBDIRECTORY(ns)

=== removed file 'src/org/expath/ns/CMakeLists.txt'
--- src/org/expath/ns/CMakeLists.txt	2012-08-07 18:06:15 +0000
+++ src/org/expath/ns/CMakeLists.txt	1970-01-01 00:00:00 +0000
@@ -1,38 +0,0 @@
-# Copyright 2006-2008 The FLWOR Foundation.
-# 
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#
-#Geos
-#
-IF (ZORBA_SUPPRESS_GEOS)
-  MESSAGE (STATUS "ZORBA_SUPPRESS_GEOS is true - not searching for Geos.")
-ELSE (ZORBA_SUPPRESS_GEOS)
-
-  MESSAGE (STATUS "Looking for Geos")
-  FIND_PACKAGE(Geos)
-
-  IF(GEOS_FOUND)
-    MESSAGE (STATUS "Found Geos library -- " ${GEOS_LIBRARIES})
-    SET (GEO_LINK_LIBRARIES ${GEOS_LIBRARIES})
-    
-    INCLUDE_DIRECTORIES(${GEOS_INCLUDE_DIR})
-    INCLUDE_DIRECTORIES("geo.xq.src")   
-    DECLARE_ZORBA_MODULE (URI "http://expath.org/ns/geo"; VERSION 1.0 FILE "geo.xq" LINK_LIBRARIES "${GEOS_LIBRARIES}")
-    
-    ADD_TEST_DIRECTORY("${PROJECT_SOURCE_DIR}/test")    
-  ELSE(GEOS_FOUND)
-    MESSAGE(STATUS "Geos Library Not Found. You need to install Geos library in order to compile the Geo Module.")
-  ENDIF(GEOS_FOUND)
-ENDIF (ZORBA_SUPPRESS_GEOS)
-MESSAGE(STATUS "")
\ No newline at end of file

=== renamed file 'src/org/expath/ns/geo.xq' => 'src/org/expath/ns/geo.xq.THIS'
=== removed directory 'src/org/expath/ns/geo.xq.src'
=== removed file 'src/org/expath/ns/geo.xq.src/geo_functions.cpp'
--- src/org/expath/ns/geo.xq.src/geo_functions.cpp	2012-01-11 18:21:00 +0000
+++ src/org/expath/ns/geo.xq.src/geo_functions.cpp	1970-01-01 00:00:00 +0000
@@ -1,4507 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <string.h>
-#include <stdio.h>
-#include <cmath>
-#include <stdlib.h>
-
-#include "geo_functions.h"
-
-#include <geos/geom/PrecisionModel.h>
-#include <geos/geom/GeometryFactory.h>
-#include <geos/geom/Geometry.h>
-#include <geos/geom/Point.h>
-#include <geos/geom/LinearRing.h>
-#include <geos/geom/LineString.h>
-#include <geos/geom/Polygon.h>
-#include <geos/geom/GeometryCollection.h>
-#include <geos/geom/MultiPoint.h>
-#include <geos/geom/MultiLineString.h>
-#include <geos/geom/MultiPolygon.h>
-#include <geos/geom/Coordinate.h>
-#include <geos/geom/CoordinateSequence.h>
-#include <geos/geom/CoordinateArraySequence.h>
-#include <geos/geom/CoordinateArraySequenceFactory.h>
-#include <geos/geom/IntersectionMatrix.h>
-#include <geos/io/WKBReader.h>
-#include <geos/io/WKBWriter.h>
-#include <geos/io/WKTWriter.h>
-#include <geos/util/GeometricShapeFactory.h>
-#include <geos/util/GEOSException.h>
-#include <geos/util/IllegalArgumentException.h>
-#include <geos/opLinemerge.h>
-#include <geos/opPolygonize.h>
-#include <geos/version.h>
-#include <vector>
-#include <sstream>
-#include <iomanip>
-
-#include <zorba/empty_sequence.h>
-#include <zorba/singleton_item_sequence.h>
-#include <zorba/store_consts.h>
-#include <zorba/user_exception.h>
-#include <zorba/vector_item_sequence.h>
-#include <zorba/zorba.h>
-#include <zorba/zorba_functions.h>
-
-#include "geo_module.h"
-
-#if GEOS_VERSION_MAJOR < 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR < 2) || \
-  (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR == 2 && GEOS_VERSION_PATCH < 2)
-#error Zorba geo module can be linked only with GEOS version 3.2.2 or above, preferably 3.3
-#endif
-
-#define DONT_CHECK_FOR_CURVE_SURFACE true
-
-#define RETURN_RESULT_ITEM            return result_item.isNull() ? ItemSequence_t(NULL) : ItemSequence_t(new SingletonItemSequence(result_item))
-
-namespace zorba { namespace geomodule {
-
-GeoFunction::GeoFunction(const GeoModule* aModule)
-        : theModule(aModule)
-{
-//  geo_factory = NULL;
-}
-
-GeoFunction::~GeoFunction()
-{
-//  delete geo_factory;
-}
-
-String
-GeoFunction::getURI() const
-{
-  return theModule->getURI();
-}
-
-void
-GeoFunction::throwError(
-    const char *err_localname,
-    const std::string aErrorMessage)
-{
-    Item errWrongParamQName;
-    String errNS("http://expath.org/ns/error";);
-    String errName(err_localname);
-    Item errQName = GeoModule::getItemFactory()->createQName(errNS, errName);
-    String errDescription(aErrorMessage);
-    throw USER_EXCEPTION(errQName, errDescription);
-}
-
-enum GeoFunction::gmlsf_types GeoFunction::getGmlSFGeometricType(Item item) const
-{
-  Item  item_qname;
-  item.getNodeName(item_qname);
-  String  item_namespace = item_qname.getNamespace();
-  if(item_namespace != "http://www.opengis.net/gml";)
-    return GMLSF_INVALID;
-  String  localname = item_qname.getLocalName();
-
-  if(localname == "Point")
-    return GMLSF_POINT;
-  else if(localname == "LineString")
-    return GMLSF_LINESTRING;
-  else if(localname == "Curve")
-    return GMLSF_CURVE;
-  else if(localname == "LinearRing")
-    return GMLSF_LINEARRING;
-  else if(localname == "Surface")
-    return GMLSF_SURFACE;
-  else if(localname == "Polygon")
-    return GMLSF_POLYGON;
-  else if(localname == "PolygonPatch")
-    return GMLSF_POLYGON;
-  else if(localname == "MultiPoint")
-    return GMLSF_MULTIPOINT;
-  else if(localname == "MultiCurve")
-    return GMLSF_MULTICURVE;
-  else if(localname == "MultiSurface")
-    return GMLSF_MULTISURFACE;
-  else if(localname == "MultiGeometry")///from GML3
-    return GMLSF_MULTIGEOMETRY;
-  else
-    return GMLSF_INVALID;
-}
-
-enum GeoFunction::gmlsf_types GeoFunction::getGeometryNodeType(const ExternalFunction::Arguments_t& args,
-                                                               int arg_pos, zorba::Item &lItem) const
-{
-  Iterator_t args_iter = args[arg_pos]->getIterator();
-  args_iter->open();
-  if (!args_iter->next(lItem))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-
-  if(!lItem.isNode() || (lItem.getNodeKind() != store::StoreConsts::elementNode))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Argument must be a geometric node ";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  args_iter->close();
-  return getGmlSFGeometricType(lItem);
-}
-
-bool GeoFunction::getChild(zorba::Item &lItem, const char *localname, const char *ns,
-                           zorba::Item &child_item) const
-{
-  Iterator_t    children;
-  children = lItem.getChildren();
-  children->open();
-  bool retval = getChild(children, localname, ns, child_item);
-  children->close();
-  return retval;
-}
-
-bool GeoFunction::getChild(zorba::Iterator_t children, const char *localname, const char *ns,
-                           zorba::Item &child_item) const
-{
-  while(children->next(child_item))
-  {
-    if(child_item.getNodeKind() != store::StoreConsts::elementNode)
-      continue;
-    Item    child_name;
-    child_item.getNodeName(child_name);
-    String  item_namespace = child_name.getNamespace();
-    if(item_namespace != ns)
-    {
-      continue;//next child
-    }
-    String  item_name = child_name.getLocalName();
-    if(item_name != localname)
-    {
-      continue;//next child
-    }
-    return true;
-  }
-  return false;
-}
-
-bool GeoFunction::getAttribute(  zorba::Item &item,
-                                 const char *name,
-                                 const char *ns,
-                                 zorba::Item &attr_item) const
-{
-  Iterator_t    children;
-  children = item.getAttributes();
-  children->open();
-  while(children->next(attr_item))
-  {
-    zorba::Item   attr_qname;
-    attr_item.getNodeName(attr_qname);
-    String  attr_name = attr_qname.getLocalName();
-    if(attr_name != name)
-    {
-      continue;//next attr
-    }
-    if(!ns)
-    {
-      children->close();
-      return true;
-   }
-    String  attr_ns= attr_qname.getNamespace();
-    if(attr_ns == ns)
-    {
-      children->close();
-      return true;
-    }
-  }
-  children->close();
-  return false;
-}
-
-bool GeoFunction::checkOptionalAttribute(zorba::Item &item,
-                                         const char *name,
-                                         const char *ns,
-                                         const char *value) const
-{
-  zorba::Item attr_item;
-  if(!getAttribute(  item,
-                     name,
-                     ns,
-                     attr_item))
-     return true;
-  String  attr_value = attr_item.getStringValue();
-  return attr_value == value;
-}
-
-int GeoFunction::get_srsDimension(zorba::Item &item, int prev_srsdimension) const
-{
-  zorba::Item attr_item;
-  if(getAttribute(item,
-                   "srsDimension",
-                   NULL,
-                   attr_item))
-  {
-    String  attr_value = attr_item.getStringValue();
-    zfn::trim( attr_value );
-    int srs_dim = atoi(attr_value.c_str());
-    if((srs_dim != 2) && (srs_dim != 3))
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Geo module's supported values for srsDimension in GML are 2 and 3.";
-      throwError("UnsupportedSRSDimensionValue", lErrorMessage.str());
-    }
-    return srs_dim;
-  }
-  return prev_srsdimension;
-}
-
-const geos::geom::GeometryFactory   *GeoFunction::get_geometryFactory() const
-{
-//  if(!geo_factory)
-//    geo_factory = new geos::geom::GeometryFactory;
-//  return geo_factory;
-  return geos::geom::GeometryFactory::getDefaultInstance();
-}
-
-void GeoFunction::readPointPosCoordinates(zorba::Item &lItem,
-                                          double *x,
-                                          double *y,
-                                          double *z,
-                                          int &srs_dim) const
-{
-  Iterator_t    children;
-  children = lItem.getChildren();
-  children->open();
-  bool retval = readPointPosCoordinates(children, x, y, z, srs_dim);
-  children->close();
-  if(!retval)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "gml node must have a gml:pos child";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-}
-
-bool GeoFunction::readPointPosCoordinates(zorba::Iterator_t children,
-                                          double *x,
-                                          double *y,
-                                          double *z,
-                                          int &srs_dim) const
-{
-  zorba::Item   pos_item;
-  if(!getChild(children, "pos", "http://www.opengis.net/gml";, pos_item))
-  {//get upset
-    //std::stringstream lErrorMessage;
-    //lErrorMessage << "gml:Point node must have a gml:pos child";
-    //throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    return false;
-  }
-  srs_dim = get_srsDimension(pos_item, srs_dim);
-
-  String    pos_string;
-  pos_string = pos_item.getStringValue();
-  *x = 0;
-  *y = 0;
-  *z = 0;
-  const char *str = pos_string.c_str();
-  while(((*str == ' ') ||
-        (*str == '\t') ||
-        (*str == '\n') ||
-        (*str == '\r')) &&
-        (*str != 0))
-     str++;
-  sscanf(str, "%lf", x);
-  while((*str != ' ') &&
-        (*str != '\t') &&
-        (*str != '\n') &&
-        (*str != '\r') &&
-        (*str != 0))
-     str++;
-  while(((*str == ' ') ||
-      (*str == '\t') ||
-      (*str == '\n') ||
-      (*str == '\r')) &&
-      (*str != 0))
-     str++;
-  sscanf(str, "%lf", y);
-  if(srs_dim == 3)
-  {
-    while((*str != ' ') &&
-          (*str != '\t') &&
-          (*str != '\n') &&
-          (*str != '\r') &&
-          (*str != 0))
-       str++;
-    while(((*str == ' ') ||
-        (*str == '\t') ||
-        (*str == '\n') ||
-        (*str == '\r')) &&
-        (*str != 0))
-       str++;
-    sscanf(str, "%lf", z);
-  }
-  return true;
-}
-
-void GeoFunction::readPosListCoordinates(zorba::Item &lItem,
-                                         geos::geom::CoordinateSequence *&cl,
-                                         int &srs_dim) const
-{
-  zorba::Item   poslist_item;
-  if(srs_dim != 3)
-    srs_dim = 2;
-  if(getChild(lItem, "posList", "http://www.opengis.net/gml";, poslist_item))
-  {
-    srs_dim = get_srsDimension(poslist_item, srs_dim);
-    if(!cl)
-      cl = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, srs_dim);
-
-    String    poslist_string;
-    poslist_string = poslist_item.getStringValue();
-    double x, y, z;
-    int load_x = 0;
-    const char *str_poslist = poslist_string.c_str();
-    while(((*str_poslist == ' ') ||
-          (*str_poslist == '\t') ||
-          (*str_poslist == '\n') ||
-          (*str_poslist == '\r')) &&
-          (*str_poslist != 0))
-       str_poslist++;
-    x = 0; y = 0; z = 0;
-    while(str_poslist[0])
-    {
-      if(load_x == 0)
-        x = atof(str_poslist);
-      else if(load_x == 1)
-      {
-        y = atof(str_poslist);
-        if(srs_dim == 2)
-        {
-          cl->add(geos::geom::Coordinate(x, y));
-          x = 0; y = 0;
-        }
-      }
-      else if(load_x == 2)
-      {
-        z = atof(str_poslist);
-        cl->add(geos::geom::Coordinate(x, y, z));
-        x = 0; y = 0; z = 0;
-      }
-      load_x = (load_x + 1)%srs_dim;
-      while((*str_poslist != ' ') &&
-            (*str_poslist != '\t') &&
-            (*str_poslist != '\n') &&
-            (*str_poslist != '\r') &&
-            (*str_poslist != 0))
-         str_poslist++;
-      while(((*str_poslist == ' ') ||
-          (*str_poslist == '\t') ||
-          (*str_poslist == '\n') ||
-          (*str_poslist == '\r')) &&
-          (*str_poslist != 0))
-         str_poslist++;
-    }
-  }
-  else if(getChild(lItem, "pos", "http://www.opengis.net/gml";, poslist_item))
-  {
-    Iterator_t    children;
-    children = lItem.getChildren();
-    children->open();
-    double x = 0, y = 0, z = 0;
-    while(readPointPosCoordinates(children, &x, &y, &z, srs_dim))
-    {
-      if(!cl)
-        cl = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, srs_dim);
-
-      if(srs_dim == 3)
-      {
-        cl->add(geos::geom::Coordinate(x, y, z));
-      }
-      else
-      {
-        cl->add(geos::geom::Coordinate(x, y));
-      }
-      x = 0; y = 0; z = 0;
-    }
-    children->close();
-  }
-  else
-  {//get upset
-    std::stringstream lErrorMessage;
-    zorba::Item item_qname;
-    lItem.getNodeName(item_qname);
-    lErrorMessage << item_qname.getLocalName() << " node must have a gml:posList child";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-
-}
-
-int GeoFunction::getCoordinateDimension(const geos::geom::Geometry *geos_geometry) const
-{
-  if(!geos_geometry)
-    return 2;
-  switch(geos_geometry->getGeometryTypeId())
-  {
-  case 	geos::geom::GEOS_POINT:
-  {
-    const geos::geom::Coordinate  *c;
-    c = geos_geometry->getCoordinate();
-      if(!ISNAN(c->z))
-        return 3;
-      else
-        return 2;
-  }
-	/// a linestring
-  case geos::geom::GEOS_LINESTRING:
-	/// a linear ring (linestring with 1st point == last point)
-  case geos::geom::GEOS_LINEARRING:
-  {
-    std::auto_ptr<geos::geom::CoordinateSequence>  cs;
-    cs.reset(geos_geometry->getCoordinates());
-    size_t    cs_size = cs->getSize();
-    for(size_t i=0;i<cs_size;i++)
-    {
-      double z = cs->getAt(i).z;
-      if(!ISNAN(z))
-        return 3;
-    }
-    return 2;
-  }
-	/// a polygon
-  case geos::geom::GEOS_POLYGON:
-  {
-    const geos::geom::LineString*   exterior_ring;
-    const geos::geom::Polygon   *polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry);
-    exterior_ring = polygon->getExteriorRing();
-    int exterior_dim = getCoordinateDimension(exterior_ring);
-    if(exterior_dim == 3)
-      return 3;
-
-    size_t interior_rings = polygon->getNumInteriorRing();
-    for(size_t i=0;i<interior_rings;i++)
-    {
-      const geos::geom::LineString*   interior_ring;
-      interior_ring = polygon->getInteriorRingN(i);
-      int interior_dim = getCoordinateDimension(interior_ring);
-      if(interior_dim == 3)
-        return 3;
-    }
-    return 2;
-  }
-	/// a collection of points
-  case geos::geom::GEOS_MULTIPOINT:
-  {
-    size_t    nr_geoms = geos_geometry->getNumGeometries();
-    for(size_t i=0;i<nr_geoms;i++)
-    {
-      const geos::geom::Geometry  *point;
-      point = geos_geometry->getGeometryN(i);
-      if(getCoordinateDimension(point) == 3)
-        return 3;
-    }
-    return 2;
-  }
-	/// a collection of linestrings
-  case geos::geom::GEOS_MULTILINESTRING:
-  {
-    size_t    nr_geoms = geos_geometry->getNumGeometries();
-    for(size_t i=0;i<nr_geoms;i++)
-    {
-      const geos::geom::Geometry  *linestring;
-      linestring = geos_geometry->getGeometryN(i);
-      if(getCoordinateDimension(linestring) == 3)
-        return 3;
-    }
-    return 2;
-  }
-	/// a collection of polygons
-  case geos::geom::GEOS_MULTIPOLYGON:
-  {
-    size_t    nr_geoms = geos_geometry->getNumGeometries();
-    for(size_t i=0;i<nr_geoms;i++)
-    {
-      const geos::geom::Geometry  *polygon;
-      polygon = geos_geometry->getGeometryN(i);
-      if(getCoordinateDimension(polygon) == 3)
-        return 3;
-    }
-    return 2;
-  }
-	/// a collection of heterogeneus geometries
-  case geos::geom::GEOS_GEOMETRYCOLLECTION:
-  {
-    //can be either gml:Surface or gml:Curve
-    size_t    nr_geoms = geos_geometry->getNumGeometries();
-    if(!nr_geoms)
-      return 2;//unreachable
-    for(size_t i=0;i<nr_geoms;i++)
-    {
-      const geos::geom::Geometry *child;
-      child = geos_geometry->getGeometryN(i);
-      if(getCoordinateDimension(child) == 3)
-        return 3;
-    }
-    return 2;
-  }
-  default:
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Geometry type " << geos_geometry->getGeometryType() << " is not supported";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  }
-
-  return 2;
-}
-
-void GeoFunction::getSrsName(zorba::Item lItem, zorba::Item &srs_uri) const
-{
-  zorba::Item attr_item;
-  if(getAttribute(lItem,
-                   "srsName",
-                   NULL,
-                   attr_item))
-  {
-    String attr_value = attr_item.getStringValue();
-    srs_uri = theModule->getItemFactory()->createAnyURI(attr_value);
-    return;
-  }
-
-  zorba::Item parent_item = lItem.getParent();
-  if(parent_item.isNull())
-    return;
-  zorba::Item bounded_item;
-  zorba::Item envelope_item;
-  if(getChild(parent_item, "boundedBy", "http://www.opengis.net/gml";, bounded_item) &&
-     getChild(bounded_item, "Envelope", "http://www.opengis.net/gml";, envelope_item))
-  {
-    getSrsName(envelope_item, srs_uri);
-    if(!srs_uri.isNull())
-      return;
-  }
-  getSrsName(parent_item, srs_uri);
-  if(!srs_uri.isNull())
-    return;
-}
-
-geos::geom::Geometry  *GeoFunction::buildGeosGeometryFromItem(zorba::Item &lItem,
-                                                              enum GeoFunction::gmlsf_types geometric_type,
-                                                              int srs_dim,
-                                                              zorba::Item *srs_uri,
-                                                              enum GeoFunction::action_item what_action,
-                                                              uint32_t *optional_child_index_or_count,
-                                                              zorba::Item *result_item) const
-{
-  srs_dim = get_srsDimension(lItem, srs_dim);
-  if(srs_uri)
-    getSrsName(lItem, *srs_uri);
-  geos::geom::Geometry *result;
-
-  switch(geometric_type)
-  {
-  case GMLSF_POINT:
-  {
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      double x, y, z;
-      readPointPosCoordinates(lItem, &x, &y, &z, srs_dim);
-	    geos::geom::Coordinate c(x, y);
-      if(srs_dim == 3)
-        c.z = z;
-      try{
-      result = get_geometryFactory()->createPoint(c);
-      result->setUserData((void*)GMLSF_POINT);
-      return result;
-      }catch(std::exception &excep)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createPoint : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-    else if(what_action == COUNT_CHILDREN)
-      (*optional_child_index_or_count) = 1;
-    else if(what_action == GET_NTH_CHILD)
-    {
-      if((*optional_child_index_or_count) == 0)
-        *result_item = lItem;
-    }
-    else
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in GMLSF_POINT";
-      throwError("InternalError", lErrorMessage.str());
-    }
-  }break;
-  case GMLSF_LINESTRING:
-  {
-    geos::geom::CoordinateSequence *cl = NULL;//new geos::geom::CoordinateArraySequence();
-    readPosListCoordinates(lItem, cl, srs_dim);
-    uint32_t  last_index = (uint32_t)cl->size()-1;
-    if(what_action == GET_END_POINT)
-    {
-      optional_child_index_or_count = &last_index;
-      what_action = GET_NTH_POINT;
-    }
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-      result = get_geometryFactory()->createLineString(cl);
-      result->setUserData((void*)GMLSF_LINESTRING);
-      return result;
-      }catch(std::exception &excep)
-      {
-        //delete cl;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createLineString : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-    else if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
-    {
-      (*optional_child_index_or_count) = (uint32_t)cl->size();
-      delete cl;
-    }
-    else if((what_action == GET_NTH_CHILD) || (what_action == GET_NTH_POINT))
-    {
-      if((*optional_child_index_or_count) < cl->size())
-      {
-        Item  item_name;
-        Item  item_type;
-        zorba::Item   null_parent;
-        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Point");
-        NsBindings ns_binding;
-        ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
-        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-        *result_item = theModule->getItemFactory()->createElementNode(null_parent, item_name, item_type, false, false, ns_binding);
-
-
-        zorba::Item pos_item;
-        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "pos");
-        addNewLineIndentText(*result_item, 2);
-        pos_item = theModule->getItemFactory()->createElementNode(*result_item, item_name, item_type, false, false, ns_binding);
-
-        if(srs_dim == 3)
-        {
-          zorba::Item attr_value_item;
-          item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-          item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
-          char  strdim[10];
-          sprintf(strdim, "%d", srs_dim);
-          zorba::String   strvalue(strdim);
-          attr_value_item = theModule->getItemFactory()->createString(strvalue);
-          theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
-        }
-        char strtemp[100];
-        if(srs_dim == 3)
-        {
-          if(!ISNAN(cl->getAt((*optional_child_index_or_count)).z))
-            sprintf(strtemp, "%lf %lf %lf", cl->getAt((*optional_child_index_or_count)).x,
-                                          cl->getAt((*optional_child_index_or_count)).y,
-                                          cl->getAt((*optional_child_index_or_count)).z);
-          else
-            sprintf(strtemp, "%lf %lf 0", cl->getAt((*optional_child_index_or_count)).x,
-                                          cl->getAt((*optional_child_index_or_count)).y);
-        }
-        else
-        {
-          sprintf(strtemp, "%lf %lf", cl->getAt((*optional_child_index_or_count)).x,
-                                      cl->getAt((*optional_child_index_or_count)).y);
-        }
-
-        zorba::Item text_item;
-        text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
-        addNewLineIndentText(*result_item, 0);
-      }
-      delete cl;
-    }
-    else
-    {
-      delete cl;
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in GMLSF_LINESTRING";
-      throwError("InternalError", lErrorMessage.str());
-    }
-  }break;
-  case GMLSF_CURVE:
-  {  //not supported in GEOS; emulate through MultiLineString
-    zorba::Item   segments_item;
-    if(!getChild(lItem, "segments", "http://www.opengis.net/gml";, segments_item))
-    {//get upset
-      std::stringstream lErrorMessage;
-      lErrorMessage << "gml:Curve node must have a gml:segments child";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
-    {
-      (*optional_child_index_or_count) = 0;
-    }
-    unsigned int   child_nr = 0;
-    Iterator_t    segments_children;
-    Item          line_segment_item;
-    std::vector<geos::geom::Geometry*>    *segments_vector = NULL;
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      segments_vector = new std::vector<geos::geom::Geometry*>;
-    }
-    segments_children = segments_item.getChildren();
-    segments_children->open();
-    while(segments_children->next(line_segment_item))
-    {
-      if(line_segment_item.getNodeKind() != store::StoreConsts::elementNode)
-        continue;
-      Item    item_qname;
-      line_segment_item.getNodeName(item_qname);
-      String  item_namespace = item_qname.getNamespace();
-      if(item_namespace != "http://www.opengis.net/gml";)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:Curve/gml:segments must be of type gml:LineStringSegment only";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      String  local_name = item_qname.getLocalName();
-      if(local_name != "LineStringSegment")
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:Curve/gml:segments must be of type gml:LineStringSegment only";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      if(!checkOptionalAttribute(line_segment_item, "interpolation", "http://www.opengis.net/gml";, "linear"))
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "gml:Curve/gml:segments/gml:LineStringSegment supports only linear interpolation";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-  	
-      if(what_action == BUILD_GEOS_GEOMETRY)
-      {
-        segments_vector->push_back(buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim));
-      }
-      else if(what_action == COUNT_CHILDREN)
-      {
-        (*optional_child_index_or_count)++;
-      }
-      else if(what_action == GET_NUM_POINTS)
-      {
-        uint32_t    nr_points;
-        buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
-        (*optional_child_index_or_count) += nr_points;
-      }
-      else if(what_action == GET_NTH_CHILD)
-      {
-        if((*optional_child_index_or_count) == child_nr)
-        {
-          *result_item = line_segment_item;
-          return NULL;
-        }
-      }
-      else if(what_action == GET_NTH_POINT)
-      {
-        buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NTH_POINT, optional_child_index_or_count, result_item);
-        if(!result_item->isNull())
-          return NULL;
-        uint32_t    nr_points;
-        buildGeosGeometryFromItem(line_segment_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
-        (*optional_child_index_or_count) -= nr_points;
-      }
-      else
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GMLSF_CURVE";
-        throwError("InternalError", lErrorMessage.str());
-      }
-      child_nr++;
-   }
-
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-        result = get_geometryFactory()->createMultiLineString(segments_vector);
-        result->setUserData((void*)GMLSF_CURVE);
-        return result;
-      }catch(std::exception &excep)
-      {
-        std::vector<geos::geom::Geometry*>::iterator  vec_it;
-        for(vec_it = segments_vector->begin(); vec_it != segments_vector->end(); vec_it++)
-        {
-          delete (*vec_it);
-        }
-        delete segments_vector;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createGeometryCollection for gml:Curve: " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-  }break;
-  case GMLSF_LINEARRING:
-  {
-    geos::geom::CoordinateSequence *cl = NULL;//new geos::geom::CoordinateArraySequence();
-    readPosListCoordinates(lItem, cl, srs_dim);
-    uint32_t  last_index = (uint32_t)cl->size()-1;
-    if(what_action == GET_END_POINT)
-    {
-      optional_child_index_or_count = &last_index;
-      what_action = GET_NTH_POINT;
-    }
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-      result = get_geometryFactory()->createLinearRing(cl);
-      result->setUserData((void*)GMLSF_LINEARRING);
-      return result;
-      }catch(std::exception &excep)
-      {
-        //delete cl;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createLinearRing : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-    else if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
-    {
-      (*optional_child_index_or_count) = (uint32_t)cl->size();
-      delete cl;
-    }
-    else if((what_action == GET_NTH_CHILD) || (what_action == GET_NTH_POINT))
-    {
-      if((*optional_child_index_or_count) < cl->size())
-      {
-        Item  item_name;
-        Item  item_type;
-        zorba::Item   null_parent;
-        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Point");
-        NsBindings ns_binding;
-        ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
-        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-        *result_item = theModule->getItemFactory()->createElementNode(null_parent, item_name, item_type, false, false, ns_binding);
-
-        zorba::Item pos_item;
-        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "pos");
-        addNewLineIndentText(*result_item, 2);
-        pos_item = theModule->getItemFactory()->createElementNode(*result_item, item_name, item_type, false, false, ns_binding);
-
-        if(srs_dim == 3)
-        {
-          zorba::Item attr_value_item;
-          item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-          item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
-          char  strdim[10];
-          sprintf(strdim, "%d", srs_dim);
-          zorba::String   strvalue(strdim);
-          attr_value_item = theModule->getItemFactory()->createString(strvalue);
-          theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
-        }
-        char strtemp[100];
-        if(srs_dim == 3)
-        {
-          if(!ISNAN(cl->getAt((*optional_child_index_or_count)).z))
-            sprintf(strtemp, "%lf %lf %lf", cl->getAt((*optional_child_index_or_count)).x,
-                                          cl->getAt((*optional_child_index_or_count)).y,
-                                          cl->getAt((*optional_child_index_or_count)).z);
-          else
-            sprintf(strtemp, "%lf %lf 0", cl->getAt((*optional_child_index_or_count)).x,
-                                          cl->getAt((*optional_child_index_or_count)).y);
-        }
-        else
-        {
-          sprintf(strtemp, "%lf %lf", cl->getAt((*optional_child_index_or_count)).x,
-                                      cl->getAt((*optional_child_index_or_count)).y);
-        }
-
-        zorba::Item text_item;
-        text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
-        addNewLineIndentText(*result_item, 0);
-      }
-      delete cl;
-    }
-    else
-    {
-      delete cl;
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in GMLSF_LINEARRING";
-      throwError("InternalError", lErrorMessage.str());
-    }
-  }break;
-  case GMLSF_SURFACE:
-  {  //not supported in GEOS; emulate through MultiPolygon
-    zorba::Item   patches_item;
-    if(!getChild(lItem, "patches", "http://www.opengis.net/gml";, patches_item))
-    {//get upset
-      std::stringstream lErrorMessage;
-      lErrorMessage << "gml:Surface node must have a gml:patches child";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    if(what_action == COUNT_CHILDREN)
-    {
-      (*optional_child_index_or_count) = 0;
-    }
-    unsigned int   child_nr = 0;
-    Iterator_t    patches_children;
-    Item          polygon_patch_item;
-    std::vector<geos::geom::Geometry*>    *polygon_vector = NULL;
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      polygon_vector = new std::vector<geos::geom::Geometry*>;
-    }
-    patches_children = patches_item.getChildren();
-    patches_children->open();
-    while(patches_children->next(polygon_patch_item))
-    {
-      if(polygon_patch_item.getNodeKind() != store::StoreConsts::elementNode)
-        continue;
-      Item    item_qname;
-      polygon_patch_item.getNodeName(item_qname);
-      String  item_namespace = item_qname.getNamespace();
-      if(item_namespace != "http://www.opengis.net/gml";)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:Surface/gml:patches must be of type gml:PolygonPatch only";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      String  item_name = item_qname.getLocalName();
-      if(item_name != "PolygonPatch")
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:Surface/gml:patches must be of type gml:PolygonPatch only";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-
-      if(what_action == BUILD_GEOS_GEOMETRY)
-      {
-        polygon_vector->push_back(buildGeosGeometryFromItem(polygon_patch_item, GMLSF_POLYGON, srs_dim));
-      }
-      else if(what_action == COUNT_CHILDREN)
-      {
-        (*optional_child_index_or_count)++;
-      }
-      else if(what_action == GET_NTH_CHILD)
-      {
-        if((*optional_child_index_or_count) == child_nr)
-        {
-          *result_item = polygon_patch_item;
-          return NULL;
-        }
-      }
-      else
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GMLSF_CURVE";
-        throwError("InternalError", lErrorMessage.str());
-      }
-      child_nr++;
-    }
-
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-        result = get_geometryFactory()->createMultiPolygon(polygon_vector);
-        result->setUserData((void*)GMLSF_SURFACE);
-        return result;
-      }catch(std::exception &excep)
-      {
-        std::vector<geos::geom::Geometry*>::iterator  vec_it;
-        for(vec_it = polygon_vector->begin(); vec_it != polygon_vector->end(); vec_it++)
-        {
-          delete (*vec_it);
-        }
-        delete polygon_vector;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createGeometryCollection for gml:Surface : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-  }break;
-  case GMLSF_POLYGON:
-  {
-    Iterator_t    polygon_children;
-    Item          extint_item;
-    unsigned int           nr_child = 0;
-    geos::geom::LinearRing    *exterior = NULL;
-    std::vector<geos::geom::Geometry*>    *interior_vector = NULL;
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      interior_vector = new std::vector<geos::geom::Geometry*>;
-    }
-    else if(what_action == COUNT_CHILDREN)
-    {
-      (*optional_child_index_or_count) = 0;
-    }
-    polygon_children = lItem.getChildren();
-    polygon_children->open();
-    while(polygon_children->next(extint_item))
-    {
-      if(extint_item.getNodeKind() != store::StoreConsts::elementNode)
-        continue;
-      Item    item_qname;
-      extint_item.getNodeName(item_qname);
-      String  item_namespace = item_qname.getNamespace();
-      if(item_namespace != "http://www.opengis.net/gml";)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:Polygon must be gml:exterior or gml:interior";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      String  item_name = item_qname.getLocalName();
-      if(nr_child == 0)
-      {
-        if(item_name != "exterior")
-        {
-          std::stringstream lErrorMessage;
-          lErrorMessage << "First child of gml:Polygon must be gml:exterior";
-          throwError("UnrecognizedGeoObject", lErrorMessage.str());
-        }
-        zorba::Item   linearring_item;
-        if(!getChild(extint_item, "LinearRing", "http://www.opengis.net/gml";, linearring_item))
-        {//get upset
-          std::stringstream lErrorMessage;
-          lErrorMessage << "gml:Polygon/gml:exterior node must have a gml:LinearRing child";
-          throwError("UnrecognizedGeoObject", lErrorMessage.str());
-        }
-        if(what_action == BUILD_GEOS_GEOMETRY)
-        {
-          exterior = dynamic_cast<geos::geom::LinearRing*>(buildGeosGeometryFromItem(linearring_item, GMLSF_LINEARRING, srs_dim));
-        }
-        else if(what_action == GET_EXTERIOR_RING)
-        {
-          *result_item = linearring_item;
-          return NULL;
-        }
-      }
-      else
-      {
-        if(item_name != "interior")
-        {
-          std::stringstream lErrorMessage;
-          lErrorMessage << "Non-first child of gml:Polygon must be gml:interior";
-          throwError("UnrecognizedGeoObject", lErrorMessage.str());
-        }
-        zorba::Item   linearring_item;
-        if(!getChild(extint_item, "LinearRing", "http://www.opengis.net/gml";, linearring_item))
-        {//get upset
-          std::stringstream lErrorMessage;
-          lErrorMessage << "gml:Polygon/gml:interior node must have a gml:LinearRing child";
-          throwError("UnrecognizedGeoObject", lErrorMessage.str());
-        }
-        if(what_action == BUILD_GEOS_GEOMETRY)
-        {
-          interior_vector->push_back(buildGeosGeometryFromItem(linearring_item, GMLSF_LINEARRING, srs_dim));
-        }
-        else if(what_action == COUNT_CHILDREN)
-        {
-          (*optional_child_index_or_count)++;
-        }
-        else if(what_action == GET_NTH_CHILD)
-        {
-          if((*optional_child_index_or_count) == (nr_child-1))
-          {
-            *result_item = linearring_item;
-            return NULL;
-          }
-        }
-        else
-        {
-          std::stringstream lErrorMessage;
-          lErrorMessage << "Error in GMLSF_POLYGON";
-          throwError("InternalError", lErrorMessage.str());
-        }
-      }
-      nr_child++;
-    }
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-      result = get_geometryFactory()->createPolygon(exterior, interior_vector);
-      result->setUserData((void*)GMLSF_POLYGON);
-      return result;
-      }catch(std::exception &excep)
-      {
-        delete exterior;
-        std::vector<geos::geom::Geometry*>::iterator  vec_it;
-        for(vec_it = interior_vector->begin(); vec_it != interior_vector->end(); vec_it++)
-        {
-          delete (*vec_it);
-        }
-        delete interior_vector;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createPolygon : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-  }break;
-  case GMLSF_MULTIPOINT:
-  {
-    Iterator_t    multipoint_children;
-    Item          point_item;
-    std::vector<geos::geom::Geometry*>    *point_vector = NULL;
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      point_vector = new std::vector<geos::geom::Geometry*>;
-    }
-    else if(what_action == COUNT_CHILDREN)
-    {
-      (*optional_child_index_or_count) = 0;
-    }
-    unsigned int nr_child = 0;
-    multipoint_children = lItem.getChildren();
-    multipoint_children->open();
-    while(multipoint_children->next(point_item))
-    {
-      if(point_item.getNodeKind() != store::StoreConsts::elementNode)
-        continue;
-      Item    item_qname;
-      point_item.getNodeName(item_qname);
-      String  item_namespace = item_qname.getNamespace();
-      if(item_namespace != "http://www.opengis.net/gml";)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:MultiPoint must be gml:Point";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      String  item_name = item_qname.getLocalName();
-      if(item_name != "Point")
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "First child of gml:MultiPoint must be gml:Point";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      if(what_action == BUILD_GEOS_GEOMETRY)
-      {
-        point_vector->push_back(buildGeosGeometryFromItem(point_item, GMLSF_POINT, srs_dim));
-      }
-      else if(what_action == COUNT_CHILDREN)
-      {
-        (*optional_child_index_or_count)++;
-      }
-      else if(what_action == GET_NTH_CHILD)
-      {
-        if((*optional_child_index_or_count) == nr_child)
-        {
-          *result_item = point_item;
-          return NULL;
-        }
-      }
-      else
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GMLSF_MULTIPOINT";
-        throwError("InternalError", lErrorMessage.str());
-      }
-      nr_child++;
-    }
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-      result = get_geometryFactory()->createMultiPoint(point_vector);
-      result->setUserData((void*)GMLSF_MULTIPOINT);
-      return result;
-      }catch(std::exception &excep)
-      {
-        std::vector<geos::geom::Geometry*>::iterator  vec_it;
-        for(vec_it = point_vector->begin(); vec_it != point_vector->end(); vec_it++)
-        {
-          delete (*vec_it);
-        }
-        delete point_vector;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createMultiPoint : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-  }break;
-  case GMLSF_MULTICURVE:
-  {
-    Iterator_t    multicurve_children;
-    Item          curve_item;
-    std::vector<geos::geom::Geometry*>    *curve_vector = NULL;
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      curve_vector = new std::vector<geos::geom::Geometry*>;
-    }
-    else if((what_action == COUNT_CHILDREN) || (what_action == GET_NUM_POINTS))
-    {
-      (*optional_child_index_or_count) = 0;
-    }
-    unsigned int nr_child = 0;
-    multicurve_children = lItem.getChildren();
-    multicurve_children->open();
-    while(multicurve_children->next(curve_item))
-    {
-      if(curve_item.getNodeKind() != store::StoreConsts::elementNode)
-        continue;
-      Item    item_qname;
-      curve_item.getNodeName(item_qname);
-      String  item_namespace = item_qname.getNamespace();
-      if(item_namespace != "http://www.opengis.net/gml";)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:MultiCurve must be gml:LineString";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      String  item_name = item_qname.getLocalName();
-      if(item_name != "LineString")
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:MultiCurve must be gml:LineString";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      if(what_action == BUILD_GEOS_GEOMETRY)
-      {
-        curve_vector->push_back(buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim));
-      }
-      else if(what_action == COUNT_CHILDREN)
-      {
-        (*optional_child_index_or_count)++;
-      }
-      else if(what_action == GET_NUM_POINTS)
-      {
-        uint32_t  nr_points;
-        buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
-        (*optional_child_index_or_count) += nr_points;
-      }
-      else if(what_action == GET_NTH_CHILD)
-      {
-        if((*optional_child_index_or_count) == nr_child)
-        {
-          *result_item = curve_item;
-          return NULL;
-        }
-      }
-      else if(what_action == GET_NTH_POINT)
-      {
-        buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NTH_POINT, optional_child_index_or_count, result_item);
-        if(!result_item->isNull())
-          return NULL;
-        uint32_t  nr_points;
-        buildGeosGeometryFromItem(curve_item, GMLSF_LINESTRING, srs_dim, NULL, GET_NUM_POINTS, &nr_points);
-        (*optional_child_index_or_count) -= nr_points;
-      }
-      else
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GMLSF_MULTICURVE";
-        throwError("InternalError", lErrorMessage.str());
-      }
-      nr_child++;
-    }
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-      result = get_geometryFactory()->createMultiLineString(curve_vector);
-      result->setUserData((void*)GMLSF_MULTICURVE);
-      return result;
-      }catch(std::exception &excep)
-      {
-        std::vector<geos::geom::Geometry*>::iterator  vec_it;
-        for(vec_it = curve_vector->begin(); vec_it != curve_vector->end(); vec_it++)
-        {
-          delete (*vec_it);
-        }
-        delete curve_vector;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createMultiLineString : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-  }break;
-  case GMLSF_MULTISURFACE:
-  {
-    Iterator_t    multisurface_children;
-    Item          surface_item;
-    std::vector<geos::geom::Geometry*>    *surface_vector = NULL;
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      surface_vector = new std::vector<geos::geom::Geometry*>;
-    }
-    else if(what_action == COUNT_CHILDREN)
-    {
-      (*optional_child_index_or_count) = 0;
-    }
-    unsigned int nr_child = 0;
-    multisurface_children = lItem.getChildren();
-    multisurface_children->open();
-    while(multisurface_children->next(surface_item))
-    {
-      if(surface_item.getNodeKind() != store::StoreConsts::elementNode)
-        continue;
-      Item    item_qname;
-      surface_item.getNodeName(item_qname);
-      String  item_namespace = item_qname.getNamespace();
-      if(item_namespace != "http://www.opengis.net/gml";)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:MultiSurface must be gml:Polygon";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      String  item_name = item_qname.getLocalName();
-      if(item_name != "Polygon")
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:MultiSurface must be gml:Polygon";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      if(what_action == BUILD_GEOS_GEOMETRY)
-      {
-        surface_vector->push_back(buildGeosGeometryFromItem(surface_item, GMLSF_POLYGON, srs_dim));
-      }
-      else if(what_action == COUNT_CHILDREN)
-      {
-        (*optional_child_index_or_count)++;
-      }
-      else if(what_action == GET_NTH_CHILD)
-      {
-        if((*optional_child_index_or_count) == nr_child)
-        {
-          *result_item = surface_item;
-          return NULL;
-        }
-      }
-      else
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GMLSF_MULTICURVE";
-        throwError("InternalError", lErrorMessage.str());
-      }
-      nr_child++;
-    }
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-      result = get_geometryFactory()->createMultiPolygon(surface_vector);
-      result->setUserData((void*)GMLSF_MULTISURFACE);
-      return result;
-      }catch(std::exception &excep)
-      {
-        std::vector<geos::geom::Geometry*>::iterator  vec_it;
-        for(vec_it = surface_vector->begin(); vec_it != surface_vector->end(); vec_it++)
-        {
-          delete (*vec_it);
-        }
-        delete surface_vector;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createMultiPolygon : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-  }break;
-  case GMLSF_MULTIGEOMETRY:
-  {
-    Iterator_t    multigeometry_children;
-    Item          geometry_item;
-    std::vector<geos::geom::Geometry*>    *geometry_vector = NULL;
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      geometry_vector = new std::vector<geos::geom::Geometry*>;
-    }
-    else if(what_action == COUNT_CHILDREN)
-    {
-      (*optional_child_index_or_count) = 0;
-    }
-    unsigned int nr_child = 0;
-    multigeometry_children = lItem.getChildren();
-    multigeometry_children->open();
-    while(multigeometry_children->next(geometry_item))
-    {
-      if(geometry_item.getNodeKind() != store::StoreConsts::elementNode)
-        continue;
-      Item    item_qname;
-      geometry_item.getNodeName(item_qname);
-      String  item_namespace = item_qname.getNamespace();
-      if(item_namespace != "http://www.opengis.net/gml";)
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:MultiGeometry must be gml:geometryMember or gml:geometryMembers";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-      String  item_name = item_qname.getLocalName();
-      if(item_name == "geometryMember" || item_name == "geometryMembers")
-      {
-        Iterator_t    member_children;
-        Item          member_item;
-        member_children = geometry_item.getChildren();
-        member_children->open();
-        while(member_children->next(member_item))
-        {
-          if(what_action == BUILD_GEOS_GEOMETRY)
-          {
-            geometry_vector->push_back(buildGeosGeometryFromItem(member_item, getGmlSFGeometricType(member_item), srs_dim));
-          }
-          else if(what_action == COUNT_CHILDREN)
-          {
-            (*optional_child_index_or_count)++;
-          }
-          else if(what_action == GET_NTH_CHILD)
-          {
-            if((*optional_child_index_or_count) == nr_child)
-            {
-              *result_item = member_item;
-              return NULL;
-            }
-          }
-          else
-          {
-            std::stringstream lErrorMessage;
-            lErrorMessage << "Error in GMLSF_MULTIGEOMETRY";
-            throwError("InternalError", lErrorMessage.str());
-          }
-          nr_child++;
-        }
-      }
-      else
-      {
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Children of gml:MultiGeometry must be gml:geometryMember or gml:geometryMembers";
-        throwError("UnrecognizedGeoObject", lErrorMessage.str());
-      }
-    }
-    if(what_action == BUILD_GEOS_GEOMETRY)
-    {
-      try{
-        result = get_geometryFactory()->createGeometryCollection(geometry_vector);
-        result->setUserData((void*)GMLSF_MULTIGEOMETRY);
-        return result;
-      }catch(std::exception &excep)
-      {
-        std::vector<geos::geom::Geometry*>::iterator  vec_it;
-        for(vec_it = geometry_vector->begin(); vec_it != geometry_vector->end(); vec_it++)
-        {
-          delete (*vec_it);
-        }
-        delete geometry_vector;
-        std::stringstream lErrorMessage;
-        lErrorMessage << "Error in GEOS function createGeometryCollection : " << excep.what();
-        throwError("GEOSError", lErrorMessage.str());
-      }
-    }
-  }break;
-  case GMLSF_INVALID:
-  default:
-  {
-    std::stringstream lErrorMessage;
-    zorba::Item item_qname;
-    lItem.getNodeName(item_qname);
-    lErrorMessage << "Unrecognized geometric type for element "
-         << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  break;
-  }
-
-  return NULL;
-}
-
-void GeoFunction::addNewLineIndentText(zorba::Item &parent, unsigned int indent) const
-{
-/*  zorba::Item text_item;
-  if(indent > 100)
-    indent = 100;
-  char *strtemp;
-  strtemp = new char[indent+10];
-  strtemp[0] = '\n';
-  memset(strtemp+1, ' ', indent);
-  strtemp[1+indent] = 0;
-  text_item = theModule->getItemFactory()->createTextNode(parent, strtemp);
-  delete[] strtemp;
-*/
-}
-
-void GeoFunction::appendIndent(char *&strtemp2, unsigned int indent) const
-{
-  strtemp2[0] = '\n';
-  memset(strtemp2+1, ' ', indent);
-  strtemp2 += indent+1;
-  strtemp2[0] = 0;
-}
-
-zorba::Item GeoFunction::getGMLItemFromGeosGeometry(zorba::Item &parent,
-                                                    const geos::geom::Geometry *geos_geometry,
-                                                    const zorba::Item *srs_uri,
-                                                    unsigned int indent,
-                                                    const char *tag_name,
-                                                    bool dont_check_for_curve_surface
-                                                    ) const
-{
-  zorba::Item   result_item;
-  zorba::Item   item_name;
-  zorba::Item   item_type;
-  NsBindings ns_binding;
-  ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
-  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-
-  if(!parent.isNull())
-    addNewLineIndentText(parent, indent);
-
-  switch(geos_geometry->getGeometryTypeId())
-  {
-  case 	geos::geom::GEOS_POINT:
-  {
-    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Point");
-    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-
-    zorba::Item pos_item;
-    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "pos");
-    addNewLineIndentText(result_item, indent+2);
-    pos_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
-
-    char strtemp[100];
-    const geos::geom::Coordinate  *c;
-    c = geos_geometry->getCoordinate();
-#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
-    if(geos_geometry->getCoordinateDimension() == 3)
-#else
-    if(getCoordinateDimension(geos_geometry) == 3)
-#endif
-    {
-      zorba::Item attr_value_item;
-      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
-      zorba::String   strvalue("3");
-      attr_value_item = theModule->getItemFactory()->createString(strvalue);
-      theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
-      if(!ISNAN(c->z))
-        sprintf(strtemp, "%lf %lf %lf", c->x, c->y, c->z);
-      else
-        sprintf(strtemp, "%lf %lf 0", c->x, c->y);
-    }
-    else
-      sprintf(strtemp, "%lf %lf", c->x, c->y);
-
-    zorba::Item text_item;
-    text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
-    addNewLineIndentText(result_item, indent);
-    break;
-  }
-	/// a linestring
-  case geos::geom::GEOS_LINESTRING:
-	/// a linear ring (linestring with 1st point == last point)
-  case geos::geom::GEOS_LINEARRING:
-  {
-    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml",
-      tag_name ? tag_name : ((geos_geometry->getGeometryTypeId() == geos::geom::GEOS_LINESTRING) ? "LineString" : "LinearRing"));
-    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-
-    zorba::Item pos_item;
-    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "posList");
-    addNewLineIndentText(result_item, indent+2);
-    pos_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
-
-#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
-    int coord_dim = geos_geometry->getCoordinateDimension();
-#else
-    int coord_dim = getCoordinateDimension(geos_geometry);
-#endif
-    if(coord_dim == 3)
-    {
-      zorba::Item attr_value_item;
-      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "srsDimension");
-      zorba::String   strvalue("3");
-      attr_value_item = theModule->getItemFactory()->createString(strvalue);
-      theModule->getItemFactory()->createAttributeNode(pos_item, item_name, item_type, attr_value_item);
-    }
-    char *strtemp;
-    std::auto_ptr<geos::geom::CoordinateSequence>  cs;
-    cs.reset(geos_geometry->getCoordinates());
-    size_t    cs_size = cs->getSize();
-    strtemp = (char*)malloc((50+indent)*(cs_size+1) + 1);
-    strtemp[0] = 0;
-    char  *strtemp2 = strtemp;
-    for(size_t i=0;i<cs_size;i++)
-    {
-      appendIndent(strtemp2, indent+4);
-      if(coord_dim == 3)
-      {
-        if(!ISNAN(cs->getAt(i).z))
-          sprintf(strtemp2, "%lf %lf %lf", cs->getAt(i).x, cs->getAt(i).y, cs->getAt(i).z);
-        else
-          sprintf(strtemp2, "%lf %lf 0", cs->getAt(i).x, cs->getAt(i).y);
-      }
-      else
-        sprintf(strtemp2, "%lf %lf", cs->getAt(i).x, cs->getAt(i).y);
-      strtemp2 += strlen(strtemp2);
-    }
-
-    if(cs_size)
-    {
-      appendIndent(strtemp2, indent+2);
-      zorba::Item text_item;
-      text_item = theModule->getItemFactory()->createTextNode(pos_item, strtemp);
-      addNewLineIndentText(result_item, indent);
-    }
-    free(strtemp);
-    break;
-  }
-	/// a polygon
-  case geos::geom::GEOS_POLYGON:
-  {
-    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", tag_name ? tag_name : "Polygon");
-    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-
-    const geos::geom::LineString*   exterior_ring;
-    const geos::geom::Polygon   *polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry);
-    exterior_ring = polygon->getExteriorRing();
-    if(exterior_ring)
-    {
-      zorba::Item exterior_item;
-      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "exterior");
-      addNewLineIndentText(result_item, indent+2);
-      exterior_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
-      getGMLItemFromGeosGeometry(exterior_item, exterior_ring, NULL, indent+4);
-      addNewLineIndentText(exterior_item, indent+2);
-    }
-    size_t interior_rings = polygon->getNumInteriorRing();
-    for(size_t i=0;i<interior_rings;i++)
-    {
-      const geos::geom::LineString*   interior_ring;
-      interior_ring = polygon->getInteriorRingN(i);
-
-      zorba::Item interior_item;
-      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "interior");
-      addNewLineIndentText(result_item, indent+2);
-      interior_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
-      getGMLItemFromGeosGeometry(interior_item, interior_ring, NULL, indent+4);
-      addNewLineIndentText(interior_item, indent+2);
-    }
-    if(exterior_ring || interior_rings)
-      addNewLineIndentText(result_item, indent);
-    break;
-  }
-	/// a collection of points
-  case geos::geom::GEOS_MULTIPOINT:
-  {
-    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiPoint");
-    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-
-    size_t    nr_geoms = geos_geometry->getNumGeometries();
-    for(size_t i=0;i<nr_geoms;i++)
-    {
-      const geos::geom::Geometry  *point;
-      point = geos_geometry->getGeometryN(i);
-      getGMLItemFromGeosGeometry(result_item, point, NULL, indent+2);
-    }
-    if(nr_geoms)
-      addNewLineIndentText(result_item, indent);
-    break;
-  }
-	/// a collection of linestrings
-  case geos::geom::GEOS_MULTILINESTRING:
-  {
-    const geos::geom::MultiLineString *multiline = dynamic_cast<const geos::geom::MultiLineString*>(geos_geometry);
-    if(!dont_check_for_curve_surface && isCurve(multiline))
-    {
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Curve");
-      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-      zorba::Item segments_item;
-      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "segments");
-      addNewLineIndentText(result_item, indent+2);
-      segments_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
-
-      size_t    nr_geoms = multiline->getNumGeometries();
-      for(size_t i=0;i<nr_geoms;i++)
-      {
-        const geos::geom::Geometry  *linestring;
-        linestring = multiline->getGeometryN(i);
-
-        zorba::Item   linestring_item;
-        linestring_item = getGMLItemFromGeosGeometry(segments_item, linestring, NULL, indent+4, "LineStringSegment");
-
-        zorba::Item attr_value_item;
-        item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-        item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "interpolation");
-        zorba::String   strvalue("liniar");
-        attr_value_item = theModule->getItemFactory()->createString(strvalue);
-        theModule->getItemFactory()->createAttributeNode(linestring_item, item_name, item_type, attr_value_item);
-      }
-      if(nr_geoms)
-        addNewLineIndentText(segments_item, indent+2);
-      addNewLineIndentText(result_item, indent);
-    }
-    else
-    {
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiCurve");
-      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-
-      size_t    nr_geoms = geos_geometry->getNumGeometries();
-      for(size_t i=0;i<nr_geoms;i++)
-      {
-        const geos::geom::Geometry  *linestring;
-        linestring = geos_geometry->getGeometryN(i);
-        getGMLItemFromGeosGeometry(result_item, linestring, NULL, indent+2);
-      }
-      if(nr_geoms)
-        addNewLineIndentText(result_item, indent);
-    }
-    break;
-  }
-	/// a collection of polygons
-  case geos::geom::GEOS_MULTIPOLYGON:
-  {
-    const geos::geom::MultiPolygon *multipoly = dynamic_cast<const geos::geom::MultiPolygon*>(geos_geometry);
-    if(!dont_check_for_curve_surface && isSurface(multipoly))
-    {
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Surface");
-      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-      zorba::Item patches_item;
-      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "patches");
-      addNewLineIndentText(result_item, indent+2);
-      patches_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
-
-      size_t    nr_geoms = multipoly->getNumGeometries();
-      for(size_t i=0;i<nr_geoms;i++)
-      {
-        const geos::geom::Geometry  *polygon;
-        polygon = multipoly->getGeometryN(i);
-
-        zorba::Item   polygon_item;
-        polygon_item = getGMLItemFromGeosGeometry(patches_item, polygon, NULL, indent+4, "PolygonPatch");
-      }
-      if(nr_geoms)
-        addNewLineIndentText(patches_item, indent+2);
-      addNewLineIndentText(result_item, indent);
-    }
-    else
-    {
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiSurface");
-      result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-
-      size_t    nr_geoms = geos_geometry->getNumGeometries();
-      for(size_t i=0;i<nr_geoms;i++)
-      {
-        const geos::geom::Geometry  *polygon;
-        polygon = geos_geometry->getGeometryN(i);
-        getGMLItemFromGeosGeometry(result_item, polygon, NULL, indent+2);
-      }
-      if(nr_geoms)
-        addNewLineIndentText(result_item, indent);
-    }
-    break;
-  }
-	/// a collection of heterogeneus geometries
-  case geos::geom::GEOS_GEOMETRYCOLLECTION:
-  {
-    size_t    nr_geoms = geos_geometry->getNumGeometries();
-    if(!nr_geoms)
-      break;
-    item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "MultiGeometry");
-    result_item = theModule->getItemFactory()->createElementNode(parent, item_name, item_type, false, false, ns_binding);
-
-    for(size_t i=0;i<nr_geoms;i++)
-    {
-      zorba::Item geometryMember_item;
-      item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-      item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "geometryMember");
-      addNewLineIndentText(result_item, indent+2);
-      geometryMember_item = theModule->getItemFactory()->createElementNode(result_item, item_name, item_type, false, false, ns_binding);
-      const geos::geom::Geometry  *member;
-      member = geos_geometry->getGeometryN(i);
-
-      zorba::Item   geometry_item;
-      geometry_item = getGMLItemFromGeosGeometry(geometryMember_item, member, NULL, indent+4 );
-      if(!geometry_item.isNull())
-        addNewLineIndentText(geometryMember_item, indent+2);
-    }
-    if(nr_geoms)
-      addNewLineIndentText(result_item, indent);
-    break;
-  }
-  default:
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Geometry type " << geos_geometry->getGeometryType() << " is not supported";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  }
-
-  if(!result_item.isNull() && srs_uri && !srs_uri->isNull())
-  {
-    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-    item_name = theModule->getItemFactory()->createQName("", "srsName");
-    zorba::String   strvalue = srs_uri->getStringValue();
-    zorba::Item attr_value_item = theModule->getItemFactory()->createString(strvalue);
-    theModule->getItemFactory()->createAttributeNode(result_item, item_name, item_type, attr_value_item);
-  }
-
-//  if(!parent.isNull())
-//    addNewLineIndentText(parent, indent);
-  return result_item;
-}
-
-/*see if the end point from one segment is the start point for the next segment*/
-bool GeoFunction::isCurve(const geos::geom::MultiLineString *multiline) const
-{
-  geos::geom::MultiLineString::const_iterator line_it;
-  std::auto_ptr<geos::geom::Point> end_point;
-  for(line_it = multiline->begin(); line_it != multiline->end(); line_it++)
-  {
-    const geos::geom::LineString   *linestring = dynamic_cast<const geos::geom::LineString*>(*line_it);
-    if(end_point.get())
-    {
-      std::auto_ptr<geos::geom::Point> start_point;
-      start_point.reset(linestring->getStartPoint());
-      if(start_point->compareTo(end_point.get()))
-        return false;
-    }
-    end_point.reset(linestring->getEndPoint());
-  }
-  return true;
-}
-
-bool GeoFunction::isClosedCurve(const geos::geom::Geometry *geos_geometry) const
-{
-  //Curve is a MultiLineString
-  const geos::geom::MultiLineString *curve = dynamic_cast<const geos::geom::MultiLineString *>(geos_geometry);
-  unsigned int num_segments = (unsigned int)curve->getNumGeometries();
-  if(!num_segments)
-    return false;
-  unsigned int i;
-  //see if last point of a segment is the first of the next
-  const geos::geom::LineString *segment1 = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(0));
-  std::auto_ptr<const geos::geom::CoordinateSequence> coords1(segment1->getCoordinates());
-  const geos::geom::LineString *segment2;
-  std::auto_ptr<const geos::geom::CoordinateSequence> coords2;
-  for(i=1;i<num_segments;i++)
-  {
-    segment2 = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(i));
-    coords2.reset(segment2->getCoordinates());
-    if(coords1->getAt(coords1->size()-1) != coords2->getAt(0))
-      return false;
-    coords1 = coords2;
-    segment1 = segment2;
-  }
-  //check if last point is the same as the first point of the curve
-  segment2 = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(0));
-  coords2.reset(segment2->getCoordinates());
-  if(coords1->getAt(coords1->size()-1) != coords2->getAt(0))
-    return false;
-
-  return true;
-}
-
-geos::geom::LineString *GeoFunction::curveToLineString(const geos::geom::Geometry *geos_geometry) const
-{
-  const geos::geom::MultiLineString *curve = dynamic_cast<const geos::geom::MultiLineString *>(geos_geometry);
-  if(!isCurve(curve))
-    return NULL;
-  unsigned int num_segments = (unsigned int)curve->getNumGeometries();
-  if(!num_segments)
-    return NULL;
-  const geos::geom::LineString *segment;
-  std::auto_ptr<const geos::geom::CoordinateSequence> coords;
-  geos::geom::CoordinateSequence *linestring_coords = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, 2);
-  unsigned int i;
-  for(i=0;i<num_segments;i++)
-  {
-    segment = dynamic_cast<const geos::geom::LineString *>(curve->getGeometryN(i));
-    coords.reset(segment->getCoordinates());
-    linestring_coords->add(coords.get(), true, true);
-  }
-  geos::geom::LineString *linestring = get_geometryFactory()->createLineString(linestring_coords);
-  linestring->setUserData((void*)GMLSF_LINESTRING);
-
-  return linestring;
-}
-
-bool GeoFunction::isRingCurve(const geos::geom::Geometry *geos_geometry) const
-{
-  geos::geom::LineString *linestring;
-  linestring = curveToLineString(geos_geometry);
-  if(!linestring)
-    return false;
-  //use GEOS
-  bool retval;
-  retval = linestring->isRing();
-  delete linestring;
-
-  return retval;
-}
-
-bool GeoFunction::isSimpleCurve(const geos::geom::Geometry *geos_geometry) const
-{
-  geos::geom::LineString *linestring;
-  linestring = curveToLineString(geos_geometry);
-  if(!linestring)
-    return false;
-  //use GEOS
-  bool retval;
-  retval = linestring->isSimple();
-  delete linestring;
-
-  return retval;
-}
-
-/*see if each polygon touches another polygon by at least a segment of external line and they are all connected together*/
-bool GeoFunction::isSurface(const geos::geom::MultiPolygon *multipolygon,
-                            bool *is_closed,
-                            geos::geom::LinearRing **exterior_boundary) const
-{
-/*
-  struct _tline
-  {
-    double x1, y1, x2, y2;
-    //bool taken;
-  };
-  struct _tpoly
-  {
-    std::vector<struct _tline> lines;
-    bool processed, touched;
-  };
-  std::vector<struct _tpoly>  polys;
-  int p = 0;
-  //init the data
-  if(!multipolygon->getNumGeometries())
-    return false;
-  polys.reserve(multipolygon->getNumGeometries());
-  geos::geom::MultiPolygon::const_iterator poly_it;
-  for(poly_it = multipolygon->begin(); poly_it != multipolygon->end(); poly_it++, p++)
-  {
-    polys[p].processed = false;
-    polys[p].touched = false;
-    const geos::geom::Polygon   *polygon = dynamic_cast<const geos::geom::Polygon*>(*poly_it);
-    const geos::geom::LineString*   exterior_ring;
-    int l, nr_points;
-    const geos::geom::Point *point;
-    exterior_ring = polygon->getExteriorRing();
-    nr_points = exterior_ring->getNumPoints();
-    polys[p].lines.reserve(nr_points);
-    for(l=0; l<nr_points; l++)
-    {
-      point = dynamic_cast<const geos::geom::Point*>(exterior_ring->getGeometryN(l));
-      //polys[p].lines[l].taken = false;
-      polys[p].lines[l].x1 = point->getX();
-      polys[p].lines[l].y1 = point->getY();
-      if(l)
-      {
-        polys[p].lines[l-1].x2 = point->getX();
-        polys[p].lines[l-1].y2 = point->getY();
-      }
-      else
-      {
-        polys[p].lines[nr_points-1].x2 = point->getX();
-        polys[p].lines[nr_points-1].y2 = point->getY();
-      }
-    }
-  }
-
-  //now check
-  std::vector<struct _tpoly>::iterator  tpoly_it;
-  bool first_round = true;
-  while(1)
-  {
-    if(first_round)
-      tpoly_it = polys.begin();
-    else
-    {
-      int total = 0;
-      int processed = 0;
-      for(tpoly_it = polys.begin(); tpoly_it != polys.end(); tpoly_it++)
-      {
-        total++;
-        if((*tpoly_it).processed)
-          processed++;
-        else if((*tpoly_it).touched)
-          break;
-      }
-      if(tpoly_it == polys.end())
-      {
-        if(total == processed)
-          return true;
-        else
-          return false;
-      }
-    }
-    first_round = false;
-    (*tpoly_it).processed = true;
-    //for every line, check there is at most one match with other line from other polygon
-    std::vector<struct _tline>::iterator line_it;
-    int all_matches = 0;
-    for(line_it = (*tpoly_it).lines.begin(); line_it != (*tpoly_it).lines.end(); line_it++)
-    {
-      int matches = 0;
-      std::vector<struct _tpoly>::iterator  tpoly_it2;
-      for(tpoly_it2 = polys.begin(); tpoly_it2 != polys.end(); tpoly_it2++)
-      {
-        if((*tpoly_it2).processed)
-          continue;
-        std::vector<struct _tline>::iterator line_it2;
-        for(line_it2 = (*tpoly_it2).lines.begin(); line_it2 != (*tpoly_it2).lines.end(); line_it2++)
-        {
-          if(((*line_it2).x1 == (*line_it).x1) && ((*line_it2).y1 == (*line_it).y1) &&
-            ((*line_it2).x2 == (*line_it).x2) && ((*line_it2).y2 == (*line_it).y2) ||
-            ((*line_it2).x1 == (*line_it).x2) && ((*line_it2).y1 == (*line_it).y2) &&
-            ((*line_it2).x2 == (*line_it).x1) && ((*line_it2).y2 == (*line_it).y1))
-          {
-            (*tpoly_it2).touched = true;
-            matches++;
-          }
-        }
-      }
-      if(matches > 1)
-        return false;
-      all_matches += matches;
-    }
-    if(!all_matches)
-      return false;
-  }
-  return true;
-*/
-
-  //another approach, using LineString::overlaps and LineString::intersection
-  //test each polygon if it touches another polygon and if they form a united surface
-  //all common boundaries should be disjoint
-
-  std::vector<int>    ids;
-  unsigned int i;
-  unsigned int nr_patches = (unsigned int)multipolygon->getNumGeometries();
-  if(!nr_patches)
-    return false;
-  ids.resize(nr_patches);
-  for(i=0;i<nr_patches;i++)
-  {
-    ids[i] = 1;//will be set -i-1 if it is touched by another polygon, and to zero when processed
-  }
-
-  if(is_closed)
-    *is_closed = true;
-  if(exterior_boundary)
-    *exterior_boundary = NULL;
-
-  std::vector<geos::geom::Geometry*> boundary_segments;//for computing exterior_boundary
-  bool is_united;
-
-  ids[0] = -1;
-  while(1)
-  {
-    is_united = true;
-    for(i=0;i<nr_patches;i++)
-      if(ids[i] > 0)
-        is_united = false;
-      else if(ids[i] < 0)
-        break;
-    if(i == nr_patches)
-      break;
-    ids[i] = 0;
-    std::vector<geos::geom::Geometry*>   common_segments;
-    const geos::geom::Polygon *patch1 = dynamic_cast<const geos::geom::Polygon *>(multipolygon->getGeometryN(i));
-    const geos::geom::LineString  *ring1 = patch1->getExteriorRing();
-
-    for(unsigned int j=0;(j<nr_patches);j++)
-    {
-      if(j==i)
-        continue;
-      const geos::geom::Polygon *patch2 = dynamic_cast<const geos::geom::Polygon *>(multipolygon->getGeometryN(j));
-      const geos::geom::LineString  *ring2 = patch2->getExteriorRing();
-      geos::geom::Geometry*  segment;
-      segment = ring1->intersection(ring2);
-      if(segment)
-      {
-        for(unsigned int s=0;s<segment->getNumGeometries();s++)
-        {
-          const geos::geom::Geometry *seg_piece = segment->getGeometryN(s);
-
-          if((seg_piece->getGeometryTypeId() == geos::geom::GEOS_LINESTRING) ||
-            (seg_piece->getGeometryTypeId() == geos::geom::GEOS_MULTILINESTRING))
-          {
-            if(ids[j] > 0)
-              ids[j] = -1;
-            for(unsigned int k=0;k<common_segments.size();k++)
-            {
-              if(seg_piece->overlaps(common_segments[k]))
-              {
-                delete segment;
-                for(unsigned int c=0;c<common_segments.size();c++)
-                  delete common_segments[c];
-                for(unsigned int b=0;b<boundary_segments.size();b++)
-                  delete boundary_segments[b];
-                return false;
-              }
-            }
-            common_segments.push_back(seg_piece->clone());
-          }
-        }
-        delete segment;
-      }//end if(segment)
-    }
-    if((is_closed && *is_closed) || exterior_boundary)
-    {
-      if(!common_segments.size())
-      {
-        if(is_closed)
-          *is_closed = false;
-      }
-      else
-      {
-        geos::geom::Geometry *segment_union;
-        geos::geom::Geometry *temp_union;
-        segment_union = common_segments[0]->clone();
-        for(unsigned int c=1;c<common_segments.size();c++)
-        {
-          temp_union = segment_union->Union(common_segments[c]);
-          delete segment_union;
-          segment_union = temp_union;
-        }
-        if(segment_union != ring1)
-        {
-          if(is_closed)
-            *is_closed = false;
-          if(exterior_boundary)
-          {
-            geos::geom::Geometry *diff;
-            diff = ring1->difference(segment_union);
-            boundary_segments.push_back(diff);
-          }
-        }
-        delete segment_union;
-      }
-    }
-    for(unsigned int c=0;c<common_segments.size();c++)
-      delete common_segments[c];
-    common_segments.clear();
-  }
-
-  if(is_united && exterior_boundary)
-  {
-    //do manual union of boundary_segments
-    //std::vector<const geos::geom::Point *> points;
-    geos::geom::CoordinateSequence      *cl = NULL;
-
-    std::vector<const geos::geom::LineString *> segments;
-    size_t nr_segments = 0;
-    for(unsigned int b=0;b<boundary_segments.size();b++)
-    {
-      nr_segments += boundary_segments[b]->getNumGeometries();
-    }
-    //points.reserve(nr_segments*4);
-    segments.reserve(nr_segments);
-    for(unsigned int b=0;b<boundary_segments.size();b++)
-    {
-      geos::geom::Geometry* segm = boundary_segments[b];
-      for(unsigned int s=0;s<segm->getNumGeometries();s++)
-      {
-        const geos::geom::Geometry* part = segm->getGeometryN(s);
-        if(part->getGeometryTypeId() == geos::geom::GEOS_LINESTRING)
-        {
-          segments.push_back(dynamic_cast<const geos::geom::LineString *>(part));
-        }
-      }
-    }
-    const geos::geom::Geometry* part = segments[0];
-    if(!cl)
-    {
-      int srs_dim;
-#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
-      srs_dim = part->getCoordinateDimension();
-#else
-      srs_dim = getCoordinateDimension(part);
-#endif
-      cl = geos::geom::CoordinateArraySequenceFactory::instance()->create((std::size_t)0, srs_dim);
-    }
-    std::auto_ptr<const geos::geom::CoordinateSequence> coords(part->getCoordinates());
-    cl->add(coords.get(), false, true);
-
-    segments[0] = NULL;
-    while(1)
-    {
-      const geos::geom::Coordinate &last_point = cl->getAt(cl->size()-1);
-      bool added_points = false;
-      for(unsigned int s=1;s<segments.size();s++)
-      {
-        if(!segments[s])
-          continue;
-        const geos::geom::Geometry *segmn = segments[s];
-        std::auto_ptr<geos::geom::CoordinateSequence> coords(segmn->getCoordinates());
-        geos::geom::Coordinate point = coords->getAt(0);
-        if(last_point == point)
-        {
-          cl->add(coords.get(), false, true);
-          segments[s] = NULL;
-          added_points = true;
-          break;
-        }
-        else
-        {
-          point = coords->getAt(coords->size()-1);
-          if(last_point == point)
-          {
-            cl->add(coords.get(), false, false);
-            segments[s] = NULL;
-            added_points = true;
-            break;
-          }
-        }
-      }
-      if(!added_points)
-        break;
-    }
-    cl->add(cl->getAt(0), false);
-    *exterior_boundary = get_geometryFactory()->createLinearRing(cl);
-    (*exterior_boundary)->setUserData((void*)GMLSF_LINEARRING);
-    for(unsigned int b=0;b<boundary_segments.size();b++)
-      delete boundary_segments[b];
-  }
-  return is_united;
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFDimensionFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-  geos::geom::Dimension::DimensionType   dim_type = geos::geom::Dimension::DONTCARE;
-  try{
-    dim_type = geos_geometry->getDimension();
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS function getDimension : " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(
-      theModule->getItemFactory()->createInteger((int)dim_type)));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFCoordinateDimensionFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
-  int   coord_dim = geos_geometry->getCoordinateDimension();
-#else
-  int coord_dim = getCoordinateDimension(geos_geometry.get());
-#endif
-  return ItemSequence_t(new SingletonItemSequence(
-      theModule->getItemFactory()->createInteger(coord_dim)));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFGeometryTypeFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  zorba::String type_string;
-  switch(geometric_type)
-  {
-  case GMLSF_POINT:
-   type_string = "Point";break;
-  case GMLSF_LINESTRING:
-   type_string = "LineString";break;
-  case GMLSF_CURVE:
-   type_string = "Curve";break;
-  case GMLSF_LINEARRING:
-   type_string = "LineString";break;
-  case GMLSF_SURFACE:
-   type_string = "Surface";break;
-  case GMLSF_POLYGON:
-  //case GMLSF_POLYGONPATCH:
-   type_string = "Polygon";break;
-  case GMLSF_MULTIPOINT:
-   type_string = "MultiPoint";break;
-  case GMLSF_MULTICURVE:
-   type_string = "MultiCurve";break;
-  case GMLSF_MULTISURFACE:
-   type_string = "MultiSurface";break;
-  case GMLSF_MULTIGEOMETRY:
-   type_string = "MultiGeometry";break;
-
-  case GMLSF_INVALID:
-  default:
-  /*  {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-  */  break;
-  }
-
-  if(!type_string.empty())
-  {
-    String gmlns("http://www.opengis.net/gml";);
-    String gmlprefix("gml");
-    return ItemSequence_t(new SingletonItemSequence(
-      theModule->getItemFactory()->createQName(gmlns, gmlprefix, type_string)));
-  }
-  else
-  {
-    return ItemSequence_t(NULL);//new EmptySequence());
-  }
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFNumGeometriesFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_POINT:
-  case GMLSF_LINESTRING:
-  //case GMLSF_CURVE:
-  case GMLSF_LINEARRING:
-  //case GMLSF_SURFACE:
-  case GMLSF_POLYGON:
-    return ItemSequence_t(new SingletonItemSequence(
-      theModule->getItemFactory()->createUnsignedInt(1)));
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  uint32_t    num_geos = 0;
-  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, COUNT_CHILDREN, &num_geos);
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createUnsignedInt(num_geos)));
-}
-
-ItemSequence_t
-SFGeometryNFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  Item lItem2;
-  Iterator_t arg1_iter = args[1]->getIterator();
-  arg1_iter->open();
-  if (!arg1_iter->next(lItem2))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as second parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  arg1_iter->close();
-
-  uint32_t n;
-  n = lItem2.getUnsignedIntValue();
-
-  switch(geometric_type1)
-  {
-  case GMLSF_POINT:
-  case GMLSF_LINESTRING:
-  //case GMLSF_CURVE:
-  case GMLSF_LINEARRING:
-  //case GMLSF_SURFACE:
-  case GMLSF_POLYGON:
-    if(n == 0)
-      return ItemSequence_t(new SingletonItemSequence(lItem1));
-    else
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Index n (" << n << ") is outside the range ";
-      throwError("IndexOutsideRange", lErrorMessage.str());
-    }
-    break;
-  default:break;
-  }
-
-  Item    nth_child;
-  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_CHILD, &n, &nth_child);
-
-  if(nth_child.isNull())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Index n (" << n << ") is outside the range ";
-    throwError("IndexOutsideRange", lErrorMessage.str());
-  }
-  return ItemSequence_t(new SingletonItemSequence(nth_child));
-}
-
-
-
-///////////////////////////////////////////////////////////////////////
-#define DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(sfclass_name, geos_function_name)  \
-ItemSequence_t                                                                          \
-sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,              \
-         const StaticContext* aSctxCtx,                                                 \
-         const DynamicContext* aDynCtx) const                                           \
-{                                                                                       \
-  Item lItem;                                                                           \
-  gmlsf_types   geometric_type;                                                         \
-  geometric_type = getGeometryNodeType(args, 0, lItem);                                 \
-                                                                                        \
-  switch(geometric_type)                                                                \
-  {                                                                                     \
-  case GMLSF_INVALID:                                                                   \
-    {                                                                                   \
-      std::stringstream lErrorMessage;                                                  \
-      zorba::Item item_qname;                                                           \
-      lItem.getNodeName(item_qname);                                                    \
-      lErrorMessage << "Unrecognized geometric type for element "                       \
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                         \
-    }                                                                                   \
-    break;                                                                              \
-  default:                                                                              \
-    break;                                                                              \
-  }                                                                                     \
-                                                                                        \
-  zorba::Item srs_uri;                                                                  \
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));  \
-                                                                                        \
-  std::auto_ptr<geos::geom::Geometry>  geos_result;                                     \
-  try{                                                                                  \
-    geos_result.reset(geos_geometry->geos_function_name());                             \
-  }catch(std::exception &excep)                                                         \
-  {                                                                                     \
-    std::stringstream lErrorMessage;                                                    \
-    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
-    throwError("GEOSError", lErrorMessage.str());                                          \
-  }                                                                                     \
-                                                                                        \
-  zorba::Item   null_parent;                                                            \
-  zorba::Item   result_item;                                                            \
-  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri);         \
-                                                                                        \
-  RETURN_RESULT_ITEM;                                                                   \
-}
-
-//DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFBoundaryFunction, getBoundary)
-DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFConvexHullFunction, convexHull)
-DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFCentroidFunction, getCentroid)
-DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_GEOMETRY(SFPointOnSurfaceFunction, getInteriorPoint)
-
-zorba::Item GeoFunction::getBoundary(geos::geom::Geometry *geos_geometry, zorba::Item srs_uri) const
-{
-  std::auto_ptr<geos::geom::Geometry>  geos_result;
-  if(geos_geometry->getUserData() == (void*)GMLSF_SURFACE)
-  {
-    geos::geom::LinearRing *exterior_ring;
-    geos::geom::MultiPolygon* surface = dynamic_cast<geos::geom::MultiPolygon*>(geos_geometry);
-    if(!isSurface(surface, NULL, &exterior_ring))
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in Surface : the patches do not form a polyhedral surface";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    std::vector<geos::geom::Geometry*> *rings = new std::vector<geos::geom::Geometry*>;
-    rings->push_back(exterior_ring);
-    for(unsigned int i=0;i<surface->getNumGeometries();i++)
-    {
-      const geos::geom::Polygon* polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry->getGeometryN(i));
-      for(unsigned int r=0;r<polygon->getNumInteriorRing();r++)
-      {
-        rings->push_back((geos::geom::LineString*)polygon->getInteriorRingN(r));
-      }
-    }
-    geos_result.reset(get_geometryFactory()->createMultiLineString(rings));
-  }
-  /*else if(geometric_type == GMLSF_CURVE)
-  {
-    geos::geom::LineString *linestring = curveToLineString(geos_geometry);
-    try{
-      geos_result = linestring->getBoundary();
-    }catch(std::exception &excep)
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in GEOS function getBoundary : " << excep.what();
-      throwError("GEOSError", lErrorMessage.str());
-    }
-    delete linestring;
-  }
-  */
-  else
-  {
-    try{
-      geos_result.reset(geos_geometry->getBoundary());
-    }catch(std::exception &excep)
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in GEOS function getBoundary : " << excep.what();
-      throwError("GEOSError", lErrorMessage.str());
-    }
-  }
-
-  zorba::Item   null_parent;
-  zorba::Item   result_item;
-  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri, 0, NULL, DONT_CHECK_FOR_CURVE_SURFACE);
-  return result_item;
-}
-
-void GeoFunction::getMultiGeometryBoundary(geos::geom::Geometry *geos_geometry,
-                                           std::vector<zorba::Item> *boundaries,
-                                           zorba::Item srs_uri) const
-{
-  for(unsigned int i=0;i<geos_geometry->getNumGeometries();i++)
-  {
-    geos::geom::Geometry *geom = (geos::geom::Geometry *)geos_geometry->getGeometryN(i);
-    if(geom->getGeometryTypeId() == geos::geom::GEOS_GEOMETRYCOLLECTION)
-      getMultiGeometryBoundary(geom, boundaries, srs_uri);
-    else
-    {
-      zorba::Item boundary;
-      boundary = getBoundary(geom, srs_uri);
-      if(!boundary.isNull())
-        boundaries->push_back(boundary);
-    }
-  }
-}
-
-ItemSequence_t
-SFBoundaryFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  zorba::Item srs_uri;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));
-
-  if(geometric_type != GMLSF_MULTIGEOMETRY)
-  {
-    zorba::Item result_item;
-    result_item = getBoundary(geos_geometry.get(), srs_uri);
-    RETURN_RESULT_ITEM;
-  }
-  else
-  {
-    std::vector<zorba::Item>  boundaries;
-    getMultiGeometryBoundary(geos_geometry.get(), &boundaries, srs_uri);
-    return ItemSequence_t(new VectorItemSequence(boundaries));
-  }
-
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFSridFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  zorba::Item  srs_uri;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));
-
-  if(!srs_uri.isNull())
-    return ItemSequence_t(new SingletonItemSequence(srs_uri));
-  else
-    return ItemSequence_t(NULL);
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFEnvelopeFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  zorba::Item  srs_uri;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1, &srs_uri));
-
-  const geos::geom::Envelope  *envelope = NULL;
-  try{
-    envelope = geos_geometry->getEnvelopeInternal();
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS function getEnvelopeInternal : " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-
-
-  zorba::Item   envelope_item;
-  zorba::Item   corner_item;
-  zorba::Item   item_name;
-  zorba::Item   item_type;
-  zorba::Item   null_parent;
-  zorba::NsBindings ns_binding;
-  char strtemp[100];
-  ns_binding.push_back(std::pair<String, String>("gml", "http://www.opengis.net/gml";));
-  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-  item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "Envelope");
-  envelope_item = theModule->getItemFactory()->createElementNode(null_parent, item_name, item_type, false, false, ns_binding);
-
-  if(!srs_uri.isNull())
-  {
-    item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-    item_name = theModule->getItemFactory()->createQName("", "srsName");
-    zorba::String   strvalue = srs_uri.getStringValue();
-    zorba::Item attr_value_item = theModule->getItemFactory()->createString(strvalue);
-    theModule->getItemFactory()->createAttributeNode(envelope_item, item_name, item_type, attr_value_item);
-  }
-  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-  item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "lowerCorner");
-  addNewLineIndentText(envelope_item, 2);
-  corner_item = theModule->getItemFactory()->createElementNode(envelope_item, item_name, item_type, false, false, ns_binding);
-
-  sprintf(strtemp, "%lf %lf", envelope->getMinX(), envelope->getMinY());
-  theModule->getItemFactory()->createTextNode(corner_item, strtemp);
-
-  item_type = theModule->getItemFactory()->createQName("http://www.w3.org/2001/XMLSchema";, "untyped");
-  item_name = theModule->getItemFactory()->createQName("http://www.opengis.net/gml";, "gml", "upperCorner");
-  addNewLineIndentText(envelope_item, 2);
-  corner_item = theModule->getItemFactory()->createElementNode(envelope_item, item_name, item_type, false, false, ns_binding);
-
-  sprintf(strtemp, "%lf %lf", envelope->getMaxX(), envelope->getMaxY());
-  theModule->getItemFactory()->createTextNode(corner_item, strtemp);
-  addNewLineIndentText(envelope_item, 0);
-
-  return ItemSequence_t(new SingletonItemSequence(envelope_item));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFAsTextFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-  std::string as_text;
-  as_text = geos_geometry->toString();
-
-  return ItemSequence_t(new SingletonItemSequence(
-      theModule->getItemFactory()->createString(as_text)));
-}
-
-unsigned char GeoFunction::hex_to_bin(char hex) const
-{
-  if((hex >= '0') && (hex <= '9'))
-    return hex-'0';
-  else if((hex >= 'a') && (hex <= 'f'))
-    return hex-'a'+10;
-  else if((hex >= 'A') && (hex <= 'F'))
-    return hex-'A'+10;
-  else
-    return 0;
-}
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFAsBinaryFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-  std::ostringstream as_binary;
-  as_binary << *geos_geometry;
-
-  std::string binary_hex = as_binary.str();
-  size_t binary_len = binary_hex.size() / 2;
-  const char *hex_str = binary_hex.c_str();
-  unsigned char *binary_bin = new unsigned char[binary_len];
-  for(size_t i=0;i<binary_len;i++)
-  {
-    binary_bin[i] = ((hex_to_bin(hex_str[i*2]) << 4) | hex_to_bin(hex_str[i*2+1]));
-  }
-
-  zorba::Item base64_item = theModule->getItemFactory()->createBase64Binary(binary_bin, binary_len);
-  delete[] binary_bin;
-
-  return ItemSequence_t(new SingletonItemSequence(base64_item));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFIsEmptyFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  Iterator_t arg0_iter = args[0]->getIterator();
-  arg0_iter->open();
-  if (!arg0_iter->next(lItem))
-  {
-    return ItemSequence_t(new SingletonItemSequence(
-       theModule->getItemFactory()->createBoolean(true)));
-  }
-  arg0_iter->close();
-
-  if(!lItem.isNode() || (lItem.getNodeKind() != store::StoreConsts::elementNode))
-  {
-    return ItemSequence_t(new SingletonItemSequence(
-       theModule->getItemFactory()->createBoolean(true)));
-  }
-
-  GeoFunction::gmlsf_types geotype = getGmlSFGeometricType(lItem);
-  if(geotype == GMLSF_INVALID)
-  {
-    return ItemSequence_t(new SingletonItemSequence(
-      theModule->getItemFactory()->createBoolean(true)));
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geotype, -1));
-
-  bool is_empty = false;
-  try{
-  is_empty = (geos_geometry->getNumPoints() == 0);
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS function getNumGeometries : " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(is_empty)));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFIsSimpleFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-  bool is_simple = false;
-  if(geometric_type == GMLSF_CURVE)
-  {
-    is_simple = isSimpleCurve(geos_geometry.get());
-  }
-  else
-  {
-    try{
-    is_simple = geos_geometry->isSimple();
-    }catch(std::exception &excep)
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in GEOS function isSimple : " << excep.what();
-      throwError("GEOSError", lErrorMessage.str());
-    }
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(is_simple)));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFIs3DFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
-  bool is_3D = (geos_geometry->getCoordinateDimension() == 3);
-#else
-  bool is_3D = (getCoordinateDimension(geos_geometry.get()) == 3);//for GEOS 3.2.2
-#endif
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(is_3D)));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFIsMeasuredFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(false)));
-}
-
-///////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////
-#define DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(sfclass_name, geos_function_name)  \
-ItemSequence_t                                                                    \
-sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,        \
-         const StaticContext* aSctxCtx,                                           \
-         const DynamicContext* aDynCtx) const                                     \
-{                                                                                 \
-  Item lItem1;                                                                    \
-  gmlsf_types   geometric_type1;                                                  \
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);                         \
-                                                                                  \
-  switch(geometric_type1)                                                         \
-  {                                                                               \
-  case GMLSF_INVALID:                                                             \
-    {                                                                             \
-      std::stringstream lErrorMessage;                                            \
-      zorba::Item item_qname1;                                                    \
-      lItem1.getNodeName(item_qname1);                                            \
-      lErrorMessage << "Unrecognized geometric type for element "                 \
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";    \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
-    }                                                                             \
-    break;                                                                        \
-  default:                                                                        \
-    break;                                                                        \
-  }                                                                               \
-                                                                                  \
-  Item lItem2;                                                                    \
-  gmlsf_types   geometric_type2;                                                  \
-  geometric_type2 = getGeometryNodeType(args, 1, lItem2);                         \
-                                                                                  \
-  switch(geometric_type2)                                                         \
-  {                                                                               \
-  case GMLSF_INVALID:                                                             \
-    {                                                                             \
-      std::stringstream lErrorMessage;                                            \
-      zorba::Item item_qname2;                                                    \
-      lItem2.getNodeName(item_qname2);                                            \
-      lErrorMessage << "Unrecognized geometric type for element "                 \
-           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";   \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
-    }                                                                             \
-    break;                                                                        \
-  default:                                                                        \
-    break;                                                                        \
-  }                                                                               \
-                                                                                  \
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;                                          \
-  zorba::Item srs_uri1;                                                           \
-  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));            \
-                                                                                  \
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;                                          \
-  zorba::Item srs_uri2;                                                           \
-  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));            \
-                                                                                  \
-  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&                                  \
-    srs_uri1.getStringValue() != srs_uri2.getStringValue())                 \
-  {                                                                               \
-    std::stringstream lErrorMessage;                                              \
-    lErrorMessage << "SrsName is not the same in the two geometries: " <<         \
-                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();  \
-    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());           \
-  }                                                                               \
-                                                                                  \
-  bool retval = false;                                                            \
-  try{                                                                            \
-  retval = geos_geometry1->geos_function_name(geos_geometry2.get());                    \
-  }catch(std::exception &excep)                                                   \
-  {                                                                               \
-    std::stringstream lErrorMessage;                                              \
-    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
-    throwError("GEOSError", lErrorMessage.str());                                    \
-  }                                                                               \
-                                                                                  \
-                                                                                 \
-  return ItemSequence_t(new SingletonItemSequence(                                \
-     theModule->getItemFactory()->createBoolean(retval)));                        \
-}
-
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFEqualsFunction, equals)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFCoversFunction, covers)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFDisjointFunction, disjoint)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFIntersectsFunction, intersects)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFTouchesFunction, touches)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFCrossesFunction, crosses)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFWithinFunction, within)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFContainsFunction, contains)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_BOOLEAN(SFOverlapsFunction, overlaps)
-
-///////////////////////////////////////////////////////////////////////
-#define DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(sfclass_name, geos_function_name)  \
-ItemSequence_t                                                                    \
-sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,        \
-         const StaticContext* aSctxCtx,                                           \
-         const DynamicContext* aDynCtx) const                                     \
-{                                                                                 \
-  Item lItem1;                                                                    \
-  gmlsf_types   geometric_type1;                                                  \
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);                         \
-                                                                                  \
-  switch(geometric_type1)                                                         \
-  {                                                                               \
-  case GMLSF_INVALID:                                                             \
-    {                                                                             \
-      std::stringstream lErrorMessage;                                            \
-      zorba::Item item_qname1;                                                    \
-      lItem1.getNodeName(item_qname1);                                            \
-      lErrorMessage << "Unrecognized geometric type for element "                 \
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";    \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
-    }                                                                             \
-    break;                                                                        \
-  default:                                                                        \
-    break;                                                                        \
-  }                                                                               \
-                                                                                  \
-  Item lItem2;                                                                    \
-  gmlsf_types   geometric_type2;                                                  \
-  geometric_type2 = getGeometryNodeType(args, 1, lItem2);                         \
-                                                                                  \
-  switch(geometric_type2)                                                         \
-  {                                                                               \
-  case GMLSF_INVALID:                                                             \
-    {                                                                             \
-      std::stringstream lErrorMessage;                                            \
-      zorba::Item item_qname2;                                                    \
-      lItem2.getNodeName(item_qname2);                                            \
-      lErrorMessage << "Unrecognized geometric type for element "                 \
-           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";   \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                  \
-    }                                                                             \
-    break;                                                                        \
-  default:                                                                        \
-    break;                                                                        \
-  }                                                                               \
-                                                                                  \
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;                                          \
-  zorba::Item srs_uri1;                                                           \
-  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));            \
-                                                                                  \
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;                                          \
-  zorba::Item srs_uri2;                                                           \
-  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));            \
-                                                                                  \
-  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&                                  \
-    srs_uri1.getStringValue() == srs_uri2.getStringValue())                 \
-  {                                                                               \
-    std::stringstream lErrorMessage;                                              \
-    lErrorMessage << "SrsName is not the same in the two geometries: " <<         \
-                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();  \
-    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());           \
-  }                                                                               \
-                                                                                  \
-  std::auto_ptr<geos::geom::Geometry>  geos_result;                               \
-  try{                                                                            \
-  geos_result.reset(geos_geometry1->geos_function_name(geos_geometry2.get()));          \
-  }catch(std::exception &excep)                                                   \
-  {                                                                               \
-    std::stringstream lErrorMessage;                                              \
-    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
-    throwError("GEOSError", lErrorMessage.str());                                    \
-  }                                                                               \
-                                                                                  \
-                                                                                  \
-  if(srs_uri1.isNull())                                                           \
-    srs_uri1 = srs_uri2;                                                          \
-  zorba::Item   null_parent;                                                      \
-  zorba::Item   result_item;                                                      \
-  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri1);   \
-                                                                                  \
-  RETURN_RESULT_ITEM;                                                             \
-}
-
-
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFIntersectionFunction, intersection)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFUnionFunction, Union)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFDifferenceFunction, difference)
-DEFINE_EVALUATE_TWO_GEOMETRIES_RETURN_GEOMETRY(SFSymDifferenceFunction, symDifference)
-
-
-///////////////////////////////////////////////////////////////////////
-#define DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_DOUBLE(sfclass_name, geos_function_name)    \
-ItemSequence_t                                                                          \
-sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,              \
-         const StaticContext* aSctxCtx,                                                 \
-         const DynamicContext* aDynCtx) const                                           \
-{                                                                                       \
-  Item lItem;                                                                           \
-  gmlsf_types   geometric_type;                                                         \
-  geometric_type = getGeometryNodeType(args, 0, lItem);                                 \
-                                                                                        \
-  switch(geometric_type)                                                                \
-  {                                                                                     \
-  case GMLSF_INVALID:                                                                   \
-    {                                                                                   \
-      std::stringstream lErrorMessage;                                                  \
-      zorba::Item item_qname;                                                           \
-      lItem.getNodeName(item_qname);                                                    \
-      lErrorMessage << "Unrecognized geometric type for element "                       \
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                                        \
-    }                                                                                   \
-    break;                                                                              \
-  default:                                                                              \
-    break;                                                                              \
-  }                                                                                     \
-                                                                                        \
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;                                                 \
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));                 \
-                                                                                        \
-  double  retval = 0;                                                                   \
-  try{                                                                                  \
-  retval = geos_geometry->geos_function_name();                                         \
-  }catch(std::exception &excep)                                                         \
-  {                                                                                     \
-    std::stringstream lErrorMessage;                                                    \
-    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
-    throwError("GEOSError", lErrorMessage.str());                                          \
-  }                                                                                     \
-                                                                                        \
-  return ItemSequence_t(new SingletonItemSequence(                                      \
-     theModule->getItemFactory()->createDouble(retval)));                               \
-}
-
-DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_DOUBLE(SFAreaFunction, getArea)
-DEFINE_EVALUATE_ONE_GEOMETRY_RETURN_DOUBLE(SFLengthFunction, getLength)
-
-ItemSequence_t
-SFRelateFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  Item lItem2;
-  gmlsf_types   geometric_type2;
-  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
-
-  switch(geometric_type2)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname2;
-      lItem2.getNodeName(item_qname2);
-      lErrorMessage << "Unrecognized geometric type for third element "
-           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
-  zorba::Item  srs_uri1;
-  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;
-  zorba::Item  srs_uri2;
-  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));
-
-  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&
-    srs_uri1.getStringValue()== srs_uri2.getStringValue())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "SrsName is not the same in the two geometries: " <<
-                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();
-    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());
-  }
-
-
-  Item lItem3;
-  Iterator_t arg2_iter = args[2]->getIterator();
-  arg2_iter->open();
-  if (!arg2_iter->next(lItem3))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  arg2_iter->close();
-
-  zorba::String intersection_matrix;
-  intersection_matrix = lItem3.getStringValue();
-
-  bool is_relate = false;
-  try{
-    is_relate = geos_geometry1->relate(geos_geometry2.get(), intersection_matrix.c_str());
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS relate function: " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(is_relate)));
-}
-
-ItemSequence_t
-SFIsWithinDistanceFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  Item lItem2;
-  gmlsf_types   geometric_type2;
-  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
-
-  switch(geometric_type2)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname2;
-      lItem2.getNodeName(item_qname2);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
-  zorba::Item  srs_uri1;
-  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;
-  zorba::Item  srs_uri2;
-  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));
-
-  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&
-    srs_uri1.getStringValue() == srs_uri2.getStringValue())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "SrsName is not the same in the two geometries: " <<
-                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();
-    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());
-  }
-
-  Item lItem3;
-  Iterator_t arg2_iter = args[2]->getIterator();
-  arg2_iter->open();
-  if (!arg2_iter->next(lItem3))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as third parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  arg2_iter->close();
-
-  double distance;
-  distance = lItem3.getDoubleValue();
-
-  bool is_within_distance = false;
-  try{
-  is_within_distance = geos_geometry1->isWithinDistance(geos_geometry2.get(), distance);
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS function isWithinDistance : " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(is_within_distance)));
-}
-
-ItemSequence_t
-SFDistanceFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  Item lItem2;
-  gmlsf_types   geometric_type2;
-  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
-
-  switch(geometric_type2)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname2;
-      lItem2.getNodeName(item_qname2);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in second parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
-  zorba::Item  srs_uri1;
-  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri1));
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry2;
-  zorba::Item  srs_uri2;
-  geos_geometry2.reset(buildGeosGeometryFromItem(lItem2, geometric_type2, -1, &srs_uri2));
-
-  if(!srs_uri1.isNull() && !srs_uri2.isNull() &&
-    srs_uri1.getStringValue() == srs_uri2.getStringValue())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "SrsName is not the same in the two geometries: " <<
-                  srs_uri1.getStringValue() << " vs. " << srs_uri2.getStringValue();
-    throwError("SRSNotIdenticalInBothGeometries", lErrorMessage.str());
-  }
-
-  double min_distance = 0;
-  try{
-  min_distance = geos_geometry1->distance(geos_geometry2.get());
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS function distance : " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createDouble(min_distance)));
-}
-
-ItemSequence_t
-SFBufferFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  default:
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry1;
-  zorba::Item srs_uri;
-  geos_geometry1.reset(buildGeosGeometryFromItem(lItem1, geometric_type1, -1, &srs_uri));
-
-
-  Item lItem2;
-  Iterator_t arg1_iter = args[1]->getIterator();
-  arg1_iter->open();
-  if (!arg1_iter->next(lItem2))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as second parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  arg1_iter->close();
-
-  double distance;
-  distance = lItem2.getDoubleValue();
-
-  std::auto_ptr<geos::geom::Geometry>  geos_result;
-  try{
-  geos_result.reset(geos_geometry1->buffer(distance));
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS function buffer : " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-
-  zorba::Item   null_parent;
-  zorba::Item   result_item;
-  result_item = getGMLItemFromGeosGeometry(null_parent, geos_result.get(), &srs_uri);
-
-  RETURN_RESULT_ITEM;
-}
-
-///////////////////////////////////////////////////////////////////////
-#define DEFINE_EVALUATE_ONE_POINT_RETURN_DOUBLE(sfclass_name, geos_function_name)       \
-ItemSequence_t                                                                          \
-sfclass_name::evaluate(const ExternalFunction::Arguments_t& args,              \
-         const StaticContext* aSctxCtx,                                                 \
-         const DynamicContext* aDynCtx) const                                           \
-{                                                                                       \
-  Item lItem;                                                                           \
-  gmlsf_types   geometric_type;                                                         \
-  geometric_type = getGeometryNodeType(args, 0, lItem);                                 \
-                                                                                        \
-  switch(geometric_type)                                                                \
-  {                                                                                     \
-  case GMLSF_INVALID:                                                                   \
-    {                                                                                   \
-      std::stringstream lErrorMessage;                                                  \
-      zorba::Item item_qname;                                                           \
-      lItem.getNodeName(item_qname);                                                    \
-      lErrorMessage << "Unrecognized geometric type for element "                       \
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                         \
-    }                                                                                   \
-    break;                                                                              \
-  case GMLSF_POINT:                                                                     \
-    break;                                                                              \
-  default:                                                                              \
-    {                                                                                   \
-      std::stringstream lErrorMessage;                                                  \
-      zorba::Item item_qname;                                                           \
-      lItem.getNodeName(item_qname);                                                    \
-      lErrorMessage << "Geometry must be a point: "                                     \
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";           \
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());                         \
-    }                                                                                   \
-    break;                                                                              \
-  }                                                                                     \
-                                                                                        \
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;                                   \
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));            \
-  geos::geom::Point   *geos_point = dynamic_cast<geos::geom::Point*>(geos_geometry.get());    \
-                                                                                        \
-  double  retval = 0;                                                                   \
-  try{                                                                                  \
-  retval = geos_point->geos_function_name();                                            \
-  }catch(std::exception &excep)                                                         \
-  {                                                                                     \
-    std::stringstream lErrorMessage;                                                    \
-    lErrorMessage << "Error in GEOS function " #geos_function_name " : " << excep.what();  \
-    throwError("GEOSError", lErrorMessage.str());                                          \
-  }                                                                                     \
-                                                                                        \
-  return ItemSequence_t(new SingletonItemSequence(                                      \
-     theModule->getItemFactory()->createDouble(retval)));                               \
-}
-
-DEFINE_EVALUATE_ONE_POINT_RETURN_DOUBLE(SFXFunction, getX)
-DEFINE_EVALUATE_ONE_POINT_RETURN_DOUBLE(SFYFunction, getY)
-
-ItemSequence_t
-SFZFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_POINT:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a point: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-  const geos::geom::Coordinate  *c;
-  c = geos_geometry->getCoordinate();
-#if GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR > 2)
-  if(geos_geometry->getCoordinateDimension() == 3)
-#else
-  if(getCoordinateDimension(geos_geometry.get()) == 3)
-#endif
-  {
-    double z = c->z;
-    return ItemSequence_t(new SingletonItemSequence(
-       theModule->getItemFactory()->createDouble(z)));
-  }
-  else
-  {
-    return zorba::ItemSequence_t(NULL);
-  }
-
-}
-
-ItemSequence_t
-SFMFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_POINT:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a point: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  //don't know how to get the Measure from Point
-  return zorba::ItemSequence_t(NULL);
-
-}
-
-
-ItemSequence_t
-SFStartPointFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_LINESTRING:
-  case GMLSF_LINEARRING:
-  case GMLSF_CURVE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Geometry must be a line: "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  uint32_t n = 0;
-
-  Item    nth_child;
-  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_POINT, &n, &nth_child);
-
-  if(nth_child.isNull())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "LineString has no points ";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(nth_child));
-}
-
-ItemSequence_t
-SFEndPointFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_LINESTRING:
-  case GMLSF_LINEARRING:
-  case GMLSF_CURVE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Geometry must be a line: "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  Item    nth_child;
-  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_END_POINT, NULL, &nth_child);
-
-  if(nth_child.isNull())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "LineString has no points ";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(nth_child));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFIsClosedFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_LINESTRING:
-  case GMLSF_LINEARRING:
-  case GMLSF_CURVE:
-  case GMLSF_MULTICURVE:
-  case GMLSF_SURFACE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a line or Surface: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-  bool  retval = 0;
-  if(geometric_type == GMLSF_SURFACE)
-  {
-    if(!isSurface(dynamic_cast<geos::geom::MultiPolygon*>(geos_geometry.get()), &retval))
-      retval = false;
-  }
-  else if(geometric_type == GMLSF_CURVE)
-  {
-    retval = isClosedCurve(geos_geometry.get());
-  }
-  else
-  {
-    try{
-    if(geometric_type != GMLSF_MULTICURVE)
-    {
-      geos::geom::LineString   *geos_line = dynamic_cast<geos::geom::LineString*>(geos_geometry.get());
-      retval = geos_line->isClosed();
-    }
-    else
-    {
-      geos::geom::MultiLineString   *geos_multiline = dynamic_cast<geos::geom::MultiLineString*>(geos_geometry.get());
-      retval = geos_multiline->isClosed();
-    }
-    }catch(std::exception &excep)
-    {
-      std::stringstream lErrorMessage;
-      lErrorMessage << "Error in GEOS function SFIsClosedFunction : " << excep.what();
-      throwError("GEOSError", lErrorMessage.str());
-    }
-  }
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(retval)));
-}
-
-ItemSequence_t
-SFIsRingFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_LINESTRING:
-  case GMLSF_LINEARRING:
-  case GMLSF_CURVE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a line: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  std::auto_ptr<geos::geom::Geometry>  geos_geometry;
-  geos_geometry.reset(buildGeosGeometryFromItem(lItem, geometric_type, -1));
-
-  bool  retval = 0;
-  if(geometric_type != GMLSF_CURVE)
-  {
-  try{
-    geos::geom::LineString   *geos_line = dynamic_cast<geos::geom::LineString*>(geos_geometry.get());
-    retval = geos_line->isClosed();
-  }catch(std::exception &excep)
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Error in GEOS function isClosed : " << excep.what();
-    throwError("GEOSError", lErrorMessage.str());
-  }
-  }
-  else
-  {
-    retval = isRingCurve(geos_geometry.get());
-  }
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createBoolean(retval)));
-}
-
-ItemSequence_t
-SFNumPointsFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_LINESTRING:
-  case GMLSF_LINEARRING:
-  case GMLSF_CURVE:
-  case GMLSF_MULTICURVE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a line: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  uint32_t  num_children;
-  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, GET_NUM_POINTS, &num_children);
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createUnsignedInt(num_children)));
-}
-
-ItemSequence_t
-SFPointNFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_LINESTRING:
-  case GMLSF_LINEARRING:
-  case GMLSF_CURVE:
-  case GMLSF_MULTICURVE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Geometry must be a line: "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-
-  Item lItem2;
-  Iterator_t arg1_iter = args[1]->getIterator();
-  arg1_iter->open();
-  if (!arg1_iter->next(lItem2))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as second parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  arg1_iter->close();
-
-  uint32_t n;
-  n = lItem2.getUnsignedIntValue();
-
-  Item    nth_child;
-  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_POINT, &n, &nth_child);
-
-  if(nth_child.isNull())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Index n (" << n << ") is outside the range ";
-    throwError("IndexOutsideRange", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(nth_child));
-}
-
-///////////////////////////////////////////////////////////////////////
-ItemSequence_t
-SFExteriorRingFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_POLYGON:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a polygon: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  Item  result_item;
-  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, GET_EXTERIOR_RING, NULL, &result_item);
-
-  RETURN_RESULT_ITEM;
-}
-
-ItemSequence_t
-SFNumInteriorRingFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_POLYGON:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a polygon: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  uint32_t  num_children;
-  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, COUNT_CHILDREN, &num_children);
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createUnsignedInt(num_children)));
-}
-
-ItemSequence_t
-SFInteriorRingNFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_POLYGON:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Geometry must be a polygon: "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-
-
-  Item lItem2;
-  Iterator_t arg1_iter = args[1]->getIterator();
-  arg1_iter->open();
-  if (!arg1_iter->next(lItem2))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as second parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  arg1_iter->close();
-
-  uint32_t n;
-  n = lItem2.getUnsignedIntValue();
-
-  Item    nth_child;
-  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_CHILD, &n, &nth_child);
-
-  if(nth_child.isNull())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Index n (" << n << ") is outside the range ";
-    throwError("IndexOutsideRange", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(nth_child));
-}
-
-ItemSequence_t
-SFNumPatchesFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem;
-  gmlsf_types   geometric_type;
-  geometric_type = getGeometryNodeType(args, 0, lItem);
-
-  switch(geometric_type)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_SURFACE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname;
-      lItem.getNodeName(item_qname);
-      lErrorMessage << "Geometry must be a Surface: "
-           << item_qname.getPrefix() <<":"<<item_qname.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  uint32_t  num_children;
-  buildGeosGeometryFromItem(lItem, geometric_type, -1, NULL, COUNT_CHILDREN, &num_children);
-
-  return ItemSequence_t(new SingletonItemSequence(
-     theModule->getItemFactory()->createUnsignedInt(num_children)));
-}
-
-ItemSequence_t
-SFPatchNFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_SURFACE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Geometry must be a Surface: "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-
-
-  Item lItem2;
-  Iterator_t arg1_iter = args[1]->getIterator();
-  arg1_iter->open();
-  if (!arg1_iter->next(lItem2))
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "An empty-sequence is not allowed as second parameter";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-  arg1_iter->close();
-
-  uint32_t n;
-  n = lItem2.getUnsignedIntValue();
-
-  Item    nth_child;
-  buildGeosGeometryFromItem(lItem1, geometric_type1, -1, NULL, GET_NTH_CHILD, &n, &nth_child);
-
-  if(nth_child.isNull())
-  {
-    std::stringstream lErrorMessage;
-    lErrorMessage << "Index n (" << n << ") is outside the range ";
-    throwError("IndexOutsideRange", lErrorMessage.str());
-  }
-
-  return ItemSequence_t(new SingletonItemSequence(nth_child));
-}
-
-
-ItemSequence_t
-SFBoundingPolygonsFunction::evaluate(const ExternalFunction::Arguments_t& args,
-         const StaticContext* aSctxCtx,
-         const DynamicContext* aDynCtx) const
-{
-  Item lItem1;
-  gmlsf_types   geometric_type1;
-  geometric_type1 = getGeometryNodeType(args, 0, lItem1);
-
-  switch(geometric_type1)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_SURFACE:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname1;
-      lItem1.getNodeName(item_qname1);
-      lErrorMessage << "Parameter 1 must be a Surface: "
-           << item_qname1.getPrefix() <<":"<<item_qname1.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  Item lItem2;
-  gmlsf_types   geometric_type2;
-  geometric_type2 = getGeometryNodeType(args, 1, lItem2);
-
-  switch(geometric_type2)
-  {
-  case GMLSF_INVALID:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname2;
-      lItem2.getNodeName(item_qname2);
-      lErrorMessage << "Unrecognized geometric type for element "
-           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << " in first parameter.";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  case GMLSF_POLYGON:
-  //case GMLSF_POLYGONPATCH:
-    break;
-  default:
-    {
-      std::stringstream lErrorMessage;
-      zorba::Item item_qname2;
-      lItem2.getNodeName(item_qname2);
-      lErrorMessage << "Parameter 2 must be a Polygon or PolygonPatch: "
-           << item_qname2.getPrefix() <<":"<<item_qname2.getLocalName() << ".";
-      throwError("UnrecognizedGeoObject", lErrorMessage.str());
-    }
-    break;
-  }
-
-  std::vector<Item>   result;
-  zorba::Item   patches_item;
-  if(!getChild(lItem1, "patches", "http://www.opengis.net/gml";, patches_item))
-  {//get upset
-    std::stringstream lErrorMessage;
-    lErrorMessage << "gml:Surface node must have a gml:patches child";
-    throwError("UnrecognizedGeoObject", lErrorMessage.str());
-  }
-
-  Iterator_t    patches_children;
-  Item          polygon_patch_item;
-
-  patches_children = patches_item.getChildren();
-  patches_children->open();
-  unsigned int patch_nr = 0;
-
-  std::auto_ptr<geos::geom::Geometry> geos_geometry1(buildGeosGeometryFromItem(lItem1, geometric_type1, -1));
-  std::auto_ptr<geos::geom::Geometry> geos_geometry2(buildGeosGeometryFromItem(lItem2, GMLSF_POLYGON, -1));
-
-  const geos::geom::MultiPolygon *surface = dynamic_cast<const geos::geom::MultiPolygon*>(geos_geometry1.get());
-  const geos::geom::Polygon *polygon = dynamic_cast<const geos::geom::Polygon*>(geos_geometry2.get());
-  const geos::geom::LineString *exterior_ring = polygon->getExteriorRing();
-  //const geos::geom::CoordinateSequence *coords = exterior_ring->getCoordinates();
-
-
-  unsigned int nr_patches = (unsigned int)surface->getNumGeometries();
-  unsigned int i;
-  for(i=0;i<nr_patches;i++)
-  {
-    const geos::geom::Polygon *patch= dynamic_cast<const geos::geom::Polygon*>(surface->getGeometryN(i));
-    const geos::geom::LineString *patch_exterior_ring = patch->getExteriorRing();
-    //const geos::geom::CoordinateSequence *patch_coords = patch_exterior_ring->getCoordinates();
-    //see if this patch touches the input polygon
-    bool is_touching = false;
-    /*
-    for(unsigned int j=0;j<patch_coords->size();j++)
-    {
-      for(unsigned int k=0;k<coords->size();k++)
-      {
-        if(coords->getAt(k) == patch_coords->getAt(j))
-        {
-          geos::geom::Coordinate next1;
-          geos::geom::Coordinate next2;
-          if(k == (coords->size()-1))
-            next1 = coords->getAt(0);
-          else
-            next1 = coords->getAt(k+1);
-          if(j == (patch_coords->size()-1))
-            next2 = patch_coords->getAt(0);
-          else
-            next2 = patch_coords->getAt(j+1);
-          if(next1 == next2)
-          {
-            is_touching = true;
-            break;
-          }
-          if(j == 0)
-            next2 = patch_coords->getAt(patch_coords->size()-1);
-          else
-            next2 = patch_coords->getAt(j-1);
-          if(next1 == next2)
-          {
-            is_touching = true;
-            break;
-          }
-        }
-      }
-      if(is_touching)
-        break;
-    }
-    */
-    if(patch_exterior_ring->overlaps(exterior_ring))
-      is_touching = true;
-    if(is_touching)
-    {
-      //add the coresponding patch item to the list
-      while(patch_nr <= i)
-      {
-        patches_children->next(polygon_patch_item);
-        patch_nr++;
-      }
-      result.push_back(polygon_patch_item);
-    }
-  }
-
-  return ItemSequence_t(new VectorItemSequence(result));
-}
-
-
-} /* namespace geomodule */ } /* namespace zorba */

=== removed file 'src/org/expath/ns/geo.xq.src/geo_functions.h'
--- src/org/expath/ns/geo.xq.src/geo_functions.h	2011-06-08 17:29:49 +0000
+++ src/org/expath/ns/geo.xq.src/geo_functions.h	1970-01-01 00:00:00 +0000
@@ -1,213 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ZORBA_GEOMODULE_GEOFUNCTION_H
-#define ZORBA_GEOMODULE_GEOFUNCTION_H
-
-
-#include <zorba/external_module.h>
-#include <zorba/function.h>
-#include <zorba/zorba_string.h>
-
-namespace geos{
-namespace geom{
-class GeometryFactory;
-class Geometry;
-class CoordinateSequence;
-class MultiLineString;
-class MultiPolygon;
-class LineString;
-class LinearRing;
-}}
-
-namespace zorba { namespace geomodule {
-
-  class GeoModule;
-
-  class GeoFunction : public ContextualExternalFunction
-  {
-    protected:
-      const GeoModule* theModule;
-      //geos::geom::GeometryFactory   *geo_factory;
-
-      static void
-        throwError(
-              const char *err_localname,
-              const std::string aErrorMessage);
-
-
-    public:
-      enum gmlsf_types{
-        GMLSF_POINT,
-        GMLSF_LINESTRING,
-        GMLSF_CURVE,
-        GMLSF_LINEARRING,
-        GMLSF_SURFACE,
-        GMLSF_POLYGON,
-        //GMLSF_POLYGONPATCH,
-        GMLSF_MULTIPOINT,
-        GMLSF_MULTICURVE,
-        GMLSF_MULTISURFACE,
-        GMLSF_MULTIGEOMETRY,
-
-        GMLSF_INVALID
-      };
-
-      enum action_item{
-        BUILD_GEOS_GEOMETRY,
-        COUNT_CHILDREN,
-        GET_NTH_CHILD,
-        GET_EXTERIOR_RING,
-        GET_NUM_POINTS,
-        GET_NTH_POINT,
-        GET_END_POINT
-      };
-    protected:
-      bool getChild(zorba::Item &lItem, const char *localname, const char *ns, 
-                    zorba::Item &child_item) const;
-      bool getChild(zorba::Iterator_t children, const char *localname, const char *ns, 
-                    zorba::Item &child_item) const;
-      bool getAttribute(  zorba::Item &item, 
-                           const char *name, 
-                           const char *ns,
-                           zorba::Item &attr_item) const;
-      bool checkOptionalAttribute(zorba::Item &item, const char *attr_name, const char *ns, const char *attr_value) const;
-      int get_srsDimension(zorba::Item &item, int prev_srsdimension) const;
-      const geos::geom::GeometryFactory   *get_geometryFactory() const;
-      void readPointPosCoordinates(zorba::Item &lItem, double *x, double *y, double *z, int &srs_dim) const;
-      bool readPointPosCoordinates(zorba::Iterator_t children, double *x, double *y, double *z, int &srs_dim) const;
-      void readPosListCoordinates(zorba::Item &lItem, geos::geom::CoordinateSequence *&cl, int &srs_dim) const;
-      int  getCoordinateDimension(const geos::geom::Geometry *geos_geometry) const;
-      void getSrsName(zorba::Item lItem, zorba::Item &srs_uri) const;
-      bool isCurve(const geos::geom::MultiLineString *multiline) const;
-      bool isSurface(const geos::geom::MultiPolygon *multipolygon,
-                     bool *is_closed = NULL,
-                     geos::geom::LinearRing **exterior_boundary = NULL) const;
-      geos::geom::LineString *curveToLineString(const geos::geom::Geometry *geos_geometry) const;
-      bool isClosedCurve(const geos::geom::Geometry *geos_geometry) const;
-      bool isRingCurve(const geos::geom::Geometry *geos_geometry) const;
-      bool isSimpleCurve(const geos::geom::Geometry *geos_geometry) const;
-      
-      zorba::Item getBoundary(geos::geom::Geometry *geos_geometry, zorba::Item srs_uri) const;
-      void getMultiGeometryBoundary(geos::geom::Geometry *geos_geometry, 
-                                    std::vector<zorba::Item> *boundaries,
-                                    zorba::Item srs_uri) const;
-      void addNewLineIndentText(zorba::Item &parent, unsigned int indent) const;
-      void appendIndent(char *&strtemp2, unsigned int indent) const;
-      unsigned char hex_to_bin(char hex) const;
-
-    public:
-      GeoFunction(const GeoModule* module);
-      virtual ~GeoFunction();
-
-      virtual String
-      getURI() const;
-
-      enum gmlsf_types getGmlSFGeometricType(Item item) const;
-      enum gmlsf_types getGeometryNodeType(const ExternalFunction::Arguments_t& args, int arg_pos, zorba::Item &lItem) const;
-      
-      geos::geom::Geometry  *buildGeosGeometryFromItem(zorba::Item &lItem, 
-                                                      enum GeoFunction::gmlsf_types geometric_type,
-                                                      int  srs_dim,
-                                                      zorba::Item *srs_uri = NULL,
-                                                      enum GeoFunction::action_item what_action = BUILD_GEOS_GEOMETRY,
-                                                      uint32_t *optional_child_index_or_count = NULL,
-                                                      zorba::Item *result_item = NULL) const;
-      zorba::Item getGMLItemFromGeosGeometry(zorba::Item &parent, 
-                                              const geos::geom::Geometry *geos_geometry,
-                                              const zorba::Item *srs_uri = NULL,
-                                              unsigned int indent = 0,
-                                              const char *tag_name = NULL,
-                                              bool dont_check_for_curve_surface = false) const;
-  };
-
-
-//*****************************************************************************
-#define DECLARE_GEOFUNCTION_CLASS(geoclass_name, function_name)                 \
-  class geoclass_name : public GeoFunction                                      \
-  {                                                                             \
-    public:                                                                     \
-      geoclass_name(const GeoModule* aModule) : GeoFunction(aModule) {}         \
-                                                                                \
-      virtual String                                                            \
-      getLocalName() const { return #function_name; }                           \
-                                                                                \
-      virtual ItemSequence_t                                                    \
-      evaluate(const ExternalFunction::Arguments_t& args,              \
-               const StaticContext* aSctxCtx,                                   \
-               const DynamicContext* aDynCtx) const;                            \
-  };
-
-DECLARE_GEOFUNCTION_CLASS(SFDimensionFunction, dimension)
-DECLARE_GEOFUNCTION_CLASS(SFCoordinateDimensionFunction, coordinate-dimension)
-DECLARE_GEOFUNCTION_CLASS(SFGeometryTypeFunction, geometry-type)
-DECLARE_GEOFUNCTION_CLASS(SFSridFunction, srid)
-DECLARE_GEOFUNCTION_CLASS(SFNumGeometriesFunction, num-geometries)
-DECLARE_GEOFUNCTION_CLASS(SFGeometryNFunction, geometry-n)
-DECLARE_GEOFUNCTION_CLASS(SFEnvelopeFunction, envelope)
-DECLARE_GEOFUNCTION_CLASS(SFAsTextFunction, as-text)
-DECLARE_GEOFUNCTION_CLASS(SFAsBinaryFunction, as-binary)
-DECLARE_GEOFUNCTION_CLASS(SFIsEmptyFunction, is-empty)
-DECLARE_GEOFUNCTION_CLASS(SFIsSimpleFunction, is-simple)
-DECLARE_GEOFUNCTION_CLASS(SFIs3DFunction, is-3d)
-DECLARE_GEOFUNCTION_CLASS(SFIsMeasuredFunction, is-measured)
-DECLARE_GEOFUNCTION_CLASS(SFBoundaryFunction, boundary)
-DECLARE_GEOFUNCTION_CLASS(SFEqualsFunction, equals)
-DECLARE_GEOFUNCTION_CLASS(SFCoversFunction, covers)
-DECLARE_GEOFUNCTION_CLASS(SFDisjointFunction, disjoint)
-DECLARE_GEOFUNCTION_CLASS(SFIntersectsFunction, intersects)
-DECLARE_GEOFUNCTION_CLASS(SFTouchesFunction, touches)
-DECLARE_GEOFUNCTION_CLASS(SFCrossesFunction, crosses)
-DECLARE_GEOFUNCTION_CLASS(SFWithinFunction, within)
-DECLARE_GEOFUNCTION_CLASS(SFContainsFunction, contains)
-DECLARE_GEOFUNCTION_CLASS(SFOverlapsFunction, overlaps)
-DECLARE_GEOFUNCTION_CLASS(SFRelateFunction, relate)
-DECLARE_GEOFUNCTION_CLASS(SFDistanceFunction, distance)
-DECLARE_GEOFUNCTION_CLASS(SFBufferFunction, buffer)
-DECLARE_GEOFUNCTION_CLASS(SFConvexHullFunction, convex-hull)
-DECLARE_GEOFUNCTION_CLASS(SFIntersectionFunction, intersection)
-DECLARE_GEOFUNCTION_CLASS(SFUnionFunction, union)
-DECLARE_GEOFUNCTION_CLASS(SFDifferenceFunction, difference)
-DECLARE_GEOFUNCTION_CLASS(SFSymDifferenceFunction, sym-difference)
-DECLARE_GEOFUNCTION_CLASS(SFAreaFunction, area)
-DECLARE_GEOFUNCTION_CLASS(SFLengthFunction, length)
-DECLARE_GEOFUNCTION_CLASS(SFIsWithinDistanceFunction, is-within-distance)
-DECLARE_GEOFUNCTION_CLASS(SFCentroidFunction, centroid)
-DECLARE_GEOFUNCTION_CLASS(SFPointOnSurfaceFunction, point-on-surface)
-
-DECLARE_GEOFUNCTION_CLASS(SFXFunction, x)
-DECLARE_GEOFUNCTION_CLASS(SFYFunction, y)
-DECLARE_GEOFUNCTION_CLASS(SFZFunction, z)
-DECLARE_GEOFUNCTION_CLASS(SFMFunction, m)
-
-DECLARE_GEOFUNCTION_CLASS(SFStartPointFunction, start-point)
-DECLARE_GEOFUNCTION_CLASS(SFEndPointFunction, end-point)
-DECLARE_GEOFUNCTION_CLASS(SFIsClosedFunction, is-closed)
-DECLARE_GEOFUNCTION_CLASS(SFIsRingFunction, is-ring)
-DECLARE_GEOFUNCTION_CLASS(SFNumPointsFunction, num-points)
-DECLARE_GEOFUNCTION_CLASS(SFPointNFunction, point-n)
-
-DECLARE_GEOFUNCTION_CLASS(SFExteriorRingFunction, exterior-ring)
-DECLARE_GEOFUNCTION_CLASS(SFNumInteriorRingFunction, num-interior-ring)
-DECLARE_GEOFUNCTION_CLASS(SFInteriorRingNFunction, interior-ring-n)
-
-DECLARE_GEOFUNCTION_CLASS(SFNumPatchesFunction, num-patches)
-DECLARE_GEOFUNCTION_CLASS(SFPatchNFunction, patch-n)
-DECLARE_GEOFUNCTION_CLASS(SFBoundingPolygonsFunction, bounding-polygons)
-} /* namespace geomodule */
-} /* namespace zorba */
-
-#endif /* ZORBA_FILEMODULE_FILEFUNCTION_H */

=== removed file 'src/org/expath/ns/geo.xq.src/geo_module.cpp'
--- src/org/expath/ns/geo.xq.src/geo_module.cpp	2011-06-08 17:29:49 +0000
+++ src/org/expath/ns/geo.xq.src/geo_module.cpp	1970-01-01 00:00:00 +0000
@@ -1,220 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "geo_module.h"
-#include "geo_functions.h"
-
-namespace zorba { namespace geomodule {
-
-  ItemFactory* GeoModule::theFactory = 0;
-
-#ifdef WIN32
-#  define DLL_EXPORT __declspec(dllexport)
-#else
-#  define DLL_EXPORT __attribute__ ((visibility("default")))
-#endif
-
-extern "C" DLL_EXPORT zorba::ExternalModule* createModule() {
-  return new zorba::geomodule::GeoModule();
-}
-
-GeoModule::~GeoModule()
-{
-  for (FuncMap_t::const_iterator lIter = theFunctions.begin();
-       lIter != theFunctions.end(); ++lIter) {
-    delete lIter->second;
-  }
-  theFunctions.clear();
-}
-  
-ExternalFunction*
-GeoModule::getExternalFunction(const String& aLocalname)
-{
-  ExternalFunction*& lFunc = theFunctions[aLocalname];
-  if (!lFunc) {
-    if (1 == 0) {
-
-    }
-    else if (aLocalname == "dimension") {
-      lFunc = new SFDimensionFunction(this);
-    }
-    else if (aLocalname == "coordinate-dimension") {
-      lFunc = new SFCoordinateDimensionFunction(this);
-    }
-    else if (aLocalname == "geometry-type") {
-      lFunc = new SFGeometryTypeFunction(this);
-    }
-    else if (aLocalname == "srid") {
-      lFunc = new SFSridFunction(this);
-    }
-    else if (aLocalname == "num-geometries") {
-      lFunc = new SFNumGeometriesFunction(this);
-    }
-    else if (aLocalname == "geometry-n") {
-      lFunc = new SFGeometryNFunction(this);
-    }
-    else if (aLocalname == "envelope") {
-      lFunc = new SFEnvelopeFunction(this);
-    }
-    else if (aLocalname == "as-text") {
-      lFunc = new SFAsTextFunction(this);
-    }
-    else if (aLocalname == "as-binary") {
-      lFunc = new SFAsBinaryFunction(this);
-    }
-    else if (aLocalname == "is-empty") {
-      lFunc = new SFIsEmptyFunction(this);
-    }
-    else if (aLocalname == "is-simple") {
-      lFunc = new SFIsSimpleFunction(this);
-    }
-    else if (aLocalname == "is-3d") {
-      lFunc = new SFIs3DFunction(this);
-    }
-    else if (aLocalname == "is-measured") {
-      lFunc = new SFIsMeasuredFunction(this);
-    }
-    else if (aLocalname == "boundary") {
-      lFunc = new SFBoundaryFunction(this);
-    }
-    else if (aLocalname == "equals") {
-      lFunc = new SFEqualsFunction(this);
-    }
-    else if (aLocalname == "covers") {
-      lFunc = new SFCoversFunction(this);
-    }
-    else if (aLocalname == "disjoint") {
-      lFunc = new SFDisjointFunction(this);
-    }
-    else if (aLocalname == "intersects") {
-      lFunc = new SFIntersectsFunction(this);
-    }
-    else if (aLocalname == "touches") {
-      lFunc = new SFTouchesFunction(this);
-    }
-    else if (aLocalname == "crosses") {
-      lFunc = new SFCrossesFunction(this);
-    }
-    else if (aLocalname == "within") {
-      lFunc = new SFWithinFunction(this);
-    }
-    else if (aLocalname == "contains") {
-      lFunc = new SFContainsFunction(this);
-    }
-    else if (aLocalname == "overlaps") {
-      lFunc = new SFOverlapsFunction(this);
-    }
-    else if (aLocalname == "relate") {
-      lFunc = new SFRelateFunction(this);
-    }
-    else if (aLocalname == "distance") {
-      lFunc = new SFDistanceFunction(this);
-    }
-    else if (aLocalname == "buffer") {
-      lFunc = new SFBufferFunction(this);
-    }
-    else if (aLocalname == "convex-hull") {
-      lFunc = new SFConvexHullFunction(this);
-    }
-    else if (aLocalname == "intersection") {
-      lFunc = new SFIntersectionFunction(this);
-    }
-    else if (aLocalname == "union") {
-      lFunc = new SFUnionFunction(this);
-    }
-    else if (aLocalname == "difference") {
-      lFunc = new SFDifferenceFunction(this);
-    }
-    else if (aLocalname == "sym-difference") {
-      lFunc = new SFSymDifferenceFunction(this);
-    }
-    else if (aLocalname == "area") {
-      lFunc = new SFAreaFunction(this);
-    }
-    else if (aLocalname == "length") {
-      lFunc = new SFLengthFunction(this);
-    }
-    else if (aLocalname == "is-within-distance") {
-      lFunc = new SFIsWithinDistanceFunction(this);
-    }
-    else if (aLocalname == "centroid") {
-      lFunc = new SFCentroidFunction(this);
-    }
-    else if (aLocalname == "point-on-surface") {
-      lFunc = new SFPointOnSurfaceFunction(this);
-    }
-    else if (aLocalname == "x") {
-      lFunc = new SFXFunction(this);
-    }
-    else if (aLocalname == "y") {
-      lFunc = new SFYFunction(this);
-    }
-    else if (aLocalname == "z") {
-      lFunc = new SFZFunction(this);
-    }
-    else if (aLocalname == "m") {
-      lFunc = new SFMFunction(this);
-    }
-    else if (aLocalname == "start-point") {
-      lFunc = new SFStartPointFunction(this);
-    }
-    else if (aLocalname == "end-point") {
-      lFunc = new SFEndPointFunction(this);
-    }
-    else if (aLocalname == "is-closed") {
-      lFunc = new SFIsClosedFunction(this);
-    }
-    else if (aLocalname == "is-ring") {
-      lFunc = new SFIsRingFunction(this);
-    }
-    else if (aLocalname == "num-points") {
-      lFunc = new SFNumPointsFunction(this);
-    }
-    else if (aLocalname == "point-n") {
-      lFunc = new SFPointNFunction(this);
-    }
-    else if (aLocalname == "exterior-ring") {
-      lFunc = new SFExteriorRingFunction(this);
-    }
-    else if (aLocalname == "num-interior-ring") {
-      lFunc = new SFNumInteriorRingFunction(this);
-    }
-    else if (aLocalname == "interior-ring-n") {
-      lFunc = new SFInteriorRingNFunction(this);
-    }
-    else if (aLocalname == "num-patches") {
-      lFunc = new SFNumPatchesFunction(this);
-    }
-    else if (aLocalname == "patch-n") {
-      lFunc = new SFPatchNFunction(this);
-    }
-    else if (aLocalname == "bounding-polygons") {
-      lFunc = new SFBoundingPolygonsFunction(this);
-    }
-  }
-  return lFunc;
-}
-
-void
-GeoModule::destroy()
-{
-  if (!dynamic_cast<GeoModule*>(this)) {
-    return;
-  }
-  delete this;
-}
-
-} /* namespace GeoModule */ } /* namespace zorba */

=== removed file 'src/org/expath/ns/geo.xq.src/geo_module.h'
--- src/org/expath/ns/geo.xq.src/geo_module.h	2011-06-08 17:29:49 +0000
+++ src/org/expath/ns/geo.xq.src/geo_module.h	1970-01-01 00:00:00 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright 2006-2008 The FLWOR Foundation.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ZORBA_GEOMODULE_GEOMODULE_H
-#define ZORBA_GEOMODULE_GEOMODULE_H
-
-#include <map>
-
-#include <zorba/zorba.h>
-#include <zorba/external_module.h>
-
-namespace zorba { namespace geomodule {
-
-class GeoModule : public ExternalModule
-{
-private:
-  static ItemFactory* theFactory;
-
-protected:
-  class ltstr
-  {
-  public:
-    bool operator()(const String& s1, const String& s2) const
-    {
-      return s1.compare(s2) < 0;
-    }
-  };
-  
-  typedef std::map<String, ExternalFunction*, ltstr> FuncMap_t;
-
-  FuncMap_t theFunctions;
-  
-public:
-  virtual ~GeoModule();
-  
-  virtual String
-  getURI() const { return "http://expath.org/ns/geo";; }
-  
-  virtual ExternalFunction*
-  getExternalFunction(const String& aLocalname);
-
-  virtual void
-  destroy();
-
-  static ItemFactory*
-  getItemFactory()
-  {
-    if(!theFactory)
-    {
-      theFactory = Zorba::getInstance(0)->getItemFactory();
-    }
-    
-    return theFactory;
-  }
-};
-
-
-} /* namespace geomodule */ 
-} /* namespace zorba */
-
-#endif /* ZORBA_GEOMODULE_GEOMODULE_H */
-
-/*
- * Local variables:
- * mode: c++
- * End:
- */

=== modified file 'test/Queries/geo/area1.xq'
--- test/Queries/geo/area1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/area10.xq'
--- test/Queries/geo/area10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/area2.xq'
--- test/Queries/geo/area2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:MultiCurve>

=== modified file 'test/Queries/geo/area3.xq'
--- test/Queries/geo/area3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/area4.xq'
--- test/Queries/geo/area4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:MultiPoint>

=== modified file 'test/Queries/geo/area5.xq'
--- test/Queries/geo/area5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area5.xq	2013-06-18 22:41:25 +0000
@@ -4,7 +4,7 @@
 Result: 551
 :)
 
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:MultiSurface>

=== modified file 'test/Queries/geo/area6.xq'
--- test/Queries/geo/area6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/area7.xq'
--- test/Queries/geo/area7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:LinearRing>

=== modified file 'test/Queries/geo/area8.xq'
--- test/Queries/geo/area8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:LineString>

=== modified file 'test/Queries/geo/area9.xq'
--- test/Queries/geo/area9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/area9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:area(<gml:Polygon>

=== modified file 'test/Queries/geo/as_binary1.xq'
--- test/Queries/geo/as_binary1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_binary1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-binary(<gml:MultiCurve>

=== modified file 'test/Queries/geo/as_text1.xq'
--- test/Queries/geo/as_text1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:MultiCurve>

=== modified file 'test/Queries/geo/as_text2.xq'
--- test/Queries/geo/as_text2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:MultiSurface>

=== modified file 'test/Queries/geo/as_text3.xq'
--- test/Queries/geo/as_text3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/as_text4.xq'
--- test/Queries/geo/as_text4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:LineString><gml:pos>1 1</gml:pos><gml:pos>2 1</gml:pos></gml:LineString>)
\ No newline at end of file

=== modified file 'test/Queries/geo/as_text5.xq'
--- test/Queries/geo/as_text5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:LinearRing>

=== modified file 'test/Queries/geo/as_text6.xq'
--- test/Queries/geo/as_text6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/as_text7.xq'
--- test/Queries/geo/as_text7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:Polygon>

=== modified file 'test/Queries/geo/as_text8.xq'
--- test/Queries/geo/as_text8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/as_text9.xq'
--- test/Queries/geo/as_text9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/as_text9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:as-text(<gml:MultiPoint>

=== modified file 'test/Queries/geo/boundary1.xq'
--- test/Queries/geo/boundary1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:MultiPoint>

=== modified file 'test/Queries/geo/boundary10.xq'
--- test/Queries/geo/boundary10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/boundary11.xq'
--- test/Queries/geo/boundary11.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary11.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/boundary12.xq'
--- test/Queries/geo/boundary12.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary12.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/boundary13.xq'
--- test/Queries/geo/boundary13.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary13.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/boundary14.xq'
--- test/Queries/geo/boundary14.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary14.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/boundary2.xq'
--- test/Queries/geo/boundary2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:MultiCurve>

=== modified file 'test/Queries/geo/boundary3.xq'
--- test/Queries/geo/boundary3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:MultiSurface>

=== modified file 'test/Queries/geo/boundary4.xq'
--- test/Queries/geo/boundary4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/boundary5.xq'
--- test/Queries/geo/boundary5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:LineString>

=== modified file 'test/Queries/geo/boundary6.xq'
--- test/Queries/geo/boundary6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:LinearRing>

=== modified file 'test/Queries/geo/boundary7.xq'
--- test/Queries/geo/boundary7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/boundary8.xq'
--- test/Queries/geo/boundary8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:Polygon>

=== modified file 'test/Queries/geo/boundary9.xq'
--- test/Queries/geo/boundary9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/boundary9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:boundary(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/bounding-polygons1.xq'
--- test/Queries/geo/bounding-polygons1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/bounding-polygons1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:bounding-polygons(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/bounding-polygons2.xq'
--- test/Queries/geo/bounding-polygons2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/bounding-polygons2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:bounding-polygons(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/bounding-polygons3.xq'
--- test/Queries/geo/bounding-polygons3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/bounding-polygons3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:bounding-polygons(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/buffer1.xq'
--- test/Queries/geo/buffer1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:MultiPoint>

=== modified file 'test/Queries/geo/buffer10.xq'
--- test/Queries/geo/buffer10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/buffer2.xq'
--- test/Queries/geo/buffer2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:MultiSurface>

=== modified file 'test/Queries/geo/buffer3.xq'
--- test/Queries/geo/buffer3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/buffer4.xq'
--- test/Queries/geo/buffer4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:LinearRing>

=== modified file 'test/Queries/geo/buffer5.xq'
--- test/Queries/geo/buffer5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:LineString>

=== modified file 'test/Queries/geo/buffer6.xq'
--- test/Queries/geo/buffer6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:Polygon>

=== modified file 'test/Queries/geo/buffer7.xq'
--- test/Queries/geo/buffer7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/buffer8.xq'
--- test/Queries/geo/buffer8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:MultiCurve>

=== modified file 'test/Queries/geo/buffer9.xq'
--- test/Queries/geo/buffer9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/buffer9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:buffer(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/centroid1.xq'
--- test/Queries/geo/centroid1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:MultiCurve>

=== modified file 'test/Queries/geo/centroid10.xq'
--- test/Queries/geo/centroid10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/centroid2.xq'
--- test/Queries/geo/centroid2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/centroid3.xq'
--- test/Queries/geo/centroid3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:MultiPoint>

=== modified file 'test/Queries/geo/centroid4.xq'
--- test/Queries/geo/centroid4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:MultiSurface>

=== modified file 'test/Queries/geo/centroid5.xq'
--- test/Queries/geo/centroid5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/centroid6.xq'
--- test/Queries/geo/centroid6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:LinearRing>

=== modified file 'test/Queries/geo/centroid7.xq'
--- test/Queries/geo/centroid7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:LineString>

=== modified file 'test/Queries/geo/centroid8.xq'
--- test/Queries/geo/centroid8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:Polygon>

=== modified file 'test/Queries/geo/centroid9.xq'
--- test/Queries/geo/centroid9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/centroid9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:centroid(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>

=== modified file 'test/Queries/geo/contains1.xq'
--- test/Queries/geo/contains1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/contains10.xq'
--- test/Queries/geo/contains10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/contains2.xq'
--- test/Queries/geo/contains2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:MultiPoint>

=== modified file 'test/Queries/geo/contains3.xq'
--- test/Queries/geo/contains3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:Polygon>

=== modified file 'test/Queries/geo/contains4.xq'
--- test/Queries/geo/contains4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/contains5.xq'
--- test/Queries/geo/contains5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:LinearRing>

=== modified file 'test/Queries/geo/contains6.xq'
--- test/Queries/geo/contains6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:LineString>

=== modified file 'test/Queries/geo/contains7.xq'
--- test/Queries/geo/contains7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/contains8.xq'
--- test/Queries/geo/contains8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:MultiSurface>

=== modified file 'test/Queries/geo/contains9.xq'
--- test/Queries/geo/contains9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/contains9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:contains(<gml:MultiCurve>

=== modified file 'test/Queries/geo/convex-hull1.xq'
--- test/Queries/geo/convex-hull1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/convex-hull10.xq'
--- test/Queries/geo/convex-hull10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/convex-hull2.xq'
--- test/Queries/geo/convex-hull2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:MultiPoint>

=== modified file 'test/Queries/geo/convex-hull3.xq'
--- test/Queries/geo/convex-hull3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:MultiSurface>

=== modified file 'test/Queries/geo/convex-hull3_3d.xq'
--- test/Queries/geo/convex-hull3_3d.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull3_3d.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:MultiSurface>

=== modified file 'test/Queries/geo/convex-hull4.xq'
--- test/Queries/geo/convex-hull4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/convex-hull5.xq'
--- test/Queries/geo/convex-hull5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:LinearRing>

=== modified file 'test/Queries/geo/convex-hull6.xq'
--- test/Queries/geo/convex-hull6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:LineString>

=== modified file 'test/Queries/geo/convex-hull7.xq'
--- test/Queries/geo/convex-hull7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:Polygon>

=== modified file 'test/Queries/geo/convex-hull8.xq'
--- test/Queries/geo/convex-hull8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>

=== modified file 'test/Queries/geo/convex-hull9.xq'
--- test/Queries/geo/convex-hull9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/convex-hull9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:convex-hull(<gml:MultiCurve>

=== modified file 'test/Queries/geo/coordinate_dimension1.xq'
--- test/Queries/geo/coordinate_dimension1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/coordinate_dimension1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:coordinate-dimension(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/coordinate_dimension2.xq'
--- test/Queries/geo/coordinate_dimension2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/coordinate_dimension2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:coordinate-dimension(<gml:Point><gml:pos gml:srsDimension="3">1 1 14</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/coordinate_dimension3.xq'
--- test/Queries/geo/coordinate_dimension3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/coordinate_dimension3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:coordinate-dimension(<gml:MultiSurface>

=== modified file 'test/Queries/geo/coordinate_dimension4.xq'
--- test/Queries/geo/coordinate_dimension4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/coordinate_dimension4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:coordinate-dimension(<gml:Polygon srsDimension='3'>

=== modified file 'test/Queries/geo/coordinate_dimension5.xq'
--- test/Queries/geo/coordinate_dimension5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/coordinate_dimension5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:coordinate-dimension(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/coordinate_dimension6.xq'
--- test/Queries/geo/coordinate_dimension6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/coordinate_dimension6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:coordinate-dimension(<gml:LineString><gml:posList>1 1 14 10</gml:posList></gml:LineString>)
\ No newline at end of file

=== modified file 'test/Queries/geo/covers6.xq'
--- test/Queries/geo/covers6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/covers6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:covers(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/crosses1.xq'
--- test/Queries/geo/crosses1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:Point><gml:pos> 3 3</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/crosses10.xq'
--- test/Queries/geo/crosses10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/crosses2.xq'
--- test/Queries/geo/crosses2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:MultiPoint>

=== modified file 'test/Queries/geo/crosses3.xq'
--- test/Queries/geo/crosses3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:Polygon>

=== modified file 'test/Queries/geo/crosses4.xq'
--- test/Queries/geo/crosses4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:Point><gml:pos>10 11</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/crosses5.xq'
--- test/Queries/geo/crosses5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:MultiCurve>

=== modified file 'test/Queries/geo/crosses6.xq'
--- test/Queries/geo/crosses6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:MultiSurface>

=== modified file 'test/Queries/geo/crosses7.xq'
--- test/Queries/geo/crosses7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/crosses8.xq'
--- test/Queries/geo/crosses8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:LineString>

=== modified file 'test/Queries/geo/crosses9.xq'
--- test/Queries/geo/crosses9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/crosses9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:crosses(<gml:LinearRing>

=== modified file 'test/Queries/geo/difference1.xq'
--- test/Queries/geo/difference1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:LinearRing>

=== modified file 'test/Queries/geo/difference10.xq'
--- test/Queries/geo/difference10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/difference2.xq'
--- test/Queries/geo/difference2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/difference3.xq'
--- test/Queries/geo/difference3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:MultiPoint>

=== modified file 'test/Queries/geo/difference4.xq'
--- test/Queries/geo/difference4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:Polygon>

=== modified file 'test/Queries/geo/difference5.xq'
--- test/Queries/geo/difference5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/difference6.xq'
--- test/Queries/geo/difference6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:MultiCurve>

=== modified file 'test/Queries/geo/difference7.xq'
--- test/Queries/geo/difference7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:MultiSurface>

=== modified file 'test/Queries/geo/difference8.xq'
--- test/Queries/geo/difference8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/difference9.xq'
--- test/Queries/geo/difference9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/difference9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:difference(<gml:LineString>

=== modified file 'test/Queries/geo/dimension1.xq'
--- test/Queries/geo/dimension1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/dimension10.xq'
--- test/Queries/geo/dimension10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/dimension2.xq'
--- test/Queries/geo/dimension2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:LineString><gml:pos>1 1</gml:pos><gml:pos>2 1</gml:pos></gml:LineString>)
\ No newline at end of file

=== modified file 'test/Queries/geo/dimension3.xq'
--- test/Queries/geo/dimension3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:LinearRing>

=== modified file 'test/Queries/geo/dimension4.xq'
--- test/Queries/geo/dimension4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/dimension5.xq'
--- test/Queries/geo/dimension5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:Polygon>

=== modified file 'test/Queries/geo/dimension6.xq'
--- test/Queries/geo/dimension6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/dimension7.xq'
--- test/Queries/geo/dimension7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:MultiPoint>

=== modified file 'test/Queries/geo/dimension8.xq'
--- test/Queries/geo/dimension8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:MultiCurve>

=== modified file 'test/Queries/geo/dimension9.xq'
--- test/Queries/geo/dimension9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/dimension9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:dimension(<gml:MultiSurface>

=== modified file 'test/Queries/geo/disjoint1.xq'
--- test/Queries/geo/disjoint1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:Polygon>

=== modified file 'test/Queries/geo/disjoint2.xq'
--- test/Queries/geo/disjoint2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/disjoint3.xq'
--- test/Queries/geo/disjoint3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:MultiCurve>

=== modified file 'test/Queries/geo/disjoint4.xq'
--- test/Queries/geo/disjoint4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:MultiSurface>

=== modified file 'test/Queries/geo/disjoint5.xq'
--- test/Queries/geo/disjoint5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/disjoint6.xq'
--- test/Queries/geo/disjoint6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:LineString>

=== modified file 'test/Queries/geo/disjoint7.xq'
--- test/Queries/geo/disjoint7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:LinearRing>

=== modified file 'test/Queries/geo/disjoint8.xq'
--- test/Queries/geo/disjoint8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/disjoint9.xq'
--- test/Queries/geo/disjoint9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/disjoint9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:disjoint(<gml:MultiPoint>

=== modified file 'test/Queries/geo/distance1.xq'
--- test/Queries/geo/distance1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/distance1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:distance(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/end-point1.xq'
--- test/Queries/geo/end-point1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/end-point1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:end-point(<gml:LinearRing>

=== modified file 'test/Queries/geo/envelope1.xq'
--- test/Queries/geo/envelope1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 declare namespace top10nl="http://www.kadaster.nl/top10nl";;
 

=== modified file 'test/Queries/geo/envelope11.xq'
--- test/Queries/geo/envelope11.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope11.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:MultiSurface>

=== modified file 'test/Queries/geo/envelope12.xq'
--- test/Queries/geo/envelope12.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope12.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/envelope2.xq'
--- test/Queries/geo/envelope2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 declare default element namespace "http://www.adv-online.de/namespaces/adv/gid/4.0";;
 

=== modified file 'test/Queries/geo/envelope3.xq'
--- test/Queries/geo/envelope3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:LineString><gml:pos>1 1</gml:pos><gml:pos>2 1</gml:pos></gml:LineString>)
\ No newline at end of file

=== modified file 'test/Queries/geo/envelope4.xq'
--- test/Queries/geo/envelope4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:LinearRing>

=== modified file 'test/Queries/geo/envelope5.xq'
--- test/Queries/geo/envelope5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/envelope6.xq'
--- test/Queries/geo/envelope6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:Polygon>

=== modified file 'test/Queries/geo/envelope7.xq'
--- test/Queries/geo/envelope7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/envelope8.xq'
--- test/Queries/geo/envelope8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:MultiPoint>

=== modified file 'test/Queries/geo/envelope9.xq'
--- test/Queries/geo/envelope9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/envelope9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:envelope(<gml:MultiCurve>

=== modified file 'test/Queries/geo/equals1.xq'
--- test/Queries/geo/equals1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/equals2.xq'
--- test/Queries/geo/equals2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:MultiPoint>

=== modified file 'test/Queries/geo/equals3.xq'
--- test/Queries/geo/equals3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:MultiCurve>

=== modified file 'test/Queries/geo/equals4.xq'
--- test/Queries/geo/equals4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:MultiSurface>

=== modified file 'test/Queries/geo/equals5.xq'
--- test/Queries/geo/equals5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/equals6.xq'
--- test/Queries/geo/equals6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals6.xq	2013-06-18 22:41:25 +0000
@@ -4,7 +4,7 @@
 Result: true
 :)
 
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:LineString>

=== modified file 'test/Queries/geo/equals7.xq'
--- test/Queries/geo/equals7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:LinearRing>

=== modified file 'test/Queries/geo/equals8.xq'
--- test/Queries/geo/equals8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/equals9.xq'
--- test/Queries/geo/equals9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/equals9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:equals(<gml:Polygon>

=== modified file 'test/Queries/geo/exterior-ring1.xq'
--- test/Queries/geo/exterior-ring1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/exterior-ring1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:exterior-ring(<gml:MultiSurface>

=== modified file 'test/Queries/geo/exterior-ring2.xq'
--- test/Queries/geo/exterior-ring2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/exterior-ring2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:exterior-ring(<gml:Polygon>

=== modified file 'test/Queries/geo/geometry-n1.xq'
--- test/Queries/geo/geometry-n1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry-n1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-n(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/geometry-n2.xq'
--- test/Queries/geo/geometry-n2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry-n2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-n( <gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/geometry-n3.xq'
--- test/Queries/geo/geometry-n3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry-n3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-n(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/geometry-n4.xq'
--- test/Queries/geo/geometry-n4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry-n4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-n(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/geometry_type1.xq'
--- test/Queries/geo/geometry_type1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:MultiSurface>

=== modified file 'test/Queries/geo/geometry_type10.xq'
--- test/Queries/geo/geometry_type10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/geometry_type11.xq'
--- test/Queries/geo/geometry_type11.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type11.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:MultiGeometry11>

=== modified file 'test/Queries/geo/geometry_type2.xq'
--- test/Queries/geo/geometry_type2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>)
\ No newline at end of file

=== modified file 'test/Queries/geo/geometry_type3.xq'
--- test/Queries/geo/geometry_type3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:LineString><gml:pos>1 1</gml:pos><gml:pos>2 1</gml:pos></gml:LineString>)
\ No newline at end of file

=== modified file 'test/Queries/geo/geometry_type4.xq'
--- test/Queries/geo/geometry_type4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:LinearRing>

=== modified file 'test/Queries/geo/geometry_type5.xq'
--- test/Queries/geo/geometry_type5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/geometry_type6.xq'
--- test/Queries/geo/geometry_type6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:Polygon>

=== modified file 'test/Queries/geo/geometry_type7.xq'
--- test/Queries/geo/geometry_type7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/geometry_type8.xq'
--- test/Queries/geo/geometry_type8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:MultiPoint>

=== modified file 'test/Queries/geo/geometry_type9.xq'
--- test/Queries/geo/geometry_type9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/geometry_type9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:geometry-type(<gml:MultiCurve>

=== modified file 'test/Queries/geo/interior-point1.xq'
--- test/Queries/geo/interior-point1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>

=== modified file 'test/Queries/geo/interior-point10.xq'
--- test/Queries/geo/interior-point10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/interior-point2.xq'
--- test/Queries/geo/interior-point2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:MultiCurve>

=== modified file 'test/Queries/geo/interior-point3.xq'
--- test/Queries/geo/interior-point3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/interior-point4.xq'
--- test/Queries/geo/interior-point4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:MultiPoint>

=== modified file 'test/Queries/geo/interior-point5.xq'
--- test/Queries/geo/interior-point5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:MultiSurface>

=== modified file 'test/Queries/geo/interior-point6.xq'
--- test/Queries/geo/interior-point6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/interior-point7.xq'
--- test/Queries/geo/interior-point7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:LinearRing>

=== modified file 'test/Queries/geo/interior-point8.xq'
--- test/Queries/geo/interior-point8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:LineString>

=== modified file 'test/Queries/geo/interior-point9.xq'
--- test/Queries/geo/interior-point9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-point9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:point-on-surface(<gml:Polygon>

=== modified file 'test/Queries/geo/interior-ring-n1.xq'
--- test/Queries/geo/interior-ring-n1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/interior-ring-n1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 let $poly := <gml:Polygon>

=== modified file 'test/Queries/geo/intersection1.xq'
--- test/Queries/geo/intersection1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection1.xq	2013-06-18 22:41:25 +0000
@@ -4,7 +4,7 @@
 Result: 3.000000 3.000000
 :)
 
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:Curve><gml:segments>

=== modified file 'test/Queries/geo/intersection10.xq'
--- test/Queries/geo/intersection10.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection10.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:MultiGeometry>

=== modified file 'test/Queries/geo/intersection2.xq'
--- test/Queries/geo/intersection2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:MultiPoint>

=== modified file 'test/Queries/geo/intersection3.xq'
--- test/Queries/geo/intersection3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:Polygon>

=== modified file 'test/Queries/geo/intersection4.xq'
--- test/Queries/geo/intersection4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/intersection5.xq'
--- test/Queries/geo/intersection5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:MultiCurve>

=== modified file 'test/Queries/geo/intersection6.xq'
--- test/Queries/geo/intersection6.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection6.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:MultiSurface>

=== modified file 'test/Queries/geo/intersection7.xq'
--- test/Queries/geo/intersection7.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection7.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:Point><gml:pos>1 1</gml:pos></gml:Point>,

=== modified file 'test/Queries/geo/intersection8.xq'
--- test/Queries/geo/intersection8.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection8.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:LineString>

=== modified file 'test/Queries/geo/intersection8_3d.xq'
--- test/Queries/geo/intersection8_3d.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection8_3d.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:LineString>

=== modified file 'test/Queries/geo/intersection9.xq'
--- test/Queries/geo/intersection9.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersection9.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersection(<gml:LinearRing>

=== modified file 'test/Queries/geo/intersects1.xq'
--- test/Queries/geo/intersects1.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersects1.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersects(<gml:MultiPoint>

=== modified file 'test/Queries/geo/intersects2.xq'
--- test/Queries/geo/intersects2.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersects2.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersects(<gml:Polygon>

=== modified file 'test/Queries/geo/intersects3.xq'
--- test/Queries/geo/intersects3.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersects3.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersects(<gml:Surface><gml:patches>

=== modified file 'test/Queries/geo/intersects4.xq'
--- test/Queries/geo/intersects4.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersects4.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersects(<gml:MultiCurve>

=== modified file 'test/Queries/geo/intersects5.xq'
--- test/Queries/geo/intersects5.xq	2011-02-23 12:55:52 +0000
+++ test/Queries/geo/intersects5.xq	2013-06-18 22:41:25 +0000
@@ -1,4 +1,4 @@
-import module namespace geo = "http://expath.org/ns/geo";;
+import module namespace geo = "http://zorba.io/modules/geo";;
 declare namespace gml="http://www.opengis.net/gml";;
 
 geo:intersects(<gml:MultiSurface>

=== modified file 'test/Queries/geo/i

Follow ups