首页 > 解决方案 > 计算postgresql缓冲区内多边形的百分比

问题描述

我有一个名为 Operation 的表,其中有多个点作为 geom,我创建了一个 100m 的缓冲区并作为新列添加到同一个表中。我有另一个名为 Residential 的表,它有多个多边形,目标是找到每个缓冲区内多边形的百分比,并将其作为列添加到 Operation 表中。我不确定如何进行此操作。

SELECT AddGeometryColumn ('public','operations','buffer',4326,'POLYGON',2);
UPDATE operations SET buffer = ST_Buffer(geom::geography,100)::geometry;

ALTER TABLE operations ADD COLUMN pts int;

UPDATE operations o 
SET pts = (SELECT count(*) FROM supermarket s
           WHERE ST_Contains(o.buffer,s.geom));

我已经这样做了,以下几行不适合获得百分比。如何解决这个问题。

    ALTER TABLE public."Operation" ADD COLUMN res_percent double precision;
UPDATE public."Operation"  
SELECT      
  ST_Intersection(ST_MakeValid(r.geom),o.buffer) AS intersection,   
  ST_Area(ST_Intersection(ST_MakeValid(r.geom),o.buffer))/ST_Area(r.geom)*100)) 
FROM public."Residential" r, public."Operation" o 
WHERE ST_Intersects(o.buffer,ST_MakeValid(r.geom));

小提琴手

标签: sqlpostgresqlgeospatialpostgisspatial-query

解决方案


用于ST_Area获取多边形的面积,使用 提取它们相交的面积ST_Intersection,然后最后使用相交面积和多边形面积来计算重叠比例。

例子

给定两个重叠的多边形p1p2,在名为 的表中t

在此处输入图像描述

我们可以ST_Intersection用来获取两个多边形的交集:

SELECT ST_Intersection(p1,p2) FROM t;

在此处输入图像描述

现在我们可以用它ST_Area来计算这个交点的面积:

SELECT ST_Area(ST_Intersection(p1,p2)) FROM t;

    st_area     
----------------
 601950.9523732
(1 row)

因此,ST_Area在交叉点和多边形中使用,您可以计算多边形与另一个重叠的百分比,例如

SELECT 
  ST_Area(ST_Intersection(p1,p2))/ST_Area(p2)*100 AS perc_p2, 
  ST_Area(ST_Intersection(p1,p2))/ST_Area(p1)*100 AS perc_p1
FROM t;

     perc_p2      |     perc_p1      
------------------+------------------
 30.0839473794556 | 37.9061430278047
(1 row)

演示:db<>fiddle

鉴于您的描述,您的查询应该看起来像这样:

SELECT   
  ST_Intersection(r.geom,o.buffer) AS intersection,
  ST_Area(ST_Intersection(r.geom,o.buffer))/ST_Area(r.geom)*100
FROM residential r, operations o
WHERE ST_Intersects(o.buffer,r.geom);

推荐阅读