cts:element-attribute-pair-geospatial-query( $element-name as xs:QName*, $latitude-attribute-names as xs:QName*, $longitude-attribute-names as xs:QName*, $regions as cts:region*, [$options as xs:string*], [$weight as xs:double?] ) as cts:element-attribute-pair-geospatial-query
Returns a query matching elements by name which has specific attributes representing latitude and longitude values for a point contained within the given geographic box, circle, or polygon, or equal to the given point. Points that lie between the southern boundary and the northern boundary of a box, travelling northwards, and between the western boundary and the eastern boundary of the box, travelling eastwards, will match. Points contained within the given radius of the center point of a circle will match, using the curved distance on the surface of the Earth. Points contained within the given polygon will match, using great circle arcs over a spherical model of the Earth as edges. An error may result if the polygon is malformed in some way. Points equal to the a given point will match, taking into account the fact that longitudes converge at the poles. Using the geospatial query constructors requires a valid geospatial license key; without a valid license key, searches that include geospatial queries will throw an exception.
The point value is expressed as the numerical values in the textual content of the named attributes.
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 query uses single precision.
The point values and the boundary specifications 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 (that is, if the value of 'w' is greater than the value of 'e'), then the box crosses the anti-meridian.
Special handling occurs at the poles, as all longitudes exist at latitudes +90 and -90.
If neither "cached" nor "uncached" is present, it specifies "cached".
"score-function=linear" means that values that are further away from the bounds will score higher. "score-function=reciprocal" means that values that are closer to the bounds will score higher. The functions are scaled appropriately for different types, so that in general the default slope factor will provide useful results. Using a slope factor greater than 1 gives distinct scores over a smaller range of values, and produces generally higher scores. Using a slope factor less than 1 gives distinct scores over a wider range of values, and produces generally lower scores.
(: create a document with test data :) xdmp:document-insert("/points.xml", <root> <item><point lat="10.5" long="30.0"/></item> <item><point lat="15.35" long="35.34"/></item> <item><point lat="5.11" long="40.55"/></item> </root> ); cts:search(doc("/points.xml")//item, cts:element-attribute-pair-geospatial-query(xs:QName("point"), xs:QName("lat"), xs:QName("long"), cts:box(10.0, 35.0, 20.0, 40.0))); (: returns the following node: <item><point lat="15.35" long="35.34"/></item> :) cts:search(doc("/points.xml")//item, cts:element-attribute-pair-geospatial-query(xs:QName("point"), xs:QName("lat"), xs:QName("long"), cts:box(10.0, 40.0, 20.0, 35.0))); (: returns the following nodes (wrapping around the Earth): <item><point lat="10.5" long="30.0"/></item> :) cts:search(doc("/points.xml")//item, cts:element-attribute-pair-geospatial-query(xs:QName("point"), xs:QName("lat"), xs:QName("long"), cts:box(20.0, 35.0, 10.0, 40.0))) (: throws an error (latitudes do not wrap) :)
Stack Overflow: Get the most useful answers to questions from the MarkLogic community, or ask your own question.