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?
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);
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.
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.
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.
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.
Also ich muss schon sagen ihr habt es echt drauf
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))