如何用ST_Intersection获取点缓冲区范围内的全部多边形几何对象?
如何用PostGIS获取点缓冲区内的所有LULC多边形?
我有一个LULC多边形图层和一个传感器点图层,想要获取每个点周围200米缓冲区内的所有多边形(和QGIS里的效果一致)。我尝试了下面的SQL查询,但结果不符合预期:
SELECT ST_Intersection(lulc.geom,ST_Buffer(sensors.geom,200,'quad_segs=50')) FROM sensors JOIN lulc ON ST_Intersects (sensors.geom,lulc.geom)
已知ST_Intersection仅返回单个几何对象,我想知道:
- 怎么正确获取缓冲区内的所有多边形?
ST_Intersection是如何确定返回的几何对象的?
正确获取缓冲区内多边形的方法
你的查询问题出在JOIN的条件上:当前用ST_Intersects(sensors.geom, lulc.geom)判断的是点本身和多边形是否相交,而不是点的缓冲区和多边形是否相交。另外,如果你需要的是缓冲区内的完整多边形,根本不需要用ST_Intersection——除非你想要的是多边形被缓冲区裁剪后的部分。
方案1:获取缓冲区内的完整多边形
如果要保留多边形的完整几何(只要它和200米缓冲区有重叠),用下面的查询:
SELECT lulc.* FROM sensors JOIN lulc ON ST_Intersects(lulc.geom, ST_Buffer(sensors.geom, 200, 'quad_segs=50'))
更高效的写法是用ST_DWithin,它不需要提前创建缓冲区,直接判断两个几何的距离是否在阈值内,性能更好:
SELECT lulc.* FROM sensors JOIN lulc ON ST_DWithin(sensors.geom, lulc.geom, 200)
方案2:获取多边形在缓冲区内的裁剪部分
如果需要的是多边形落在200米缓冲区内的那部分几何(而非完整多边形),可以保留ST_Intersection,但要确保关联所有相交的多边形:
SELECT sensors.id AS sensor_id, lulc.id AS lulc_id, ST_Intersection(lulc.geom, ST_Buffer(sensors.geom, 200, 'quad_segs=50')) AS clipped_geom FROM sensors JOIN lulc ON ST_Intersects(lulc.geom, ST_Buffer(sensors.geom, 200, 'quad_segs=50'))
关于ST_Intersection的行为
ST_Intersection并不是“选择”某个输入几何对象,它的作用是计算两个输入几何的重叠区域:
- 如果两个几何有且只有一个连续的重叠区域,返回单个几何(比如Polygon或LineString);
- 如果重叠区域是多个不连续的部分,返回一个Multi类型的几何(比如MultiPolygon);
- 如果两个几何完全不相交,返回空几何。
你感觉它“仅返回单个几何对象”,是因为它的结果是交集的几何本身,而不是从输入里挑选某个多边形——每个相交的多边形都会和点的缓冲区计算一次交集,最终返回多行结果(每个相交多边形对应一行)。
内容的提问来源于stack exchange,提问作者Sof
相关产品推荐
相关产品推荐

