aggregate and filter rivers

This commit is contained in:
Motiejus Jakštys 2021-03-13 16:44:31 +02:00
parent d76584eee7
commit 69bb49f49c
3 changed files with 39 additions and 18 deletions

View File

@ -1,11 +1,7 @@
# HACK HACK
EMPTY :=
SPACE := $(EMPTY) $(EMPTY)
RIVERS ?= Visinčia Šalčia Žeimena Lakaja Nemunas
WHERE ?= name='Visinčia' OR name='Šalčia' OR name='Nemunas'
.faux_filter-rivers: .faux_import-osm
./filter-rivers-query.awk $(RIVERS) | ./db -f -
./db -v where="$(WHERE)" -f aggregate-rivers.sql
touch $@
.faux_import-osm: lithuania-latest.osm.pbf .faux.db

37
IV/aggregate-rivers.sql Normal file
View File

@ -0,0 +1,37 @@
/* Aggregates rivers by name and proximity. */
drop function if exists aggregate_rivers;
create function aggregate_rivers() returns table(osm_id bigint, name text, way geometry) as $$
declare
c record;
cc record;
changed boolean;
begin
while (select count(1) from agg_tmp_objects) > 0 loop
select * from agg_tmp_objects limit 1 into c;
delete from agg_tmp_objects a where a.osm_id = c.osm_id;
changed = true;
while changed loop
changed = false;
for cc in (select * from agg_tmp_objects a where a.name = c.name and st_dwithin(a.way, c.way, 500)) loop
c.way = st_linemerge(st_union(c.way, cc.way));
delete from agg_tmp_objects a where a.osm_id = cc.osm_id;
changed = true;
end loop;
end loop; -- while changed
return query select c.osm_id, c.name, c.way;
end loop; -- count(1) from agg_tmp_objects > 0
return;
end
$$ language plpgsql;
create temporary table agg_tmp_objects (osm_id bigint, name text, way geometry);
create index agg_tmp_objects_id on agg_tmp_objects(osm_id);
create index agg_tmp_objects_gix on agg_tmp_objects using gist(way) include(name);
insert into agg_tmp_objects
select p.osm_id, p.name, p.way from planet_osm_line p
where waterway in ('river', 'stream', 'canal') and :where;
drop table if exists agg_rivers;
create table agg_rivers as (select * from aggregate_rivers());
drop table agg_tmp_objects;

View File

@ -1,12 +0,0 @@
#!/usr/bin/awk -f
BEGIN {
print "DROP TABLE IF EXISTS rivers;"
printf "CREATE TABLE rivers AS SELECT name,way FROM planet_osm_line WHERE "
for (i = 1; i < ARGC; i++) {
printf "name='%s'", ARGV[i]
if (i != ARGC - 1)
printf " OR ";
}
print ";";
}