2012-04-23 8 views
8

Ho un tale problema e sarei carino Se qualcuno mi può aiutare. Ho una tabella di punti con indice GIST. Questi punti non cambiano nel tempo.Trova i punti più vicini lungo la stringa di linea nel limite di distanza specificato e ordina

Vorrei recuperare i punti che si trovano vicino a una stringa di linea data. Esempio: Immagina che Linestring sia la strada e che i punti siano poi lungo la strada. Mi piacerebbe andare a prendere poi che sono a 5 km di distanza dalla strada data. Vorrei prendere quei pois nell'ordine corretto (ordine di guida lungo la strada). Guardate l'immagine:

image

Per data strada dal punto 1-5 vorrei prendere POI che è in 5 km max dalla strada e in ordine dal punto 1 a 5 lungo la strada. Così il risultato dovrebbe essere:

POI_ID 
1 
5 
6 
8 
9 
10 
12 
13 

Questo dovrebbe dirmi cosa POI posso visitare durante il viaggio lungo la strada con il minimo costo.

Qualcuno ha qualche idea su come farlo con postgres e postgis?

risposta

8

si Supponendo che hanno colonne geometria geom che utilizzano uno SRID prevista di metri in tabelle road (LINESTRING) e poi (PUNTO), la query per trovare tutti i punti di interesse a 5 km di strada (dove id = 123) dovrebbe essere simile:

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); 

la prima parte ORDER con ST_LineLocatePoint utilizza una frazione tra 0,0 e 1,0, a seconda di dove il punto è lungo la LINESTRING. Se la direzione della strada sta andando "nel modo sbagliato", quindi aggiungere DESC per invertire l'ordine. La seconda parte ORDER si basa sulla distanza, che potrebbe essere utilizzata se il punto è leggermente oltre l'inizio/la fine del LINESTRING (dove ST_LineLocatePoint restituirebbe 0.0 o 1.0, rispettivamente).

Questa query potrebbe funzionare anche se si utilizza il tipo geography con valori Long/Latitude, poiché calcola automaticamente i metri, non i gradi. Scopri documentazione per più:

+0

Grazie per la risposta. Penso che questo non funzionerà perché l'ordine sarà sbagliato. Se road (linestring) con id = 123 ha punti 1,2,3,4 vorrei prendere punti (pois) in modo che passerai lungo la strada quindi prima il più vicino poi vicino al punto 1, quindi 2, 3 e termina con l'ultimo punto della stringa lineare 4. –

+0

Ah, vedo, aggiorna la risposta per usare 'ST_Line_Locate_Point'. –

+0

Proverò il mio amico :) Inoltre ho aggiornato la domanda per essere più comprensibile. –

Problemi correlati