Abfrage von POI in einem Multipolygon mit PostGIS?

Ich stehe grad vor der Aufgabe, die Punkte in einem Multipolygon mit PostGIS herausfiltern zu wollen, aber da bin ich noch nicht fit genug. Sollte ganz einfach sein, vielleicht hat das jemand sofort präsent wie man das machen muss.

Ganz Deutschland habe ich in PostGIS mit osm2pgsql ohne hstore eingespielt.

Ich habe hier das Multipolygon als Relation: http://www.openstreetmap.org/browse/relation/55752

Und ich habe diese Abfrage:
$query = “SELECT name, lat, lon
FROM (
SELECT name,
x(transform(way, 4326)) AS lon,
y(transform(way, 4326)) AS lat
FROM planet_osm_point
WHERE $k=‘$v’
UNION
SELECT name,
x(centroid(transform(way, 4326))) AS lon,
y(centroid(transform(way, 4326))) AS lat
FROM planet_osm_polygon
WHERE $k=‘$v’
) AS u1”;

Meinem Verständnis nach muss da noch ein WHERE dahinter, aber mit einer räumlichen Bedingung, dass die Punkt in dem Gebiet liegen sollen. Wie muss die wohl aussehen?

Hi,
ich kenn mich mit dem osm2pgsql-schema leider nicht mehr aus, aber das Prinzip ist “ganz Einfach” :wink:

Angenomme, die Spalten in der DB, die die Geographischen Daten repräsentieren, haben den Name “geom” (von Geometriedaten), so geht das etwas so:

“where table1.geom @ table2.geom”

table1 z.b. points und table2 irgend ein geschlossener Way (gibt es definitiv in dem Schema, nur den Namen der Tabelle kenn ich nicht mehr)

@ ist ein spatialer Operator in PostGIS und bedeutet: “ist vollständig in”

näheres hier: http://postgis.refractions.net/documentation/manual-1.5/reference.html Absatz 7.7

Gruss
Walter

p.s. diese PostGIS-Seite ist echt Gold wert. Unbedingt durchackern.

Danke erst mal für Deine Antwort. So etwa dachte ich mir das. Das Problem ist bei mir jetzt aber die zweite Geometrie syntaktisch korrekt anzubringen. Das ist ja eine Relation http://www.openstreetmap.org/browse/relation/28267 die aus ein paar Ways besteht und dann ein Polygon ergibt, und sich mir die Frage stellt wie ich sowas korrekt angebe.

der Weg/die Fläche, der/die sich aus den Wegen der Relation zusammensetzt, müsste fertig in der DB drin sein (osm2pgsql macht das so?). Den musst du nur finden.
Da muss dir jemand anders nen Tip geben, da ich das osm2pgsql-Schema nicht gut kenne.

Gruss
Walter

Wenn ich die Relation in josm lade, als .osm abspeichere, und osm2pgsql zum Fraß vorwerfe, steht sie bei planet_polygon als Element mit osm_id=-28267 drin.

Gruß,
ajoessen

danke

aha, einen kleinen schritt weiter:

“where planet_osm_point.geom @ planet_osm_polygon.geom
and planet_osm_point.id = -(planet_osm_polygon.id)”

unter der annahme, dass die id jeweils die osm-id ist und die Geometrie in der Spalte “geom” steht.
Diese Namen müssen noch überprüft werden.

Gruss
Walter

Leider kenn ich mich mit dem sql-Zeugs nicht so aus.
Im pgAdmin steht bei planet_polygon:

und bei planet_point:

Gruß,
ajoessen

aha, noch ein schritt weiter:

“where planet_osm_point.way @ planet_osm_polygon.way
and planet_osm_point.osm_id = -(planet_osm_polygon.osm_id)”

jetzt stimmen alle Namen.

“way” ist in beiden Tabellen der Geometrie-Teil (way geometry). Das ist für GIS.
Damit kann man dann die tollsten Sache machen (Abstand, Zentrum, Weglänge, Schnittpunkte, …)

So etwa sollte es gehen.

Einfach mal gedanklich @ durch “is in” ersetzen und den Befehl vor sich hinmurmeln. :wink:

Gruss
Walter

Bedankt! Ein paar Kleinigkeiten hab ich dem Bedarf entsprechend angepasst und so ist es auch wohl besser lesbar.

Die Abfrage:


SELECT punkt, lat, lon  
FROM (
SELECT name as punkt, way,
x(transform(way, 4326)) AS lon,
y(transform(way, 4326)) AS lat
FROM planet_osm_point 
WHERE tourism='hotel') as poi, planet_osm_polygon as bezirke 
where poi.way @ bezirke.way 
and bezirke.osm_id = -55752;

Das Ergebnis:

Damit bin ich meinem eigenen XAPI auch schon wieder etwas näher :slight_smile:

@warnbacher: Der Operator @ prüft übrigens nicht auf Punkt in Polygon, sondern auf Punkt im MUR des Polygons.