[OSM-Devserver] PostGIS nächstes Objekt

Peter Körner osm-lists at mazdermind.de
Mo Nov 8 22:27:13 CET 2010



Am 08.11.2010 22:01, schrieb Alexander Matheisen:
> Hallo,
>
> ich würde gerne für ein bestimmtes Obejekt (erstmal nur Punkte) den
> nächsten Punkt mit einem bestimmten Tag herausfinden.
>
> Dazu habe ich folgendes versucht, bzw. nach Beispielen zusammmen
> gebastelt, was aber irgendwie nicht so ganz will;
> mache ich so ein Request, kommt kein Ergebnis, vorsichtshalber breche
> ich immer nach ca. 10s ab, um die DB nicht noch zum Absturz zu bringen:
>
> SELECT h.tags->'name' AS name,
> ST_Distance(ST_SetSRID(ST_Point(51.1983858,6.6872327),4326),ST_SetSRID(h.way,4326)) AS distance FROM planet_point AS s, planet_point AS h WHERE s.osm_id = 330447462 AND h.tags->'amenity' = 'pub' ORDER BY distance LIMIT 1;

Nach allem was ich sehe, testest du jedes mal alle points des gesamten 
planeten, da du keine geographische Einschränkung vornimmst. Das ORDER 
BY sorgt dafür, dass zunächst alle Zeilen geladen werden, dann sortiert 
und danach die oberste ausgeliefert wird.

Umgehen könntest du das mit einer geograhischen Einschränkung:

SELECT
   h.osm_id,
   h.tags->'name',
   ST_AsText(h.way) AS geom,
   ST_Distance(
     ST_SetSRID(s.way,4326),
     ST_SetSRID(h.way,4326)
   ) AS distance
FROM
   planet_point AS s,
   planet_point AS h
WHERE s.osm_id = 330447462
   AND h.tags->'amenity' = 'pub'
   AND h.way && ST_Buffer(s.way, 1000)
ORDER BY distance;


ST_Buffer erzeugt eine 1km große Pufferzone (bei einem Punkt ist das ein 
Kreis mit einem Radius von 1km) um den Quellpunkt und ermittelt dann 
alle passenden Points darin. Diese werden dann nach Entfernung sortiert. 
Wenn kein Ergebnis gefunden wurde, kann das Query mit einer größeren 
Pufferzone wiederholt werden. Das LIMIT 1 musst du noch selbst hinzufügen :)

Lg, Peter