
geo:contains( $region-1 as cts:region, $region-2 as cts:region, [$options as xs:string*] ) as xs:boolean
Compares geospatial regions to see if they fulfill the 'contains' DE-9IM relation.
This function determines whether the two regions
R1=$region-1 and R2=$region-2
satisfy the relationship R1 contains R2.
The operations are defined by the Dimensionally Extended nine-Intersection Model (DE-9IM) of spatial relations.
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.
If $region-1 or $region-2 is a column, the column's
coordinate system will take precedence over the coordinate-system option.
If both $region-1 and $region-2 are columns, the query
will run unoptimized. Queries with one region column and a region literal will be
optimized.
let $r1 := cts:polygon("POLYGON((-122.38582892471908 37.61827880006116,-122.4143247132933 37.60685626556358,-122.40436835343002 37.59352775797751,-122.38582892471908 37.61827880006116))")
let $r2 := cts:polygon("POLYGON((-122.427520751953 37.6555576956251,-122.459106445313 37.5658069549294,-122.289505004883 37.5946477878735,-122.427520751953 37.6555576956251))")
return geo:contains($r2,$r1,("coordinate-system=wgs84","precision=double"))
(: returns true :)
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:contains() :)
let $polygonLit := 'POLYGON((-92.838196 34.439232,-92.836807 34.439232,-92.836807 34.437401,-92.837875 34.437416,-92.838142 34.437416,-92.838196 34.439232))'
let $plan:= op:from-view('buildings', 'builds')
=>op:where(ogeo:contains(op:col('poly'),$polygonLit))
=>op:select(('name', op:col('geoid')))
=>op:order-by('geoid')
return $plan=>op:result()
(:
==>
rows representing names and geoids where the 'poly' column CONTAINS the WKT polygon 'polygonLit'
:)
xquery version "1.0-ml";
(: SQL example using the ST_Contains function :)
let $map :=
map:new(map:entry('polyLit','POLYGON((-92.838196 34.439232,-92.836807 34.439232,-92.836807 34.437401,-92.837875 34.437416,-92.838142 34.437416,-92.838196 34.439232))'))
return xdmp:sql("select * from builds where ST_Contains(poly,@polyLit) order by geoid limit 20", (), $map)
(:
==>
returns rows whose 'poly' column match the DE-9IM relationship CONTAINS with the provided WKT polygon 'polyLit'
:)
xquery version "1.0-ml";
(: GeoSPARQL example using geof:sfContains() :)
let $map :=
map:new(map:entry('poly','POLYGON((-92.838196 34.439232,-92.836807 34.439232,-92.836807 34.437401,-92.837875 34.437416,-92.838142 34.437416,-92.838196 34.439232))'))
let $query:=
'
PREFIX my: <http://example.org/ApplicationSchema#>
PREFIX geoml: <http://marklogic.com/geospatial#>
PREFIX cts: <http://marklogic.com/cts#>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
SELECT *
WHERE { ?s my:hasExactGeometry ?o
FILTER geof:sfContains(?o, ?poly, ''coordinate-system=wgs84/double'')
}
ORDER BY ?s'
return sem:sparql($query,$map)
(:
==>
rows representing geometries in a triple's object in the wgs84 coordinate system (double precision)
that fulfill the CONTAINS DE-9IM relation with the WKT polygon 'poly', ordered by subject
:)
Stack Overflow: Get the most useful answers to questions from the MarkLogic community, or ask your own question.