[Talk-de] Programmierer: Importhilfe amtlicher Grenzen gesucht

Frederik Ramm frederik at remote.org
Sa Jul 31 21:06:35 UTC 2010


Hallo,

Tirkon wrote:
> Für OSM müsste jetzt für jede mögliche Kombination von Nachbarn die
> gemeinsame Grenzlinie ermittelt werden und in einen Weg umgewandelt
> werden, der dann mit boundary = administrative und admin_level=9
> getaggt wird.

Das kann man in der PostGIS machen (also Shapefiles in PostGIS einlesen, 
dort dann rechnen lassen).

Ich habe das vor einiger Zeit mal fuer Dresden gemacht und 
stichwortartig dokumentiert, was zu tun ist, und haenge das unten an.

Bye
Frederik


Shapefile mit shp2pgsql in Postgis einlesen (in eine neue Tabelle 
"dresden") [anmerkung: in den shapes, um die es hier ging, gab es eine 
spalte namens "sicad_txt", in der eine Zahl stand, die das Gebiet 
eindeutig beschrieb)


CREATE TABLE multilinestrings (
     id   SERIAL NOT NULL UNIQUE,
     gid1 INTEGER NOT NULL,
     gid2 INTEGER NOT NULL
);

SELECT AddGeometryColumn('multilinestrings', 'geom', 4326, 
'MULTILINESTRING', 2);

INSERT INTO multilinestrings (gid1, gid2, geom) SELECT 
int4(a.sicad_txt), int4(b.sicad_txt), 
ST_Multi(ST_Intersection(a.the_geom, b.the_geom)) FROM dresden a, 
dresden b WHERE a.sicad_txt<b.sicad_txt AND ST_Touches(a.the_geom, 
b.the_geom);

Jetzt hat man die Linien, wo sich einzelne Stadtteile beruehren. Die 
Aussengrenze fehlt noch, dazu hab ich vermutlich etwas un-elegant:

create table outline (id serial not null unique);
SELECT AddGeometryColumn('outline','geom',4326,'MULTILINESTRING',2);

insert into outline (id,geom) values(0, (select 
ST_Boundary(ST_Multi(ST_Union(the_geom))) as geom from dresden));

insert into multilinestrings(gid1,gid2,geom) select 
int4(a.sicad_txt),0,ST_Multi(ST_Intersection(a.the_geom, b.geom)) FROM 
dresden a, outline b where ST_Touches(a.the_geom,b.geom);

Und um die resultierenden multilinestrings zu zerlegen

CREATE TABLE ways (
  id serial not null,
  gid1 INTEGER NOT NULL,
  gid2 INTEGER NOT NULL
  );
SELECT AddGeometryColumn('ways', 'geom', 4326, 'LINESTRING', 2);

INSERT INTO ways (geom, gid1, gid2) SELECT 
(ST_Dump(ST_LineMerge(geom))).geom, gid1, gid2 FROM multilinestrings;

Nun hat man alle Grenz-Ways als einzelne Geometrien in der Datenbank und 
kann mittels einem modifizierten shp2osm-Skript diese Ways in 
.osm-Dateien verwandeln und die passenden Relationen anlegen. Dazu habe 
  ich ein Skript, das ist aber eine ziemliche Perl-Bastelwueste. Kann 
gern jeder haben, aber man muss sich schon mit Perl auskennen.


-- 
Frederik Ramm  ##  eMail frederik at remote.org  ##  N49°00'09" E008°23'33"




Mehr Informationen über die Mailingliste Talk-de