Tipo di dati decimale o punto per l'archiviazione dei dati sulla posizione geografica in MySQL


8

Voglio memorizzare la posizione geografica per ciascun indirizzo nella mia tabella "tblAddress" di MySQL (Innodb) e penso di avere 2 opzioni:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

Il mio programma deve trovare tutti gli indirizzi che rientrano nel raggio di 1 chilometro dalla posizione corrente (client mobile).

Anche sotto il comando non funziona per me, non sono sicuro di cosa ho bisogno per questo.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

Quindi qual è l'approccio suggerito per archiviare i dati per un calcolo e un recupero più rapidi qui. Si prega di avvisare.

Risposte:


6

È possibile utilizzare le estensioni spaziali di MySQL con GIS.

In un esempio di codice di Google che mostra i punti su una mappa, si afferma:

Quando si crea la tabella MySQL, si desidera prestare particolare attenzione agli attributi lat e lng. Con le attuali funzionalità di zoom di Google Maps, dovresti avere solo 6 cifre di precisione dopo il decimale.

Per mantenere almeno lo spazio di archiviazione richiesto per la nostra tabella, è possibile specificare che gli attributi lat e lng siano float di dimensioni (10,6). Ciò consentirà ai campi di memorizzare 6 cifre dopo il decimale, più un massimo di 4 cifre prima del decimale, ad esempio -123,456789 gradi Non mi preoccuperei delle differenze di prestazioni tra i tipi numerici. Gli indici decenti avranno un effetto molto maggiore.

Puoi anche provare DECIMALcome suggerisce @ gandaliter .

DECIMALè il tipo di dati MySQL per l'aritmetica esatta. A differenza della FLOATsua precisione è fissa per qualsiasi dimensione del numero, quindi usandolo al posto FLOATtuo potresti evitare errori di precisione quando esegui alcuni calcoli. Se stavi solo memorizzando e recuperando i numeri senza calcoli, in pratica FLOAT sarebbe sicuro, anche se non ci sono danni nell'uso DECIMAL. Con i calcoli FLOATè ancora quasi tutto ok, ma per essere assolutamente sicuri di 8d.p. precisione che dovresti usare DECIMAL.

Le latitudini vanno da -90 a +90 (gradi), quindi DECIMAL(10,8)va bene per quello, ma le lunghezze vanno da -180 a +180 (gradi) quindi è necessario DECIMAL(11,8). Il primo numero è il numero totale di cifre memorizzate e il secondo è il numero dopo il punto decimale. In breve: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL questo spiega come MySQL funziona con tipi di dati a virgola mobile.

Informazioni correlate:


Grazie @oNare per la spiegazione dettagliata e riferimenti. Ho visto il suggerimento di gandaliter nella domanda ( stackoverflow.com/questions/12504208/… ). Ho visto anche il suggerimento di ypercube qui ( stackoverflow.com/questions/9560147/... ).
Prabhat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.