2009-12-13 11 views
17

Diciamo che ho una tabella di righe che contengono le coordinate.Determinare se una coordinata si trova nel raggio di un'altra

Quale sarebbe il modo migliore per tirare solo le righe di coordinate che si trovano nel raggio di un'altra coordinata?

Per semplificare la mia domanda, mi sto dando il seguente esempio:

Table like: 
Columns: Latitude, Longitude. 
Row1: 23.44444 24.55555 
Row2: 32.44444 28.22222 
Row3: 35.11111 32.12345 

In un'istruzione SQL, come faccio ad ottenere le file di coordinate che sono nel raggio di Row3 per esempio?

risposta

29

Questo post mostra come eseguire questa operazione in SQL Server.

e qui è come farlo in MySQL:

SELECT ((ACOS(SIN($lat * PI()/180) * SIN(lat * PI()/180) + 
     COS($lat * PI()/180) * COS(lat * PI()/180) * COS(($lon - lon) * 
     PI()/180)) * 180/PI()) * 60 * 1.1515) AS distance 
FROM members 
HAVING distance<='10' ORDER BY distance ASC 
+0

Grazie, come posso utilizzarlo in un database di Access? –

+0

Per quanto ne so, non è possibile creare questo tipo di funzione in un database di Access. Dovresti provare il secondo approccio. (Saranno necessarie alcune modifiche. Credo che l'accesso non abbia una funzione PI(), per esempio) – jbochi

+0

Si tratta di miglia o chilometri? – Pentium10

0

Che cosa si intende per nel raggio di? Vuoi passare in una distanza, ad esempio 5 miglia, e trovare tutte le righe entro 5 miglia dalla fila x?

Check this out in caso affermativo http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

+0

Sì, userei chilometri ma tu hai l'idea. La cosa è che ho bisogno per un accesso db. –

+0

Utilizzare una funzione VBA, ci sono un sacco di frammenti di codice googleable là fuori per adattarsi. –

1

sembra formula della distanza è:

D = 60* 1.1515 * acos (sin(pi*y/180) * sin(pi*Y/180) + 
         cos(pi*y/180) * cos(pi*Y/180) * cos((z-Z) *pi/180) 
       ) * 180/pi) 

dove Y e Z - sono punti di ogni riga si whant testare, e z y e - sono punti della riga di esempio.

così si potrebbe fare una cosa del genere:

  1. selezionare ogni riga nella tabella e ottenere il suo lon e lat.
  2. applicano query da this, cambiando $lon e $lat al modulo dati punto 1.

non so come fare questo nell'accesso. Ma questa strada è tanto stretta quanto lenta.