2012-04-23 5 views
8

Mam taki problem i byłbym miły Jeśli ktoś może mi pomóc. Mam tabelę punktów z indeksem GIST. Punkty te nie zmieniają się w czasie.Znajdź najbliższe punkty wzdłuż linestring w określonym limicie odległości i zamów

Chciałbym pobrać punkty, które znajdują się w pobliżu niektórych linestring. Przykład: Wyobraź sobie, że linestring jest drogą, a punkty są poi wzdłuż drogi. Chciałbym pobrać poi, które znajdują się w odległości 5 km od podanej drogi. Chciałbym sprowadzić te samochody w odpowiedniej kolejności (kolejność jazdy po drodze). Spójrz na obrazek:

image

Dla danej drogi od punktu 1 do 5 i chciałby sprowadzić POI, które jest w 5 km Max z drogi i w kolejności od 1 do 5 punktu wzdłuż drogi. Wynik powinien być następujący:

POI_ID 
1 
5 
6 
8 
9 
10 
12 
13 

To powinno mi powiedzieć, jakie POI mogę odwiedzić podczas podróży wzdłuż drogi przy minimalnych kosztach.

Czy ktoś ma jakieś pomysły, jak to zrobić z postgres i postgis?

Odpowiedz

8

zakładając, że masz kolumny geometrii geom które wykorzystują rzutowany SRID metrów w tabelach road (LineString) i poi (punkt), zapytanie, aby znaleźć wszystkie POI promieniu 5 km od drogi (gdzie id = 123) powinna być mniej więcej tak:

SELECT poi.*, ST_Distance(road.geom, poi.geom)/1000.0 AS distance_km 
FROM road, poi 
WHERE road.id = 123 AND ST_DWithin(road.geom, poi.geom, 5000.0) 
ORDER BY ST_LineLocatePoint(road.geom, poi.geom), 
     ST_Distance(road.geom, poi.geom); 

pierwszy ORDER część z ST_LineLocatePoint stosuje się frakcję od 0,0 do 1,0, w zależności, gdzie znajduje się punkt wzdłuż LINESTRING. Jeśli kierunek drogi idzie "w niewłaściwy sposób", dodaj DESC, aby odwrócić kolejność. Druga część ORDER jest oparta na odległości, która może być użyta, jeśli punkt jest nieco poza początkiem/końcem LINESTRING (gdzie ST_LineLocatePoint powróciłby odpowiednio 0.0 lub 1.0).

To zapytanie może również działać, jeśli używasz typu geography z wartościami Long/Latitude, ponieważ automagicznie oblicza on metry - a nie stopnie. Sprawdź dokumenty dla więcej:

+0

Dzięki za odpowiedź. Myślę, że to nie zadziała, ponieważ zamówienie będzie błędne. Jeśli droga (linestring) o id = 123 ma punkty 1,2,3,4, chciałbym pobrać punkty (pois), abyś przejeżdżał wzdłuż drogi, tak aby najpierw najbliższy kurs znajdował się blisko punktu 1, a następnie 2, 3 i kończąc na ostatnim punkcie linji 4. –

+0

Ah Widzę, zaktualizuj odpowiedź, aby użyć 'ST_Line_Locate_Point'. –

+0

Spróbuję mojego przyjaciela :) Również zaktualizowałem pytanie, aby było bardziej zrozumiałe. –

Powiązane problemy