
geo.crosses( region-1 as cts.region, region-2 as cts.region, [options as String[]] ) as Boolean
Compares geospatial regions to see if they fulfill the 'crosses' DE-9IM relation.
This function determines whether the two regions
R1=region-1 and R2=region-2
satisfy the relationship R1 crosses 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.
const r1 = cts.polygon('POLYGON((-122.427520751953 37.6555576956251,-122.459106445313 37.5658069549294,-122.289505004883 37.5946477878735,-122.427520751953 37.6555576956251))');
const r2 = cts.polygon('POLYGON((-122.38582892471908 37.61827880006116,-122.4143247132933 37.60685626556358,-122.40436835343002 37.59352775797751,-122.38582892471908 37.61827880006116))');
geo.crosses(r2,r1,['coordinate-system=wgs84','precision=double'])
// returns true
// Optic example using the Value Processing Function op.geo.crosses()
const op = require('/MarkLogic/optic');
var linestringLit =
`LINESTRING(-77.56535787898146 36.47692315351092,
-79.03752584773146 34.61780445863212,-80.48772116023146
33.41581817447875,-81.36662741023146 31.917629384303023)`
const result=op.fromView('buildings', 'builds')
.where(op.geo.crosses(op.col('poly'),linestringLit))
.select([op.col('name'), op.col('geoid')])
.orderBy('geoid')
.result()
result;
// ==>
// rows representing names and geoids where the 'poly' column CROSSES linestringLit (a rough HWY 95)
'use strict';
// SQL example using the ST_Crosses function
const literal =
{"linestringLit":
`LINESTRING(-77.56535787898146 36.47692315351092,
-79.03752584773146 34.61780445863212,-80.48772116023146
33.41581817447875,-81.36662741023146 31.917629384303023)`}
var result = xdmp.sql('select * from builds where ST_Crosses(poly,@linestringLit) order by geoid limit 20', null, literal);
result;
// ==>
// returns rows whose 'poly' column match the DE-9IM relationship CROSSES with the provided WKT linestring
'use strict';
const op = require('/MarkLogic/optic');
// GeoSPARQL example using geof:sfCrosses()
var literal =
{
hwy:
'LINESTRING(-77.56535787898146 36.47692315351092,\
-79.03752584773146 34.61780445863212,-80.48772116023146\
33.41581817447875,-81.36662741023146 31.917629384303023)'
}
var 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:sfCrosses(?o, ?hwy, 'coordinate-system=raw')
}
ORDER BY ?s`
sem.sparql(query,literal)
// ==>
// rows representing geometries in a triple's object in the raw coordinate system
// that fulfill the CROSSES DE-9IM relation with the WKT linestring 'hwy', ordered by subject
Stack Overflow: Get the most useful answers to questions from the MarkLogic community, or ask your own question.