Datenbankabfrage für ein Straßenverzeichnis

So, mit einigen Umwegen habe ich das hinbekommen.

Ich habe zwei VIEWS erstellt. Die erste enthält alle Linestrings und die PLZ

CREATE OR REPLACE VIEW plz AS 
 SELECT w.linestring, r.tags::hstore -> 'postal_code' AS plz_nr
   FROM relations r
   JOIN relation_members rm ON r.id = rm.relation_id
   JOIN ways w ON rm.member_id = w.id
  WHERE r.tags::hstore ? 'postal_code't
;

Mit der zweiten habe ich die Linestrings dann zusammengeführt.


CREATE OR REPLACE VIEW plz_areas AS
SELECT ST_Multi(ST_BuildArea(ST_Union(linestring))) plz_geom, plz_nr
FROM plz
GROUP BY plz_nr       
;


Dann erhalte ich schließlich mit der folgenden Abfrage alle Straßen aus der Gemeinde mit der Relations-ID 382443, zuzüglich der Felder im Raster (habe ich vorher selbst erstellt und in die Tabelle grid importiert) und die dazugehörige Postleitzahl:

SELECT DISTINCT w.tags::hstore -> 'name' as strassenname, w.tags::hstore
-> 'highway' as typ, g.tags::hstore -> 'name' as feld, pa.plz_nr
FROM ways  w, grid g, plz_areas pa
WHERE (w.linestring) && g.linestring AND (w.tags::hstore ? 'highway' )
AND (w.tags::hstore ? 'name' ) 
AND ST_Intersects(
(select ST_Multi(ST_BuildArea(ST_Union(linestring))) geom
from (SELECT w.linestring 
        FROM relations r
        JOIN relation_members rm on r.id = rm.relation_id
        JOIN ways w on rm.member_id = w.id
        WHERE r.id = 382443
        ORDER BY rm.sequence_id
       ) www ),w.linestring)
AND ST_Intersects
(pa.plz_geom,w.linestring)         
order by strassenname, feld, pa.plz.nr
;

Das ist doch schon eine gute Basis, um ein Straßenverzeichnis zu erstellen. :slight_smile:

Christian