You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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仅返回单个几何对象,我想知道:

  1. 怎么正确获取缓冲区内的所有多边形?
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:04:58