geo:interior-point( $region as cts:region, [$options as xs:string*] ) as cts:point?
This function returns a point that is guaranteed to be inside the bounds of the given region. For a given region and set of options, the point returned should be stable from one call to the next.
Under extreme circumstances a point may be returned that may in fact not be inside a polygon, due to the limits of floating point arithmetic. Double precision should be used to get more accurate results.
The value of the precision
option takes precedence over
that implied by the governing coordinate system name, including the
value of the coordinate-system
option. For example, if the
governing coordinate system is "wgs84/double" and the precision
option is "float", then the operation uses single precision.
geo:interior-point(cts:polygon("10,10 20,20 50,50 10,10")) => a cts:point with the coordinates 30,25
xquery version "1.0-ml"; import module namespace op = 'http://marklogic.com/optic' at 'MarkLogic/optic.xqy'; import module namespace ogeo = 'http://marklogic.com/optic/expression/geo' at 'MarkLogic/optic/optic-geo.xqy'; (: Optic example using the Value Processing Function ogeo:interior-point() :) let $plan:= op:from-view('buildings', 'builds') =>op:bind(op:as('result',ogeo:interior-point(op:col('poly')))) =>op:select(('result', op:col('geoid'))) =>op:order-by('result') return $plan=>op:result() (: ==> rows representing an interior point of the 'poly' column :)
xquery version "1.0-ml"; xdmp:sql("select ST_PointOnSurface(poly) from builds order by geoid limit 20") (: ==> rows representing an interior point of the 'poly' column :)