PostgreSQL/PostGIS:以编程方式生成缓冲区,直到返回两行
PostgreSQL/PostGIS: Programmatically generate buffer until two rows are returned
我的 PostgreSQL 9.6 数据库中有两个表,即包含几何列的线和建筑物。以下查询 returns 街道和建筑物几何图形周围缓冲区的交集(在给定距离内为真)。
Select
building.geom as bu_geom
From
line
left join building on
/* start by 1 meter buffer*/
st_intersects(ST_Buffer(line.geom, 1), building.geom)
线两侧分别在11米和15米处有两个建筑物多边形。我需要修改上面的查询,以便缓冲区应该从 1 米开始并继续增加,直到返回两行(两个建筑物)和缓冲区距离。有人可以建议我怎么做吗?
您需要迭代来增加缓冲距离,因此必须使用 plpgsql。
查询编辑器中有两个选项 Create Funtion
或 DO $$
。
这是第二个;
do LANGUAGE plpgsql
$$
begin
EXECUTE 'drop table if exists t';
EXECUTE 'create temporary table t ( fid int, geom geometry)';
FOR i in 1..15
LOOP
EXECUTE 'insert into t (fid,geom) select a.objectid,a.geom
from line y, building a
where st_intersects(st_buffer(y.geom,),a.geom)
and a.fid not in (select fid from t)
and y.geom&&a.geom' using i;
END LOOP;
END;
$$
- a.fid 不在 (select fid from t) --> 控制线
- FOR i in 1..15 iteration is here up to 15
- y.geom&&a.geom 加速结果
终于;
select * from t
这个解决方案很慢,如果你解释你的真正目的,更好的查询应该写。
我的 PostgreSQL 9.6 数据库中有两个表,即包含几何列的线和建筑物。以下查询 returns 街道和建筑物几何图形周围缓冲区的交集(在给定距离内为真)。
Select
building.geom as bu_geom
From
line
left join building on
/* start by 1 meter buffer*/
st_intersects(ST_Buffer(line.geom, 1), building.geom)
线两侧分别在11米和15米处有两个建筑物多边形。我需要修改上面的查询,以便缓冲区应该从 1 米开始并继续增加,直到返回两行(两个建筑物)和缓冲区距离。有人可以建议我怎么做吗?
您需要迭代来增加缓冲距离,因此必须使用 plpgsql。
查询编辑器中有两个选项 Create Funtion
或 DO $$
。
这是第二个;
do LANGUAGE plpgsql
$$
begin
EXECUTE 'drop table if exists t';
EXECUTE 'create temporary table t ( fid int, geom geometry)';
FOR i in 1..15
LOOP
EXECUTE 'insert into t (fid,geom) select a.objectid,a.geom
from line y, building a
where st_intersects(st_buffer(y.geom,),a.geom)
and a.fid not in (select fid from t)
and y.geom&&a.geom' using i;
END LOOP;
END;
$$
- a.fid 不在 (select fid from t) --> 控制线
- FOR i in 1..15 iteration is here up to 15
- y.geom&&a.geom 加速结果
终于;
select * from t
这个解决方案很慢,如果你解释你的真正目的,更好的查询应该写。