Come faccio a utilizzare valori di latitudine / longitudine in modo efficiente in MySQL?

StackOverflow https://stackoverflow.com/questions/1461695

  •  13-09-2019
  •  | 
  •  

Domanda

Grazie a Wikileaks, qui nel Regno Unito che possono ora accedere ai nostri longitudine e latitudine coordinate per ogni codice postale noreferrer codici di avviamento postale di Wikileaks uk importante. Non utilizzare questi dati in applicazioni pubbliche - C'è preoccupazione che i dati sono stati deliberatamente danneggiato e potreste essere ritenuti come essere in violazione del diritto d'autore. Provare a utilizzare i dati da un sito open source come questo sito CAP UK

Ora, è possibile calcolare le distanze tra ogni punto utilizzando il seguente calcolo (originariamente dal bel libro Pro Mysql):

  

La distanza d tra due punti (x1, y1) e (x2, y2) può essere calcolata dalla seguente equazione (purché valori x sono valori di latitudine e y sono longitudine in radianti, r è il raggio della sfera che è 3956 in miglia):

     

d = acos (sin (x1) * sin (x2) + cos (x1) * cos (x2) * cos (y2-Y1)) * r

Ora è questo abbastanza buono, o devo usare i nuovi tipi di dati e funzioni GIS, e se sì, come faccio a convertire il mio longitudine e latitudine riferimenti al tipo di dati Point? Mi rendo conto che, poiché la Terra non è una sfera perfetta, in modo che il calcolo della distanza cito di cui sopra non è perfetta; tuttavia è abbastanza buono per i miei scopi. Sarebbe utilizzando la nuova funzionalità GIS a) rendere più veloce il calcolo della distanza b) effettuare il calcolo della distanza più preciso?

È stato utile?

Soluzione

Per mettere a fuoco (a):

In passato, ho parti precalcolate e memorizza il lat, long, asse X, asseY e zxais, dove x, y e z sono definiti come:

xaxis = cos(radians(Lat)) * cos(radians(Lon))
yaxis = cos(radians(Lat)) * sin(radians(Lon))
zaxis = sin(radians(Lat))

La distanza può quindi essere calcolata utilizzando SQL liberamente come (acos( xaxis * $xaxis + yaxis * $yaxis + zaxis * $zaxis ) * 6367.0 / 1.852) (dove quelli che iniziano con un $ sono precalcolate per il punto di inizio in questione nello stesso modo come sopra)

Pre-elaborazione in questo modo spinge il Trig relativamente costoso per un evento di una volta, e semplifica la query.

Altri suggerimenti

Bene, per rispondere alla tua domanda "B", perché l'equazione assume una sfera perfetta, si sta andando ad essere un po 'fuori (e sarebbe, molto probabilmente, peggiorare progressivamente quanto più i due punti sono gli uni dagli altri ). Se gli account GIS per questo, allora si dovrebbe ottenere i calcoli di distanza per essere più precisi.

Per quanto riguarda la conversione da lat / lungo per punto, avrei giurato che questo è stato fornito all'interno della Google Maps API . (Vedere la GLatLng riferimento.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top