Herausfinden ob Punkt in Polygon enthalten ist

Hallo,

folgende Situation. Ich habe einige Straßen aus der Tabelle planet_osm_nodes herausgefiltert, aus lon/lat habe ich mit:

 ... astext(ST_Transform(ST_SetSRID(ST_MakePoint(w.lon/100.0,w.lat/100.0),900913),4326)) AS koordinaten 

gemacht.

Bis dahin hat soweit alles funktioniert.

Als Ergebnis habe ich z.B. so etwas aus einer SQL Abfrage erhalten:

“Aachener Straße”;“24”;“28327”;“Bremen”;“POINT(8.91859190987236 53.0759916627644)”

Jetzt möchte ich noch überprüfen, ob die gefundenen Koordinaten auch wirklich im PLZ Bereich 28327 liegen.

Dazu habe ich mir aus der Tabelle planet_osm_polygon alle PLZ Polygone IDs herausgesucht. Wenn ich es richtig verstanden habe, sollte es doch möglich sein,
mit der Funktion ST_WITHIN zu überprüfen ob der erwähnte Punkt in einem der PLZ Polygone enthalten ist.

Die gefundenen PLZ Polygone habe ich zuvor eine Extra Tabelle(plz_poly) geschrieben;Felder: osm_id,way(geom),plz. Der Geometry Type von way ist unverändert 900913 aus der Tabelle planet_osm_polygon übernommen.

Versucht habe ich es z.B. so:

select * from plz_poly p where ST_Within( ST_GeomFromText('POINT(8.91859190987236 53.0759916627644)' , 900913 ), p.way)

Allerdings erhalte ich immer ein leeres Ergebnis. Kann mir vielleicht jemand ein Tip geben, woran dies liegen könnte?

Gruß

ST_GeomFromText('POINT(8.91859190987236 53.0759916627644)' , 900913 )

sieht ziemlich schräg aus. Das heisst "nimm (8.9 53.0) und interpretiere das als EPSG:900913. Das wird dann ein Punkt, der ein paar Meter über dem Äquator liegt.

Wenn Dein p.way in EPSG:4326 vorliegt (was ich glaube), dann solltest ihn ungefähr so erst mal in EPSG:900913 umwandeln (ungetestet!):

st_transform(ST_GeomFromText('POINT(8.91859190987236 53.0759916627644)' ,4326),900913)

und dann schaun, ob er in plz_poly liegt. Vorausgesetzt, deine plz_poly liegt ebenfalls in EPSG:900913 vor.

Grüße, Max

wenn du mit osm2pgsql importiert hast, dann hast du doch auch die Tabelle planet_osm_point und _polygon, oder? Und da müssten doch die Geometrien schon gefüllt sein.

Siehe http://wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_polygon . ah, verlesen…

Du hast auch noch einen Fehler in

select * from plz_poly p where ST_Within( ST_GeomFromText('POINT(8.91859190987236 53.0759916627644)' , 900913 ), p.way)

‘POINT(8.91859190987236 53.0759916627644)’ ist eindeutig in EPSG:4326. Was passiert wenn du mit

select * from plz_poly p where ST_Within( ST_GeomFromText('POINT(8.91859190987236 53.0759916627644)' , 4326 ), p.way)

abfragst?

Das wars,bzw. fehlte…

st_transform(ST_GeomFromText('POINT(8.91859190987236 53.0759916627644)' ,4326),900913)

Merci!