使用ST_VoronoiPolygons时保留源图层字段并裁剪输出的技术问题
解决Voronoi多边形保留原字段+裁剪的问题
看起来你已经搞定了Voronoi多边形的生成,但卡在了保留原字段和裁剪这两个点上,我来帮你调整SQL解决这两个需求:
1. 保留layer1的所有字段到layer2
你原来的SQL用ST_Collect把所有点合并成一个几何对象,导致没法关联回原layer1的字段。要解决这个问题,我们需要把生成的每个Voronoi多边形和它对应的原始点关联起来——因为每个Voronoi多边形恰好包含生成它的那个输入点,所以用ST_Contains就能精准匹配:
CREATE TABLE layer2 AS WITH all_points AS ( -- 先收集所有点生成整体的Voronoi图 SELECT ST_Collect(geometry) AS all_geom FROM layer1 ), voronoi_polygons AS ( -- 拆解生成的Voronoi多边形 SELECT (ST_Dump(ST_VoronoiPolygons(all_geom))).geom AS vor_geom FROM all_points ) SELECT l1.*, -- 直接保留layer1的所有字段 vp.vor_geom AS geom -- 把Voronoi多边形设为layer2的geom字段 FROM voronoi_polygons vp JOIN layer1 l1 ON ST_Contains(vp.vor_geom, l1.geometry); -- 匹配每个多边形对应的源点
2. 对Voronoi结果进行裁剪
要把结果裁剪到layer3(红色面)的范围,只需要加入ST_Intersection和裁剪区域做相交运算。如果layer3有多个面,先合并成一个整体裁剪区域会更高效:
CREATE TABLE layer2 AS WITH all_points AS ( SELECT ST_Collect(geometry) AS all_geom FROM layer1 ), clip_area AS ( -- 合并layer3的所有面为一个裁剪区域 SELECT ST_Union(geom) AS clip_geom FROM layer3 ), voronoi_polygons AS ( SELECT (ST_Dump(ST_VoronoiPolygons(all_geom))).geom AS vor_geom FROM all_points ) SELECT l1.*, -- 对Voronoi多边形进行裁剪 ST_Intersection(vp.vor_geom, ca.clip_geom) AS geom FROM voronoi_polygons vp JOIN layer1 l1 ON ST_Contains(vp.vor_geom, l1.geometry) CROSS JOIN clip_area ca -- 只保留和裁剪区域相交的多边形,避免生成空几何 WHERE ST_Intersects(vp.vor_geom, ca.clip_geom);
额外小贴士
- 确保layer1、layer3使用相同的坐标系,如果不一样,记得用
ST_Transform转换后再操作,比如ST_Transform(l1.geometry, 4326)。 - 如果layer3的面不需要合并,也可以去掉
ST_Union,改为直接JOIN layer3逐个相交,但性能可能会稍差一点。 - 如果遇到
ST_Contains匹配失败的情况(比如点刚好在多边形边界上),可以换成ST_DWithin(vp.vor_geom, l1.geometry, 0.0001),阈值根据你的坐标系单位调整(米的话用0.1,度的话用0.00001这类小值)。
内容的提问来源于stack exchange,提问作者Martin C
相关产品推荐
相关产品推荐

