[OSM-Devserver] PostGIS nächstes Objekt

Alexander Matheisen AlexanderMatheisen at ish.de
Fr Nov 12 17:56:07 CET 2010


Am Freitag, den 12.11.2010, 18:05 +0100 schrieb Tobias Wendorff:
> Am 12.11.2010 17:36, schrieb Alexander Matheisen:
> > SELECT * FROM (SELECT DISTINCT ON (h.tags->'name') h.osm_id,
> > h.tags->'name' AS name, ST_X(ST_Transform(h.way, 4326)),
> > ST_Y(ST_Transform(h.way, 4326)),
> > ST_Distance_Sphere(ST_Transform(s.way,4326), ST_Transform(h.way,4326))
> > AS distance FROM planet_point AS s, planet_point AS h WHERE s.osm_id =
> > 613578611 AND h.tags->'highway' = 'bus_stop' AND h.way&&
> > ST_Buffer(s.way, 2000)) as blubb ORDER BY distance LIMIT 2;
> 
> Argh, wieso machst Du so unglaublich teure Abfragen mit
> ST_Distance_Sphere & ST_Buffer und so vielen Transformationen?

ST_Distance_Sphere brauche ich, weil ich die Entfernung in Metern haben
will.

Nehme ich z.B. bei ST_Distance_Sphere(ST_Transform(s.way,4326),
ST_Transform(h.way,4326)) die ST_Transform raus, oder ersetze sie durch
ST_SetSRID, dann zeigt er zwar auch noch Haltestellen in der Nähe, doch
die sind teilweise ein vielfaches weiter weg als die eigentlich
nächsten, erscheinen dann aber trotzdem als nächste.

> > klappt es nun, nur dummerweise wird dann nur die weitere Bushaltestelle
> > der beiden ausgegeben?!
> > Irgendwie muss man scheinbar noch vor dem DISTINCT die Haltestellen nach
> > Entfernung sortieren, aber wie?
> 
> Sortier' in der Subquery doch einfach nach Entfernung (kleinere zuerst).

Gerade das geht ja irgendwie nicht. 

Mache ich also

SELECT * FROM (SELECT DISTINCT ON (h.tags->'name') h.osm_id,
h.tags->'name' AS name, ST_X(ST_Transform(h.way, 4326)),
ST_Y(ST_Transform(h.way, 4326)),
ST_Distance_Sphere(ST_Transform(s.way,4326), ST_Transform(h.way,4326))
AS distance FROM planet_point AS s, planet_point AS h WHERE s.osm_id =
613578611 AND h.tags->'highway' = 'bus_stop' AND h.way &&
ST_Buffer(s.way, 2000) ORDER BY distance) as blubb ORDER BY distance
LIMIT 2;

kommt folgende Fehlermeldung:
ERROR:SELECT DISTINCT ON expressions must match initial ORDER BY
expressions


Alex