使用ST_Intersects更新网格多边形:多行政区域相交处理逻辑问询
PostGIS空间更新语句的执行逻辑与多相交场景处理
1. 语句执行逻辑
你编写的这条空间更新语句,执行流程如下:
- 遍历
table_grid中的每一条网格记录 - 对每个网格,在
table_administrative里找出所有和它的几何对象(geom)满足空间相交关系的行政区域记录(ST_Intersects()只要检测到两个几何对象有任何形式的交集,包括边界接触、部分重叠,就会判定为匹配) - 每找到一对匹配的网格-行政区域记录,就用行政区域的
data1值覆盖网格的data1字段
2. 多相交场景的赋值规则
当单个网格同时和两个及以上行政区域相交时,既不会按相交面积最大、质心归属来选择,也不是随机选择——最终data1的值取决于数据库的执行顺序,是最后一次匹配到的行政区域的data1值。
因为这条语句没有指定任何优先级规则,每一次匹配都会覆盖之前的赋值结果。比如网格先匹配到区域A,data1被设为A的值;之后又匹配到区域B,data1就会被改成B的值。而这个“最后一次”的顺序由数据库内部的执行计划、数据存储顺序决定,无法提前预判。
如果需要按特定规则赋值(比如取相交面积最大的行政区域),可以修改语句,通过窗口函数指定优先级:
UPDATE table_grid tg SET data1 = ta.data1 FROM ( SELECT tg.id, ta.data1, -- 按相交面积倒序排序,取每个网格的第一条记录 ROW_NUMBER() OVER (PARTITION BY tg.id ORDER BY ST_Area(ST_Intersection(tg.geom, ta.geom)) DESC) AS rn FROM table_grid tg JOIN table_administrative ta ON ST_Intersects(tg.geom, ta.geom) ) AS sub_query WHERE tg.id = sub_query.id AND sub_query.rn = 1;

内容的提问来源于stack exchange,提问作者Hermawan Wiwid
相关产品推荐
相关产品推荐

