Od dłuższego czasu korzystam z PostGIS, ale nigdy nie musiałem używać LINESTRING
geometrii ...! :)
Oto, co chciałbym zrobić: mam tabelę linii (reprezentujących ulice danego miasta, SRID 3395) i chciałbym znaleźć najbliższe linie do danego punktu (pozycja GPS, SRID 4326).
Rozwiązaniem, które znalazłem, jest wybranie wszystkich linii wewnątrz mojego punktu za pomocą expand()
metody i określenie odległości między każdym linią i moim punktem za pomocą ST_Distance()
metody.
Oto SQL:
SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;
Wyniki wyglądają OK, ale mam wrażenie, że coś jest nie tak z moją implementacją.
1) Czy uważasz, że expand()
można uzyskać wszystkie niepokojące linie?
2) Czy uważają Państwo, że ST_Distance()
jest to właściwa metoda? Myślę, że robię to źle, ponieważ odległość, którą chciałbym uzyskać, jest najmniejszą odległością między punktem a moją linią, a nie odległością między punktem a jednym z punktów linii.
Ilustracja:
Halo
Najpierw pytanie o to, co zwraca ST_Distance. ST_Distance zwraca najkrótszą odległość między linią a punktem (lub jakie typy geometrii są wprowadzone) Oznacza to, że ST_Distance między punktem (1 3) a linestring (0 0,0 10) zwróci 1. Odległość nie będzie mierzona między punkt i (0 0) lub punkt i (0 10), ale od punktu (1 3) do (0 3).
Z tego, co rozumiem, ST_Distance daje odpowiedź, której potrzebujesz.
Jeśli chcesz znaleźć punkt (0 3) w powyższym przykładzie, możesz użyć ST_Closestpoint, jeśli masz PostGIS 1.5. W moim przykładzie używasz go w następujący sposób: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometria, ' PUNKT (1 3) ':: geometria), powinieneś otrzymać w zamian punkt (0 3), punkt na linii najbliżej twojego punktu.
HTH Nicklas
źródło
Znalazłem to :) (No chyba: P)
Za pomocą
ST_Line_Locate_Point()
iST_Line_Interpolate_point()
udało mi się uzyskać punkt, który NIE JEST częścią definicji LINESTRING, ale JEST na tej linii :) Wszystko, co muszę zrobić, to uzyskać odległość od mojego punktu do tego punktu i gotowe.ST_Line_Locate_Point()
Sposób znaleźć lokalizację najbliższego punktu na linii do danej kwestii,ST_Line_Interpolate_Point
metoda włączyć tę lokalizację do punktu.źródło
ST_Distance(geometry g1, geometry g2)
Ten wątek archiwalny Postgis może Ci odpowiedzieć http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html
źródło