名称

ST_Crosses — 测试两个几何图形是否有一些(但不是全部)共同的内点

大纲

boolean ST_Crosses(geometry g1, geometry g2);

描述

比较两个几何对象,如果它们的交集“空间交叉”,则返回 true; 也就是说,几何图形有一些但不是所有的内部点是共同的。 几何图形内部的交集必须非空,并且维度必须小于两个输入几何图形的最大维度,并且两个几何图形的交集不得等于任一几何图形。 否则,返回 false。 交叉关系是对称且非自反的。

用数学术语来说: ST_Crosses(A, B) ⇔ (dim( Int(A) ⋂ Int(B) ) < max( dim( Int(A) ), dim( Int(B) ) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)

如果 DE-9IM 交集矩阵匹配,则几何图形交叉:

  • T*T***** 适用于点/线、点/面和线/面情况

  • T***T** 用于线/点、区域/点和区域/线情况

  • 0******** 用于线/线情况

  • 对于点/点和区域/区域情况,结果是false

[注意]

OpenGIS 简单要素规范仅针对点/线、点/面、线/线和线/面情况定义此谓词。 JTS / GEOS 扩展了定义,也适用于线/点、区域/点和区域/线情况。 这使得关系对称。

[注意]

此功能自动包括利用几何上可用的任何空间索引的边界框比较。

增强:3.0.0 启用了对 GEOMETRYCOLLECTION 的支持

此方法实现了 SQL 1.1 的 OGC 简单功能规范。 s2.1.13.3

该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.29

示例

以下情况均返回true

A LineString crosses a MultiPoint when some, but not all, points lie on the line.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a,
  'MULTIPOINT (80 170,120 13,130 120,181 142)'::geometry AS b
) AS example;
栅格输出
t
Figure
Geometry figure for visual-st-crosses-01

A Polygon crosses a MultiPoint when some, but not all, points lie in its interior.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a,
  'MULTIPOINT (56 60,120 13,130 119,181 142)'::geometry AS b
) AS example;
栅格输出
t
Figure
Geometry figure for visual-st-crosses-02

A LineString crosses a Polygon when part of the line lies inside and part outside.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a,
  'LINESTRING (30 40,70 50,120 150,190 190)'::geometry AS b
) AS example;
栅格输出
t
Figure
Geometry figure for visual-st-crosses-03

Two LineStrings cross when they share an interior point.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a,
  'LINESTRING (10 10,70 30,110 120,190 190)'::geometry AS b
) AS example;
栅格输出
t
Figure
Geometry figure for visual-st-crosses-04

考虑用户有两个表的情况:道路表和高速公路表。

Code
CREATE TABLE roads (
  id serial NOT NULL,
  geom geometry,
  CONSTRAINT roads_pkey PRIMARY KEY (road_id)
);

Code
CREATE TABLE highways (
  id serial NOT NULL,
  the_gem geometry,
  CONSTRAINT roads_pkey PRIMARY KEY (road_id)
);

要确定穿过高速公路的道路列表,请使用类似于以下内容的查询:

Code
SELECT roads.id
FROM roads, highways
WHERE ST_Crosses(roads.geom, highways.geom);

相关信息

ST_Contains, ST_Overlaps