6.11. 空间关系函数
6.11.1. ST_3DIntersects
ST_3DIntersects —如果几何对象在3维空间内相交,则返回TRUE。
用法
boolean ST_3DIntersects( geometry geomA , geometry geomB );
描述
覆盖、接触(相切)、包含都属于空间相交。上述的任意一种都返回TRUE,那么这些几何对象也是空间相交的。空间不相交则返回FALSE。
注意
该函数会自动生成一个bounding box用于利用几何对象上的索引。
-
这个函数支持3D对象,并且不会删除z坐标。
-
该函数支持 Polyhedral Surface类型几何对象。
-
该函数支持 Trangle 和 TIN 类型几何对象。
-
该函数方法实现了规范 SQL/MM specification,SQL-MM 3。
Geometry 样例
SELECT ST_3DIntersects(pt, line), ST_Intersects(pt,line) FROM (SELECT 'POINT(0 0 2)'::geometry As pt, 'LINESTRING (0 0 1, 0 2 3 )'::geometry As line) As foo; st_3dintersects | st_intersects -----------------+--------------- f | t (1 row)
参考
ST_Intersects
6.11.2. ST_Contains
ST_Contains—当且仅当几何对象B的所有点没有在几何对象A的外部,并且B最少有一个点在A的内部。
用法
boolean ST_Contains(geometry geomA, geometry geomB);
描述
当且仅当几何对象B的所有点没有在几何对象A的外部,并且B最少有一个点在A的内部。
该定义的一个重要差别是几何对象不包含B的边界,但A会包含自己的边界。 和函数ST_ContainsProperly对比而言,ST_ContainsProperly函数几何对象不会完全包含自身边界。 如果几何对象B完全在几何对象A范围内,则返回TRUE。该函数只有在输入的几何对象处于相同的坐标投影系中,有相同的SRID才有使用意义。 函数ST_Contains是函数ST_Within逆功能函数。 因此ST_Contains(A,B)的值和ST_Within(B,A)值是一样的,除非输入的几何对象是无效的几何对象,因为这种情况下返回的总是错误的。
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
Important
不要将该函数用于无效的几何对象,否则会得到不可预料的结果。
该函数会自动生成一个bounding box用于利用几何对象上的索引。如果不想使用索引,请使用函数 _ST_Contains。
注意: 这是一个允许返回逻辑值,而不是整型值的版本
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3 - same as within(geometry B, geometry A)
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.31。函数ST_Contains 和 ST_Within 有一些不直观但很确定的差别。更多细节请查看Subtleties of OGC Covers, Contains, Within
样例
函数 ST_Contains 在如下表格列出的场景中必定会返回 TRUE
ST_Contains 空间谓词在如下情况中返回 FALSE
一个位于圆位于另一个圆的内部
SELECT ST_Contains(smallc, bigc) As smallcontainsbig, ST_Contains(bigc,smallc) As bigcontainssmall, ST_Contains(bigc, ST_Union(smallc, bigc)) as bigcontainsunion, ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; smallcontainsbig | bigcontainssmall | bigcontainsunion | bigisunion | bigcoversexterior | bigcontainsexterior ------------------+------------------+------------------+------------+-------------------+------------------------ f | t | t | t | t | f
下边的例子展示了 ST_Contains 与 ST_ContainsProperly 的不同:
SELECT ST_GeometryType(geomA) As geomtype, ST_Contains(geomA,geomA) AS acontainsa, ST_ContainsProperly(geomA, geomA) AS acontainspropa, ST_Contains(geomA, ST_Boundary(geomA)) As acontainsba, ST_ContainsProperly(geomA, ST_Boundary(geomA)) As acontainspropba FROM (VALUES ( ST_Buffer(ST_Point(1,1), 5,1) ), ( ST_MakeLine(ST_Point(1,1), ST_Point(-1,-1) ) ), ( ST_Point(1,1) ) ) As foo(geomA); geomtype | acontainsa | acontainspropa | acontainsba | acontainspropba --------------+------------+----------------+-------------+----------------- ST_Polygon | t | f | f | f ST_LineString | t | f | f | f ST_Point | t | t | f | f
参考
ST_Boundary, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Equals, ST_Within
6.11.3. ST_ContainsProperly
ST_ContainsProperly — 如果输入几何对象B和几何对象A的内部相交,但不和A的边界(或外部)有接触,那么返回TRUE。
用法
boolean ST_ContainsProperly(geometry geomA, geometry geomB);
描述
如果输入几何对象B和几何对象A的内部相交,但不和A的边界(或外部)有接触,那么返回TRUE。每个其他几何对象的点是该几何对象内部的一个点。对于DE-9IM 规范的两个几何对象的的相交结果矩阵与ST_Relate函数使用的[T**FF*FF*]相匹配。
注意
从JTS文档轻微改动一下:该函数相比较函数ST_Contains 和函数 ST_Intersects 的优势是该函数计算更高效,因为没有必要对每个点计算拓扑的必要。一个使用该函数的例子是计算包含一个很大的多边形几何对象的集合的交集。因为计算交集是一个相当慢的操作,使 用函数ST_ContainsProperly来过滤掉完全在区域内部的测试对象会更高效。在这些样例中,交集是一个优先的原始测试几何对象。
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
Important
不要将该函数应用于无效的几何对象上,否则会得到不可预料的结果。
该函数使用时候会自动生成一个bounding box,以便充分利用几何对象上的任意一个索引。 如果想避免使用索引,使用函数 _ST_ContainsProperly。
样例
一个位于圆位于另一个圆的内部
SELECT ST_ContainsProperly(smallc, bigc) As smallcontainspropbig, ST_ContainsProperly(bigc,smallc) As bigcontainspropsmall, ST_ContainsProperly(bigc, ST_Union(smallc, bigc)) as bigcontainspropunion, ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_ContainsProperly(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; smallcontainspropbig| bigcontainspropsmall | bigcontainspropunion | bigisunion | bigcoversexterior | bigcontainsexterior --------------------+----------------------+----------------------+------------+-------------------+---------------------- f | t | f | t | t | f --example demonstrating difference between contains and contains properly SELECT ST_GeometryType(geomA) As geomtype, ST_Contains(geomA,geomA) AS acontainsa, ST_ContainsProperly(geomA, geomA) AS acontainspropa, ST_Contains(geomA, ST_Boundary(geomA)) As acontainsba, ST_ContainsProperly(geomA, ST_Boundary(geomA)) As acontainspropba FROM (VALUES ( ST_Buffer(ST_Point(1,1), 5,1) ), ( ST_MakeLine(ST_Point(1,1), ST_Point(-1,-1) ) ), ( ST_Point(1,1) ) ) As foo(geomA); geomtype | acontainsa | acontainspropa | acontainsba | acontainspropba --------------+------------+----------------+-------------+----------------- ST_Polygon | t | f | f | f ST_LineString | t | f | f | f ST_Point | t | t | f | f
参考
ST_GeometryType, ST_Boundary, ST_Contains, ST_Covers, ST_CoveredBy, ST_Equals, ST_Relate, ST_Within
6.11.4. ST_Covers
ST_Covers—如果geometry或geography对象B的所有点都不在geometry或geography对象A的外部,则返回1(即TRUE)
用法
boolean ST_Covers(geometry geomA, geometry geomB); boolean ST_Covers(geography geogpolyA, geography geogpointB);
描述
如果geometry或geography对象B的所有点都不在geometry或geography对象A的外部,则返回1(即TRUE)。
该函数由GEOS模块支持
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
Important
对于geography类型,只支持Polygon覆盖point这样的场景。
Important
不要将该函数应用于无效的几何对象上,否则会得到不可预料的结果。
该函数使用时候会自动生成一个bounding box,以便充分利用几何对象上的任意一个索引。如果想避免使用索引,使用函数 _ST_Covers 。
这是一个返回逻辑值而不是整型值的可用版本。
这个函数非OGC标准函数,oracle也有这个函数。
该函数与函数ST_Contains 和 ST_Within有不显而易见但却真实存在的细微差别。详细情况请查看 Subtleties of OGC Covers, Contains, Within 。
样例
几何对象的例子,一个圆覆盖另一个圆
SELECT ST_Covers(smallc,smallc) As smallinsmall, ST_Covers(smallc, bigc) As smallcoversbig, ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior, ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; smallinsmall | smallcoversbig | bigcoversexterior |bigcontainsexterior --------------+----------------+-------------------+--------------------- t | f | t | f (1 row)
地理对象的例子,一个带有 300 米缓冲区的点与另一个带有 10 米缓冲区的点比较。
SELECT ST_Covers(geog_poly, geog_pt) As poly_covers_pt, ST_Covers(ST_Buffer(geog_pt,10), geog_pt) As buff_10m_covers_cent FROM (SELECT ST_Buffer(ST_GeogFromText('SRID=4326;POINT(-99.327 31.4821)'), 300) As geog_poly, ST_GeogFromText('SRID=4326;POINT(-99.33 31.483)') As geog_pt ) As foo; poly_covers_pt |buff_10m_covers_cent ----------------+------------------ f | t
参考
ST_Contains, ST_CoveredBy, ST_Within
6.11.5. ST_CoveredBy
ST_CoveredBy—如果geometry或geography对象A的所有点都不在geometry或geography对象B的外部,则返回1(即TRUE)。
用法
boolean ST_CoveredBy(geometry geomA, geometry geomB); boolean ST_CoveredBy(geography geogA, geography geogB);
描述
如果geometry或geography对象A的所有点都不在geometry或geography对象B的外部,则返回1(即TRUE)。
该函数由GEOS模块支持
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
Important
不要将该函数应用于无效的几何对象上,否则会得到不可预料的结果。
可用版本:需要 GEOS >= 3.0
该函数使用时候会自动生成一个bounding box,以便充分利用几何对象上的任意一个索引。如果想避免使用索引,请使用函数 _ST_CoveredBy 。
这是一个返回逻辑值而不是整型值的可用版本。
这个函数非OGC标准函数,oracle也有这个函数。
该函数与函数ST_Contains 和 ST_Within有不显而易见但却真实存在的细微差别。
详细情况请查看 Subtleties of OGC Covers, Contains, Within 。
样例
一个圆被另一个圆覆盖
SELECT ST_CoveredBy(smallc,smallc) As smallinsmall, ST_CoveredBy(smallc, bigc) As smallcoveredbybig, ST_CoveredBy(ST_ExteriorRing(bigc), bigc) As exteriorcoveredbybig, ST_Within(ST_ExteriorRing(bigc),bigc) As exeriorwithinbig FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc, ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo; smallinsmall | smallcoveredbybig | exteriorcoveredbybig | exeriorwithinbig --------------+-------------------+----------------------+------------------ t | t | t | f (1 row)
参考
ST_Contains, ST_Covers, ST_ExteriorRing, ST_Within
6.11.6. ST_Crosses
ST_Crosses —如果两个输入的对象有部分交集但不是完全相交,则该函数返回TRUE。
用法
boolean ST_Crosses(geometry g1, geometry g2);
描述
如果两个输入的对象有部分交集但不是完全相交,则该函数返回TRUE。 输入的几何对象之间的交集不能是空集,同时相交集合对象的维度必须比两个输入对象的最大维度值要小。 除此之外,两个几何对象相交的部分不能是输入的其中任意一个对象。否则返回FALSE。 上面的描述,用下面的数学公式表达如下两个几何对象的DE-9IM相交矩阵可能结果如下:
-
T*T****** (对 Point/Line, Point/Area, 和 Line/Area 情形)
-
T*****T** (对 Line/Point, Area/Point, 和 Area/Line 情形)
-
0******** (对 Line/Line 情形)
对于任意其他维度的组合情况,返回值都是false
OpenGIS的 Simple Features Specification规范定义了该函数只适用于Point/Line, Point/Area, Line/Line, 和Line/Area情况。 KGIS 扩展了这个规范的定义来对Line/Point, Area/Point and Area/Line 一样支持。这让两者关系看起来对称一些。
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
注意
该函数会自动生成一个bounding box以便充分利用几何对象上的任意索引。
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.13.3。
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.29。
样例
下表列出的均返回 TRUE.
考虑一个用户有两个表的场景:一个表名是 roads,一个表名是 highways。
考虑一个用户有两个表的场景:一个表名是roads,一个表名是highways。
CREATE TABLE roads ( id serial NOT NULL, the_geom geometry, CONSTRAINT roads_pkey PRIMARY KEY ( road_id) ); | CREATE TABLE highways ( id serial NOT NULL, the_gem geometry, CONSTRAINT roads_pkey PRIMARY KEY( road_id) ); |
为了得到穿过高速公路的所有普通路的记录,使用类似如下查询:
SELECT roads.id FROM roads, highways WHERE ST_Crosses(roads.the_geom, highways.the_geom);
6.11.7. ST_LineCrossingDirection
ST_LineCrossingDirection—根据两个LINESTRING,返回一个范围在-3到3之间的数字,该数字表示这两个LINESTRING的相交方式。0表示这两个LINESTRING没有相交关系。
用法
integer ST_LineCrossingDirection(geometry linestringA, geometry linestringB);
描述
根据两个LINESTRING,返回一个范围在-3到3之间的数字,该数字表示这两个LINESTRING的相交方式。0表示这两个几何对象没有相交关系。该函数返回的整型常量值定义如下:
-
0: LINE NO CROSS
-
-1: LINE CROSS LEFT
-
1: LINE CROSS RIGHT
-
-2: LINE MULTICROSS END LEFT
-
2: LINE MULTICROSS END RIGHT
-
-3: LINE MULTICROSS END SAME FIRST LEFT
-
3: LINE MULTICROSS END SAME FIRST RIGHT
样例
图 6.11.1 一号线(绿色)和 2 号线(蓝色)圆形端为起点,三角形端为终点,查询如下:
SELECT ST_LineCrossingDirection(foo.line1 , foo.line2) As l1_cross_l2 , ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1 FROM ( SELECT ST_GeomFromText('LINESTRING(25 169, 89 114,40 70,86 43)') As line1, ST_GeomFromText('LINESTRING(171 154, 20 140,71 74,161 53)') As line2 ) As foo; l1_cross_l2 | l2_cross_l1 -------------+------------- 3 | -3
图 6.11.2 一号线(绿色)和 2 号线(蓝色)圆形端为起点,三角形端为终点,查询如下:
SELECT ST_LineCrossingDirection(foo.line1, foo.line2) As l1_cross_l2 , ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1 FROM ( SELECT ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As line1, ST_GeomFromText('LINESTRING (171 154, 20 140, 71 74, 2.99 90.16)') As line2 ) As foo; l1_cross_l2 | l2_cross_l1 -------------+------------- 2 | -2
图 6.11.3 一号线(绿色)和 2 号线(蓝色)圆形端为起点,三角形端为终点,查询如下:
SELECT ST_LineCrossingDirection(foo.line1 , foo.line2) As l1_cross_l2 , ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1 FROM ( SELECT ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As line1, ST_GeomFromText('LINESTRING(20 140,71 74,161 53)') As line2 ) As foo; l1_cross_l2 | l2_cross_l1 -------------+------------- -1 | 1
图 6.11.4 一号线(绿色)和 2 号线(蓝色)圆形端为起点,三角形端为终点,查询如下:
SELECT ST_LineCrossingDirection(foo.line1 , foo.line2) As l1_cross_l2 , ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1 FROM ( SELECT ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As line1, ST_GeomFromText('LINESTRING (2.99 90.16,71 74,20 140,171)') As line2 ) As foo; l1_cross_l2 | l2_cross_l1 -------------+------------- 2 | -2
SELECT s1.gid, s2.gid, ST_LineCrossingDirection(s1.the_geom, s2.the_geom) FROM streets s1 CROSS JOIN streets s2 ON (s1.gid != s2.gid AND s1.the_geom && s2.the_geom ) WHERE ST_CrossingDirection(s1.the_geom, s2.the_geom) > 0;
参考
ST_Crosses
6.11.8. ST_Disjoint
ST_Disjoint—如果两个几何对象没有空间相交则返回TRUE,如果他们没有共同的空间。
用法
boolean ST_Disjoint( geometry A , geometry B );
描述
覆盖、相切、包含都不是空间不想交,如果上述的任意一种情况返回TRUE,那么都意味着几何对象没有空间不想交。 空间相交的话该函数返回FALSE。
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
注意
该函数调用时候不会使用索引。
注意
这是一个“允许”返回boolean值而不是integer值的版本。
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 //s2.1.13.3 - a.Relate(b, 'FF*FF****')。
-
该函数方法实现了规范 SQL/MM specification。 SQL-MM 3: 5.1.26。
样例
SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry); st_disjoint --------------- t (1 row) SELECT ST_Disjoint('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry); st_disjoint --------------- f (1 row)
参考
ST_Intersects
6.11.9. ST_Equals
ST_Equals — 返回给定的几何对象是否是相同的几何对象,不考虑几何对象之间的方向差异。
用法
boolean ST_Equals(geometry A, geometry B);
描述
返回给定的几何对象是否是相同的几何对象,不考虑几何对象之间的方向差异。该函数的返回结果比等号'='运算符的结果“更好”。空间意义上的相同意味着下面等式的成立: ST_Within(A,B) = true 和 ST_Within(B,A) = true ,同时也意味着几何对象的点的排序可能是不同的,但是表示相同的几何结构。为了确保点的顺序是一致的,使用函数ST_OrderingEquals (必须注意的是ST_OrderingEquals比简单验证点的顺序是否相同要更加严格)。
Important
如果输入的任意一个几何对象是无效的,那么除非这两个几何对象在二进制层面上完全相同,否则也会返回FALSE。
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2。
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.24。
样例
SELECT ST_Equals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)')); st_equals ----------- t (1 row) SELECT ST_Equals(ST_Reverse(ST_GeomFromText('LINESTRING(0 0, 10 10)')), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)')); st_equals ----------- t (1 row)
参考
ST_IsValid, ST_OrderingEquals, ST_Reverse, ST_Within
6.11.10. ST_Intersects
ST_Intersects —如果Geometries/Geography在2维空间内有相交(有共同的空间部分),则返回TRUE。 如果他们不相交,那么返回FALSE。对于geography类型对象—误差是0.00001米(因此许多很靠近的点会被认为是相交(即重合))。
用法
boolean ST_Intersects( geometry geomA , geometry geomB ); boolean ST_Intersects( geography geogA , geography geogB );
描述
如果Geometries/Geography在2维空间内有相交(有共同的空间部分),则返回TRUE。 如果他们不相交,那么返回FALSE。对于geography类型对象—误差是0.00001米(因此许多很靠近的点会被认为是相交(即重合))。
覆盖、接触(相切)、包含都属于空间相交。上述的任意一种都返回TRUE,那么这些几何对象也是空间相交的。空间不相交则返回FALSE。
注意
该函数会自动生成一个bounding box以便充分利用几何对象上的任意索引。
注意
对于geography对象,该函数的距离误差是0.00001米,并且使用球面参考系而不是椭球参考系来计算。
注意
这是一个返回逻辑值而不是整型值的可用版本。
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 //s2.1.13.3 -ST_Intersects(g1, g2) --> Not (ST_Disjoint(g1, g2 )) 两者等价。
-
该函数方法实现了规范 SQL/MM specification。 SQL-MM 3: 5.1.27。
-
该函数支持二维的 TIN。
Geometry 样例
SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry); st_intersects --------------- f (1 row) SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry); st_intersects --------------- t (1 row)
Geography 样例
SELECT ST_Intersects( ST_GeographyFromText('SRID=4326;LINESTRING(-43.23456 72.4567,-43.23456 72.4568)'), ST_GeographyFromText('SRID=4326;POINT(-43.23456 72.4567972)') ); st_intersects --------------- t
参考
ST_3DIntersects, ST_Disjoint
6.11.11. ST_OrderingEquals
ST_OrderingEquals — 如果两个输入的几何对象表示相同的几何对象,并且几何对象的点的顺序也是一致的,那么返回值为TRUE。
用法
boolean ST_OrderingEquals(geometry A, geometry B);
描述
如果两个输入的几何对象表示相同的几何对象,并且几何对象的点的顺序也是一致的,那么返回值为TRUE,否则返回FALSE。
注意
该函数是按照ArcSDE的SQL 规范而不是SQL-MM的规范实现的,参考:Esri | There has been a problem 。
-
该函数方法新版本也实现了规范 SQL/MM specification. SQL-MM 3: 5.1.43 。
样例
SELECT ST_OrderingEquals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 5 5, 10 10)')); st_orderingequals ----------- f (1 row) SELECT ST_OrderingEquals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 0 0, 10 10)')); st_orderingequals ----------- t (1 row) SELECT ST_OrderingEquals(ST_Reverse(ST_GeomFromText('LINESTRING(0 0, 10 10)')), ST_GeomFromText('LINESTRING(0 0, 0 0, 10 10)')); st_orderingequals ----------- f (1 row)
SELECT ST_OrderingEquals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(10 10, 0 0)')); st_orderingequals ----------- f (1 row) SELECT ST_OrderingEquals(ST_GeomFromText('LINESTRING(0 0, 10 10)'),ST_GeomFromText('LINESTRING(0 0, 10 10)')); st_orderingequals ----------- t (1 row) SELECT ST_OrderingEquals(ST_GeomFromText('LINESTRING(0 0, 10 10)'), ST_GeomFromText('LINESTRING(0 0, 0 0, 10 10)')); st_orderingequals ----------- f (1 row)
参考
ST_Equals, ST_Reverse
6.11.12. ST_Overlaps
ST_Overlaps — 如果几何对象之间有共同的空间,相同的维度,但是互相之间没有相互包含,那么返回TRUE。
用法
boolean ST_Overlaps(geometry A, geometry B);
描述
如果两个几何对象有空间覆盖,就是两个几何对象之间有交集,但互相之间没有相互包含。
注意
该函数支持GeometryCollection参数。
该函数使用时候会自动生成一个bounding box,以便充分利用几何对象上的任意一个索引。 如果想避免使用索引,使用函数ST_Overlaps。 这是一个返回逻辑值而不是整型值的可用版本。
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.32
样例
下面的情况都返回 TRUE
一个位于线上的点是被线所包含的,且低一个维度,因此它与线的关系不会是重叠或穿越。
SELECT ST_Overlaps(a,b) As a_overlap_b, ST_Crosses(a,b) As a_crosses_b, ST_Intersects(a, b) As a_intersects_b, ST_Contains(b,a) As b_contains_a FROM (SELECT ST_GeomFromText('POINT(1 0.5)') As a, ST_GeomFromText('LINESTRING(1 0, 1 1, 3 5)') As b) As foo; a_overlap_b | a_crosses_b | a_intersects_b | b_contains_a ------------+-------------+----------------+-------------- f | f | t | t
一条线被一个圆部分包含但不是全部包含,符合相交和穿越的定义,但因为它们的维度不同,所以符合重叠的定义。
SELECT ST_Overlaps(a,b) As a_overlap_b, ST_Crosses(a,b) As a_crosses_b, ST_Intersects(a, b) As a_intersects_b, ST_Contains(a,b) As a_contains_b FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 0.5)'), 3) As a, ST_GeomFromText(' LINESTRING(1 0, 1 1, 3 5)') As b) As foo; a_overlap_b | a_crosses_b | a_intersects_b | a_contains_b -------------+-------------+----------------+-------------- f | t | t | f -- a 2-dimensional bent hot dog (aka buffered line string) that intersects a circle, -- but is not fully contained by the circle is defined as overlapping since they are of the same dimension, -- but it does not cross, because the intersection of the 2 is of the same dimension -- as the maximum dimension of the 2
一个二维、弯曲的热狗(其实是一条带有缓冲区的线)与一个圆相交,但没有被这个圆完全包含,符合重叠的定义,因为它们有相同的维度, 但这种情况不是穿越,因为两者的维度是相同的,都是两者的最大维度 2。
SELECT ST_Overlaps(a,b) As a_overlap_b, ST_Crosses(a,b) As a_crosses_b, ST_Intersects(a, b) As a_intersects_b, ST_Contains(b,a) As b_contains_a, ST_Dimension(a) As dim_a, ST_Dimension(b) as dim_b, ST_Dimension(ST_Intersection(a,b)) As dima_intersection_b FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 0.5)'), 3) As a, ST_Buffer(ST_GeomFromText('LINESTRING(1 0, 1 1, 3 5)'),0.5) As b) As foo; a_overlap_b | a_crosses_b | a_intersects_b | b_contains_a | dim_a | dim_b | dima_intersection_b -------------+-------------+----------------+--------------+-------+-------+------------------- t | f | t | f | 2 | 2 |2
参考
ST_Contains, ST_Crosses, ST_Dimension, ST_Intersects
6.11.13. ST_Relate
ST_Relate — 根据输入参数intersectionMatrixPattern的值,检查两个几何对象的内部、边界、外部是否有相交,如果有,则返回true。
用法
boolean ST_Relate(geometry geomA, geometry geomB, text intersectionMatrixPattern); text ST_Relate(geometry geomA, geometry geomB); text ST_Relate(geometry geomA, geometry geomB, int BoundaryNodeRule);
描述
函数形式 1:输入参数geomA, geomB, intersectionMatrix ,检查两个几何对象的内部、边界、外部是否有相交,如果有返回1(TRUE) ,参考 DE-9IM matrix pattern 。
该函数对于一步检查两个几何对象的相交,交叉等关系时候很有用。
注意
这是一个返回逻辑值而不是整型值的可用版本,并在OGC SPEC规范中有定义。
注意
该函数不会自动使用索引,因为两个几何对象的关系可能是相反的,例如不相交。如果正在使用一个需要进行相交计算的查询,使用运算符&&,它会使用索引。
形式 2: 输入参数 geomA and geomB ,返回值参考章节3.3.6
形式 3: 和形式2一样是允许指定一个边界点规则 (1:OGC/MOD2, 2:Endpoint, 3:MultivalentEndpoint, 4:MonovalentEndpoint)
注意
该函数不在OGC 规范中
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.25
样例
查找所有与多边形相交而非接触的几何元素:
SELECT l.* , b.name As poly_name FROM polys As b INNER JOIN compounds As l ON (p.the_geom && b.the_geom AND ST_Relate(l.the_geom, b.the_geom,'T********'));
计算相应空间关系的相交矩阵:
SELECT ST_Relate(ST_GeometryFromText('POINT(1 2)'), ST_Buffer(ST_GeometryFromText('POINT(1 2)'),2)); st_relate ----------- 0FFFFF212 SELECT ST_Relate(ST_GeometryFromText('LINESTRING(1 2, 3 4)'), ST_GeometryFromText(' LINESTRING(5 6, 7 8)')); st_relate ----------- FF1FF0102
检测空间关系:
SELECT ST_Relate(ST_GeometryFromText('POINT(1 2)'), ST_Buffer(ST_GeometryFromText('POINT(1 2)'),2), '0FFFFF212'); st_relate ----------- t SELECT ST_Relate(ST_GeometryFromText('POINT(1 2)'), ST_Buffer(ST_GeometryFromText('POINT(1 2)'),2), '*FF*FF212'); st_relate ----------- t
参考
ST_Crosses, ST_Disjoint, ST_Intersects, ST_Touches
6.11.14. ST_RelateMatch
ST_RelateMatch — 如果参数 intersectionMatrix 满足了 intersectionMatrixPattern 参数对应的空间关系,则返回TRUE。
用法
boolean ST_RelateMatch(text intersectionMatrix, text intersectionMatrixPattern);
描述
如果参数 intersectionMatrix 满足了 intersectionMatrixPattern 参数对应的空间关系,则返回TRUE。更多信息参考章节3.3.6。
样例
SELECT ST_RelateMatch('101202FFF', 'TTTTTTFFF') ; result -------- t
一个通用相交矩阵模式和若干相交矩阵的例子,其中包括一个含有非法几何对象的例子:
SELECT mat.name, pat.name, ST_RelateMatch(mat.val, pat.val) As satisfied FROM ( VALUES ('Equality', 'T1FF1FFF1'), ('Overlaps', 'T*T***T**'), ('Within', 'T*F**F***'), ('Disjoint', 'FF*FF****') As pat(name,val) CROSS JOIN ( VALUES ('Self intersections (invalid)', '111111111'), ('IE2_BI1_BB0_BE1_EI1_EE2', 'FF2101102'), ('IB1_IE1_BB0_BE0_EI2_EI1_EE2', 'F11F00212') ) As mat(name,val);
参考
3.3.6节, ST_Relate
6.11.15. ST_Touches
ST_Touches — 如果两个几何对象最少有一个共同点且他们的内部并不相交,那么返回TRUE。
用法
boolean ST_Touches(geometry g1, geometry g2);
描述
如果输入几何对象g1和g2在他们的边界上面只有一个共同点,那么返回TRUE。该函数适用于如下组合: Area/Area, Line/Line, Line/Area, Point/Area and Point/Line ,但是不适用于g1和g2都是点用数学公式表示如下:
两个几何对象允许的 DE-9IM 规范相交结果矩阵如下:
-
FT*******
-
F**T*****
-
F***T****
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
注意
该函数会自动生成一个bounding box以便充分利用几何对象上的任意索引. To avoid using an index, use_ST_Touches instead.
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.28
样例
如下情形,函数 ST_Touche 均返回 TRUE
SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(1 1)'::geometry); st_touches ------------ f (1 row) SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(0 2)'::geometry); st_touches ------------ t (1 row)
6.11.16. ST_Within
ST_Within — 如果输入几何对象A完全在几何对象B范围内,则返回TRUE。
用法
boolean ST_Within(geometry A, geometry B);
描述
如果输入几何对象A完全在几何对象B范围内,则返回TRUE,该函数的输入对象必须在相同的坐标投影钟,有相同的SRID才有意义。如果ST_Within(A,B) 的值是true,同时ST_Within(B,A) 也是true,那么这两个几何对象是完全相同的。
该函数由GEOS模块支持
Important
该函数支持GEOMETRYCOLLECTION类型对象作为输入参数。
Important
不要将该函数应用于无效的几何对象上,否则会得到不可预料的结果。
-
该函数使用时候会自动生成一个bounding box,以便充分利用几何对象上的任意一个索引。如果想避免使用索引,使用函数ST_Within.这是一个返回逻辑值而不是整型值的可用版本。
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3 - a.Relate(b,'T*F**F***')。
-
该函数方法实现了规范 SQL/MM specification。 SQL-MM 3: 5.1.30。
样例
一个圆在另一个圆内部:
SELECT ST_Within(smallc,smallc) As smallinsmall, ST_Within(smallc, bigc) As smallinbig,ST_Within(bigc,smallc) As biginsmall, ST_Within(ST_Union(smallc, bigc), bigc) as unioninbig, ST_Within(bigc, ST_Union(smallc, bigc)) as biginunion,ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion FROM( SELECT ST_Buffer(ST_GeomFromText('POINT(50 50)'), 20) As smallc, ST_Buffer(ST_GeomFromText('POINT(50 50)'), 40) As bigc) As foo; smallinsmall | smallinbig | biginsmall | unioninbig | biginunion |bigisunion --------------+------------+------------+------------+------------+------------ t | t | f | t | t | t (1 row)
参考
ST_Contains, ST_Equals, ST_IsValid
6.11.17. ST_3DDWithin
ST_3DDWithin —如果两个3d(z)几何对象的三维距离指定的距离值范围内,则返回TRUE。
用法
boolean ST_3DDWithin(geometry g1, geometry g2, double precision distance_of_srid);
描述
如果两个几何对象的三维距离指定的距离值范围内,则返回TRUE,距离单位以(SRS表中单位为准)。
这个函数支持3D对象,并且不会删除z坐标。
-
该函数支持 Polyhedral Surface类型几何对象。
-
该函数方法实现了规范 SQL/MM specification。 SQL-MM 。
样例
几何类型的例子,单位为米(SRID: 2163 US National Atlas Equal area) ,#维点和线与二维点和线相比较。 注意:当前没有垂直方向上的数据支持,因此 Z 坐标不会被转换,并且会假设其单位为转换后的最终单位。
SELECT ST_3DDWithin( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 20)'),2163), 126.8 ) As within_dist_3d, ST_DWithin( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 20)'),2163), 126.8 ) As within_dist_2d; within_dist_3d | within_dist_2d ----------------+---------------- f | t
参考
ST_3DDistance, ST_Distance, ST_DWithin, ST_3DMaxDistance, ST_Transform
6.11.18. ST_3DDFullyWithin
ST_3DDFullyWithin —如果3D对象的距离在另一个指定的距离值范围内,则返回TRUE。
用法
boolean ST_3DDFullyWithin(geometry g1, geometry g2, double precision distance);
描述
如果3D对象的距离在另一个指定的距离值范围内,则返回TRUE。指定的距离单位是SRS表中规定的单位。该函数的输入几何对象必须都在同一个坐标投影中,有相同的SRID。
注意
该函数使用时候会自动生成一个bounding box,以便充分利用几何对象上的任意一个索引。
-
这个函数支持3D对象,并且不会删除z坐标。
-
该函数支持 Polyhedral Surface类型几何对象。
样例
下边这个例子比较了 fully within 与 distance within 的区别, 以及点/线的2D足迹 distance fully within 与 3D fully within 的区别:
SELECT ST_3DDFullyWithin(geom_a, geom_b, 10) as D3DFullyWithin10, ST_3DDWithin(geom_a, geom_b, 10) as D3DWithin10, ST_DFullyWithin(geom_a, geom_b, 20) as D2DFullyWithin20, ST_3DDFullyWithin(geom_a, geom_b, 20) as D3DFullyWithin20 from (select ST_GeomFromEWKT('POINT(1 1 2)') as geom_a, ST_GeomFromEWKT('LINESTRING(1 5 2, 2 7 20, 1 9 100, 14 12 3)') as geom_b) t1; d3dfullywithin10 | d3dwithin10 | d2dfullywithin20 | d3dfullywithin20 ------------------+-------------+------------------+------------------ f | t | t | f
参考
ST_3DMaxDistance, ST_3DDWithin, ST_DWithin, ST_DFullyWithin
6.11.19. ST_DFullyWithin
ST_DFullyWithin — 如果输入的所有几何对象之间的距离都在一个指定的距离内,那么返回TRUE。
用法
boolean ST_DFullyWithin(geometry g1, geometry g2, double precision distance);
描述
如果几何对象的距离完全在另一个指定的距离值范围内,则返回TRUE。指定的距离单位是SRS表中规定的单位。该函数的输入几何对象必须都在同一个坐标投影中,有相同的SRID。
注意
该函数会自动生成一个bounding box以便充分利用几何对象上的任意索引。
样例
system=# SELECT ST_DFullyWithin(geom_a, geom_b, 10) as DFullyWithin10, ST_DWithin(geom_a, geom_b, 10) as DWithin10, ST_DFullyWithin(geom_a, geom_b, 20) as DFullyWithin20 from (select ST_GeomFromText('POINT(1 1)') as geom_a,ST_GeomFromText('LINESTRING(1 5, 2 7, 1 9, 14 12)') as geom_b) t1; DFullyWithin10 | DWithin10| DFullyWithin20 ---------------+----------+--------------- f | t | t
参考
ST_MaxDistance, ST_DWithin
6.11.20. ST_DWithin
ST_DWithin — 如果输入的几何对象的都在以一个点为中心的指定的距离范围内则返回TRUE。 对于geometry类型对象,单位以SRS表中的距离单位为标准。 如果是geography类型,单位是米。默认的计算方式是use_spheroid=true(以椭球面为参考系), 如果想更快的检索出所需要的点,使用use_spheroid=false,该参数表示以正规的球体为参考系。
用法
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid); boolean ST_DWithin(geography gg1, geography gg2,double precision distance_meters); boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
描述
如果输入的几何对象的都在以一个点为中心的指定的距离范围内则返回TRUE。对于geometry类型对象,单位以SRS表中的距离单位为标准。 如果是geography类型,单位是米。该函数只有输入对象是同一个投影系中,有相同的SRID才有意义。 如果是geography类型,单位是米。默认的计算方式是use_spheroid=true(以WGS 84椭球面为参考系), 如果想更快的检索出所需要的点,使用use_spheroid=false,该参数表示以正规的球体为参考系。
注意
该函数会自动生成一个bounding box以便充分利用几何对象上的任意索引。
注意
如果输入参数是3D 几何对象,使用函数ST_3DDWithin。
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1。
样例
查找离每所学校最近的医院(位于学校附件3000个距离单位范围内)。 我们使用 ST_DWithin 来查询并利用索引来限制搜索列表的大小,因为 ST_Distance 不会利用索引。 如果空间参考系的长度单位是米,则上述距离的单位就是米。
SELECT DISTINCT ON (s.gid) s.gid, s.school_name, s.the_geom, h.hospital_name FROM schools s LEFT JOIN hospitals h ON ST_DWithin(s.the_geom, h.the_geom, 3000) ORDER BY s.gid, ST_Distance(s.the_geom, h.the_geom);
查找所有3000个距离单位范围内没有医院的学校。 单位是空间参考系的单位(例如:米、英尺、度)。
SELECT s.gid, s.school_name FROM schools s LEFT JOIN hospitals h ON ST_DWithin(s.the_geom, h.the_geom, 3000) WHERE h.gid IS NULL;
参考
ST_Distance, ST_Expand
6.11.21. ST_PointInsideCircle
ST_PointInsideCircle — 判定一个点是否在以 center_x, center_y 为圆心, radius 为半径的圆内部。
用法
boolean ST_PointInsideCircle(geometry a_point, float center_x, float center_y, float radius);
描述
判定一个点是否在以 center_x, center_y 为圆心, radius 为半径的圆内部。
注意
不要使用空间索引。应使用 ST_DWithin 函数。
样例
SELECT ST_PointInsideCircle(ST_Point(1,2), 0.5, 2, 3); st_pointinsidecircle ------------------------ t
参考
ST_DWithin