2011-12-11 19 views
13

Questa è probabilmente una domanda semplice, ma non sono molto bravo con PostGIS e non lo escludo completamente.Distanza tra 2 POINT in Postgis in srid 4326 in metri

Fondamentalmente ho una tabella (nodes) con una colonna POINT (point). Ho creato un indice su questa colonna

create index nodes__points on nodes using gist (point) 

La colonna è stato creato con

select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2) 

Sto usando srid 4326 perché sto aggiungendo i dati che è in forma (latitudine, longitudine). (cioè il sistema di coordinate in cui la posizione di Dublino, Irlanda è lat = 53.353 lon = -6.264 (che ho aggiunto con GeomFromText('POINT(-6.264 53.535)'))).

Per ogni punto, voglio trovare tutti i punti che sono più o meno all'interno di una scatola di 1 km centrato su questo punto (così selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id;. Essa non deve essere precisi, solo una figura hueristic ruvida. Bbox un 1 km va bene, un cerchio 1 chilometro va bene. non deve essere esattamente 1 km, solo che ordine di grandezza.

il ST_Distance/ST_DWithin/etc. tutti utilizzano le unità del SRID, che per 4326/WGS64 è gradi (in modo 1 = 1 grado di lattitude/longitudine). ma voglio usare metri.

ho provato ST_distance_sphere e st_dwithin che può utilizzare metri, ma se lo faccio, il explain mostra che l'indice non viene utilizzato.

Come posso ottenere approssimativamente quello che voglio, e utilizzare l'indice geografico?

UPDATE: questo è in PostgreSQL 9.1 e PostGIS 2.0 svn build.

+0

Forse di qualche aiuto: [ST_DWithin prende come parametro di laurea, non metri, perché?] (Http://stackoverflow.com/questions/8444753/st-dwithin -takes-parameter-as-degree-not-meters-why) – radek

+1

domanda obbligatoria: quale versione di PostGIS? Quale versione di PostgreSQL? – filiprem

risposta

5

Da quando ho scritto questo, ho scoperto il tipo "geografico" rispetto al tipo "geometria" in PostGIS, che potrebbe fare esattamente ciò che voglio.

+1

La geografia dovrebbe funzionare. non hai menzionato il tipo di dati nella domanda. Il problema con Geom è in definitiva un oggetto 2D. La geografia è un oggetto 4D che include l'altitudine e la curvatura del parametro terra che può essere traslato in metri ... senza questi due parametri, non è possibile stimare i "metri" in quanto lat/lon diversi significano distanze diverse in attesa di sul pianeta. Potrebbe sembrare banale quando stai scrivendo, ma ti preghiamo di includere una dichiarazione di creazione di una tabella in modo da sapere a quali tipi di dati di colonna ti stai riferendo – Twelfth

16

È possibile utilizzare ST_Transform per utilizzare i contatori, inoltre ricordare che non tutte le funzioni sono disponibili con i tipi di geografia, ma se si ha realmente bisogno della velocità usare ST_DWithin, è il modo più veloce. Ecco un approssimazione di conversioni tra gradi e metri:

| places | degrees | distance | 
| ------ | ---------- | -------- | 
| 0  | 1.0  | 111 km | 
| 1  | 0.1  | 11.1 km | 
| 2  | 0.01  | 1.11 km | 
| 3  | 0.001  | 111 m | 
| 4  | 0.0001  | 11.1 m | 
| 5  | 0.00001 | 1.11 m | 
| 6  | 0.000001 | 0.111 m | 
| 7  | 0.0000001 | 1.11 cm | 
| 8  | 0.00000001 | 1.11 mm | 
Problemi correlati