Umkreissuche mit PostGIS

Hallo zusammen!

Ich würde gerne mit PostGIS eine Umkreissuche realisieren.
Dazu nehme ich beispielsweise einen als Restaurant getaggten Punkt aus Köln und möchte Objekt in einem Umkreis von 500m zurückgeliefert bekommen. In den PostGIS-Doku habe ich gelesen, dass das wohl mit ST-DWithin geht (im Teil über ST_Buffer wird auch explizit darauf hingewiesen, dass ST_DWithin dafür geeignet wäre), nur habe ich es bisher nicht geschafft das als PostGIS-Anfrage zu formulieren.
Hat dies vielleicht schon jemand gemacht und kann mir auf die Sprünge helfen?

Vielen Dank schon mal!
Tobi

Bitteschön:


select b.osm_id, b.name, st_x(b.way) as lon, st_y(b.way) as lat from planet_osm_point as a, planet_osm_point as b where a.osm_id=262818009 and ST_DWithin(a.way, b.way, 500);

Alle Punkte 500 Meter rund um die Weltzeituhr.

Hast du hierfür noch eine Abfrage, welche statt 500 Meter alle POIs innerhalb eines Rechteckes oder Quadrats anzieht?
Ich muss alle Restaurants z.b. innerhalb einer Box mit definierten latmax, latmin, lonmax und lonmin bekommen.

Wäre super … auch wenn der Beitrag etwas alt ist :roll_eyes:

wofür? was willst du mit dem Ergebnis anstellen?

wenn du die gefundenen POI mit OpenLayers darstellen wolltest und dafür die POI im aktuellen Browserfenster sucht, gibt es dafür ganz einfache Methoden. OpenLayers.Strategy.BBOX als Stichwort.

wenn nicht, hast du Pech gehabt musst du selber rechnen.

Gruss
walter

Naja, aber das OpenLayers fragt ja nicht direkt die Datenbank ab - die BBOX-Strategie generiert ja bloss eine Abfrage, und wie man die Daten dazu dann aus der PostGIS zusammensucht, das muss man immer noch selber machen (oder halt einen fertigen WFS-Server nehmen oder sowas). Oder seh ich das falsch?

Der passende Query waere zumindest einfach ein

SELECT name, st_x(way) as lon, st_y(way) as lat
FROM planet_osm_point
WHERE way && st_makebox2d(st_point(lonmin,latmin),st_point(lonmax,latmax))

wobei es je nach Version von PostGIS sein kann, dass man noch ein st_setsrid(…, 4326) um das makebox2d setzen muss, und wenn man eine Datenbank in Google Mercator hat, dann naturlich noch ein st_transform(…, 3857) drumrum und wieder zurueck beim st_x/st_y.

Bye
Frederik

Stimmt! Ich hatte BBOX mit CLUSTER verwechselt. Das wird ja auf dem Client gemacht. War halt ein bisserl spät.
So, wie du es geschrieben hast, mach ich es natürlich selber auch.

Gruss
walter

Also ich muss schon sagen ihr habt es echt drauf :wink:
Das hat mir jetzt eine ganze Menge Einarbeitungszeit erspart. Vielen Dank!

Ich habe das ganze nun mit folgendem Statement hinbekommen:


SELECT name, ST_Y(ST_Transform(way, 4326)) AS lat, ST_X(ST_Transform(way, 4326)) AS long 
FROM planet_osm_point
WHERE ST_Transform(way, 4326) && st_makebox2d(st_point(lonmin,latmin),st_point(lonmax,latmax))

Grüße
Manuel