geo:geospatial-query( $regions as cts:region*, [$options as xs:string*], [$weight as xs:double?] ) as cts:query
Returns a query matching points within given regions.
Point values and boundary specifications of boxes are given in degrees relative to the WGS84 coordinate system. Southern latitudes and Western longitudes take negative values. Longitudes will be wrapped to the range (-180,+180) and latitudes will be clipped to the range (-90,+90).
If the northern boundary of a box is south of the southern boundary, no points will match. However, longitudes wrap around the globe, so that if the western boundary is east of the eastern boundary, then the box crosses the anti-meridian.
Special handling occurs at the poles, as all longitudes exist at latitudes +90 and -90.
The query constructed will examine points in all the supported geospatial markup vocabularies. If not all these vocabularies will be in use, it may be more efficient to use the query constructors for just the vocabulary or vocabularies that are in actual use.
xquery version "1.0-ml"; (: create a document with test data :) declare namespace gml= "http://www.opengis.net/gml"; declare namespace georss= "http://www.georss.org/georss"; xdmp:document-insert("/points.xml", <root xmlns:geo="http://marklogic.com/geospatial"> <item><gml:Point><gml:pos>10.5 30.0</gml:pos></gml:Point></item> <item><georss:point>15.35 35.34</georss:point></item> <item><Dot Latitude="5.11" Longitude="40.55"/></item> </root> ); xquery version "1.0-ml"; import module namespace geo = "http://marklogic.com/geospatial" at "/MarkLogic/geospatial/geospatial.xqy"; declare namespace gml= "http://www.opengis.net/gml"; declare namespace georss= "http://www.georss.org/georss"; declare namespace kml= "http://earth.google.com/kml/2.0"; cts:search(doc("/points.xml")//item, geo:geospatial-query( geo:box( <gml:Envelope> <gml:lowerCorner>10.0 35.0</gml:lowerCorner> <gml:upperCorner>20.0 40.0</gml:upperCorner> </gml:Envelope>) )) (: returns the following node: <item><georss:point>15.35 35.34</georss:point></item> :) , cts:search(doc("/points.xml")//item, geo:geospatial-query(geo:box( <kml:LatLongBox> <kml:north>20.0</kml:north> <kml:south>10.0</kml:south> <kml:east>35.0</kml:east> <kml:west>40.0</kml:west> </kml:LatLongBox> ))) (: returns the following nodes (wrapping around the Earth): <item><gml:Point><gml:pos>10.5 30.0</gml:pos></gml:Point></item> :) , cts:search(doc("/points.xml")//item, geo:geospatial-query( cts:box(10.0, 35.0, 20.0, 40.0))) (: returns the following node: <item><georss:point>15.35 35.34</georss:point></item> :)
Stack Overflow: Get the most useful answers to questions from the MarkLogic community, or ask your own question.