名称

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

概要

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_Intersection 与 ST_Intersects 结合使用,可用于剪切几何图形,例如在边界框、缓冲区或区域查询中,您只需要位于国家或感兴趣区域内的几何图形部分。

[Note]

对于地理数据类型,这是几何实现的一个薄封装。它首先确定最适合 2 个地理对象边界框的 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 才能使用 gridSize 参数

更改:3.0.0 不依赖于 SFCGAL。

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

此方法实现了 OGC 简单要素 SQL 1.1 实现规范。 s2.1.1.3

此方法实现了 SQL/MM 规范。SQL-MM 3: 5.1.18

此函数支持 3d,并且不会删除 z 索引。但是,结果仅使用 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)

按国家/地区剪切所有线(轨迹)。这里我们假设国家/地区的几何图形是 POLYGON 或 MULTIPOLYGONS。注意:我们只保留导致 LINESTRING 或 MULTILINESTRING 的交点,因为我们不关心只共享一个点的轨迹。需要 dump 来将几何图形集合扩展为单独的单个 MULT* 部分。下面是相当通用的,只需更改 where 子句即可用于多边形等。

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)