aggregate and filter rivers
This commit is contained in:
parent
d76584eee7
commit
69bb49f49c
@ -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
37
IV/aggregate-rivers.sql
Normal 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;
|
@ -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 ";";
|
||||
}
|
Loading…
Reference in New Issue
Block a user