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.
Christian