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 结合使用对于裁剪几何很有用,例如在边界框、缓冲区或区域查询中,你只需要几何中位于感兴趣的国家或区域内的部分。
对于地理,这是几何实现的一个精简包装。 它首先确定最适合 2 个地理对象边界框的 SRID(如果地理对象在半个 UTM 区域内,但不是相同的 UTM,则会选择其中一个)(偏好 UTM 或兰伯特方位等面积(LAEA)北/南极,在最坏的情况下退回到墨卡托投影)然后在最合适的平面空间参考中进行交集,并重新转换回 WGS84 地理。 |
此函数将删除 M 坐标值(如果存在)。 |
如果使用 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 的交集,因为我们不关心仅共享一个点的轨迹。转储用于将几何图形集合展开为单个 MULT* 部分。以下内容相当通用,只需更改 where 子句即可适用于 polys 等。
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;
对于 polys(例如多边形地标),您还可以使用有时更快的 hack,即对除多边形之外的任何内容进行 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));
请注意,这不是真正的交集,请与使用 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)