Name

ST_Intersection — 计算表示几何图形A和B的共享部分的几何图形。

Synopsis

geometry ST_Intersection( geometry geomA , geometry geomB , float8 gridSize = -1 );

geography ST_Intersection( geography geogA , geography geogB );

描述

返回表示两个几何图形的点集交集的几何图形。换句话说,几何图形A和几何图形B在这两个几何图形之间共享的部分。

如果几何图形没有公共点(即不相交),则返回适当类型的空原子几何图形。

如果可选的 gridSize 参数,则将输入捕捉到给定大小的栅格,并在该栅格上计算结果顶点。(需要GEOS-3.9.0或更高版本)

ST_交叉口与 ST_Intersects 对于剪裁几何图形非常有用,例如在边界框、缓冲区或区域查询中,其中您只需要几何图形在感兴趣的国家或区域内的部分。

[Note]

地理:对于地理来说,这实际上是对几何实现的简单包装。它首先确定适合两个地理对象的边界框的最佳SRID(如果地理对象在半个区域内UTM,但不是相同的UTM将拾取其中之一)(倾向于UTM或Lambert方位等面积(LAEA)北/南极,在最坏的情况下退回到墨卡托),然后在最佳匹配的平面空间参考中相交,并重新转换回WGS84地理。

[Warning]

此函数将删除M坐标值(如果存在)。

[Warning]

如果使用3D几何,则可能需要使用基于SFGCAL ST_3DIntersection 它为3D几何图形进行了适当的3D相交。尽管此函数适用于Z坐标,但它会对Z坐标进行平均。

由GEOS模块执行

增强:3.1.0接受GRIDSIZE参数-需要GEOS > =3.9.0

已更改:3.0.0不依赖于SFCGAL。

可用性:1.5引入了对地理数据类型的支持。

This method implements the OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

This method implements the SQL/MM specification. SQL-MM 3:5.1.18

This function supports 3d and will not drop the z-index. 但是,结果仅使用XY计算。结果Z值被复制、平均或内插。

示例

SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry));
 st_astext
---------------
GEOMETRYCOLLECTION EMPTY

SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry));
 st_astext
---------------
POINT(0 0)

按国家/地区剪裁所有线路(路线)。在这里,我们假设国家地理是多边形或多重几何。注意:我们只保留产生LINESTRING或MULTILINESTRING的交叉点,因为我们不关心只共享一个点的轨迹。需要转储来将几何图形集合扩展为单个多个*零件。下面的代码非常通用,只需更改WHERE子句即可适用于POLY等。

select clipped.gid, clipped.f_name, clipped_geom
from (
         select trails.gid, trails.f_name,
             (ST_Dump(ST_Intersection(country.geom, trails.geom))).geom clipped_geom
         from country
              inner join trails on ST_Intersects(country.geom, trails.geom)
     ) as clipped
where ST_Dimension(clipped.clipped_geom) = 1;

对于多边形,例如多边形地标,您还可以使用有时速度更快的技巧,即将除多边形以外的任何内容缓冲到0.0会导致空的几何体集合。(因此,包含由0.0缓冲的多边形、直线和点的几何体集合将仅保留多边形并融合集合外壳。)

select poly.gid,
    ST_Multi(
        ST_Buffer(
            ST_Intersection(country.geom, poly.geom),
            0.0
        )
    ) clipped_geom
from country
     inner join poly on ST_Intersects(country.geom, poly.geom)
where not ST_IsEmpty(ST_Buffer(ST_Intersection(country.geom, poly.geom), 0.0));

示例:2.5Dish

请注意,这不是真正的交叉点,与使用 ST_3DIntersection

select ST_AsText(ST_Intersection(linestring, polygon)) As wkt
from  ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring
 CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon;

               st_astext
---------------------------------------
 LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10)
        

另请参阅

ST_3DIntersection, ST_Difference, ST_Union, ST_Dimension, ST_Dump, ST_Force2D, ST_SymDifference, ST_Intersects, ST_Multi