aggregate and filter rivers
This commit is contained in:
parent
7d598c1789
commit
444d499286
8
Makefile
8
Makefile
@ -1,11 +1,7 @@
|
|||||||
# HACK HACK
|
WHERE ?= name='Visinčia' OR name='Šalčia' OR name='Nemunas'
|
||||||
EMPTY :=
|
|
||||||
SPACE := $(EMPTY) $(EMPTY)
|
|
||||||
|
|
||||||
RIVERS ?= Visinčia Šalčia Žeimena Lakaja Nemunas
|
|
||||||
|
|
||||||
.faux_filter-rivers: .faux_import-osm
|
.faux_filter-rivers: .faux_import-osm
|
||||||
./filter-rivers-query.awk $(RIVERS) | ./db -f -
|
./db -v where="$(WHERE)" -f aggregate-rivers.sql
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
.faux_import-osm: lithuania-latest.osm.pbf .faux.db
|
.faux_import-osm: lithuania-latest.osm.pbf .faux.db
|
||||||
|
37
aggregate-rivers.sql
Normal file
37
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