stud/IV/aggregate-rivers.sql

51 lines
1.5 KiB
MySQL
Raw Normal View History

2021-03-13 16:44:31 +02:00
/* Aggregates rivers by name and proximity. */
drop function if exists aggregate_rivers;
2021-04-29 21:40:15 +03:00
create function aggregate_rivers() returns table(
osm_id bigint,
name text,
way geometry
) as $$
2021-03-13 16:44:31 +02:00
declare
c record;
cc record;
changed boolean;
begin
2021-04-17 16:16:27 +03:00
while (select count(1) from wm_rivers_tmp) > 0 loop
select * from wm_rivers_tmp limit 1 into c;
delete from wm_rivers_tmp a where a.osm_id = c.osm_id;
2021-03-13 16:44:31 +02:00
changed = true;
while changed loop
changed = false;
2021-04-29 21:40:15 +03:00
for cc in (
select * from wm_rivers_tmp a where
a.name = c.name and
st_dwithin(a.way, c.way, 500)
) loop
2021-03-13 16:44:31 +02:00
c.way = st_linemerge(st_union(c.way, cc.way));
2021-04-17 16:16:27 +03:00
delete from wm_rivers_tmp a where a.osm_id = cc.osm_id;
2021-03-13 16:44:31 +02:00
changed = true;
end loop;
end loop; -- while changed
return query select c.osm_id, c.name, c.way;
2021-04-17 16:16:27 +03:00
end loop; -- count(1) from wm_rivers_tmp > 0
2021-03-13 16:44:31 +02:00
return;
end
$$ language plpgsql;
2021-04-17 16:16:27 +03:00
drop index if exists wm_rivers_tmp_id;
drop index if exists wm_rivers_tmp_gix;
drop table if exists wm_rivers_tmp;
create temporary table wm_rivers_tmp (osm_id bigint, name text, way geometry);
create index wm_rivers_tmp_id on wm_rivers_tmp(osm_id);
create index wm_rivers_tmp_gix on wm_rivers_tmp using gist(way) include(name);
2021-03-13 16:44:31 +02:00
2021-04-17 16:16:27 +03:00
insert into wm_rivers_tmp
2021-03-13 16:44:31 +02:00
select p.osm_id, p.name, p.way from planet_osm_line p
where waterway in ('river', 'stream', 'canal') and :where;
2021-04-17 16:16:27 +03:00
drop table if exists wm_rivers;
2021-04-29 21:40:15 +03:00
create table wm_rivers as (
select * from aggregate_rivers() where st_length(way) >= 50000
);
2021-04-17 16:16:27 +03:00
drop table wm_rivers_tmp;