geo:distance( $p1 as cts:point, $p2 as cts:point, [$options as xs:string*] ) as xs:double
Returns the distance (in units) between two points.
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.
let $sf := cts:point(37, -122) let $ny := cts:point(40, -73) return geo:distance($sf, $ny) => 2623.2017796533
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:distance() :) let $plan:= op:from-view('buildings', 'builds') =>op:bind(op:as('result',ogeo:distance(op:col('interiorPoint'),cts:point('POINT(-98.83211485551952 36.1919336424082)'),'units=miles'))) =>op:select(('result', op:col('interiorPoint'))) =>op:order-by('result') return $plan=>op:result() (: ==> rows representing the distance in miles between each point in the 'interiorPoint' column and the wkt point 'POINT(-98.83211485551952 36.1919336424082)' sorted by distance :)
xquery version "1.0-ml"; (: SQL example using ST_Distance() :) xquery version "1.0-ml"; xdmp:sql("select ST_Distance(interiorPoint, 'POINT(-98.83211485551952 36.1919336424082)', 'units=feet') from builds order by geoid limit 20") (: ==> rows representing the distance in feet between the interiorPoint column and the WKT point 'POINT(-98.83211485551952 36.1919336424082)' sorting by geoid :)
xquery version "1.0-ml"; (: GeoSPARQL example using geof:distance() :) 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 BIND(geof:distance(?o, ''POINT(39.801681875000014 66.64631330892108)'', ''units=km'') as ?distance) FILTER BOUND(?distance) } ORDER BY ?distance' return sem:sparql($query) (: ==> rows representing the distance in kilometers between each point in a triple's object (if exists) and the wkt point 'POINT(39.801681875000014 66.64631330892108)' sorting by distance :)
Stack Overflow: Get the most useful answers to questions from the MarkLogic community, or ask your own question.