Tipi di dati per la memorizzazione di lng / lat in MySQL


14

Sto memorizzando un ampio elenco di punti lnt / lat in un database MySQL. Al momento si tratta di punti previsti per il Regno Unito in M, ma a lungo termine vorrei assicurarmi di poter memorizzare le coordinate dei punti per tutto il mondo. Quale tipo di dati dovrei usare?

Ho iniziato a usare decimal(18,12), ma non ero sicuro se fosse necessaria questa precisione o se potessi semplicemente usare a float. Ho incluso il mio codice, nel caso ci fosse qualcos'altro che dovrei considerare:

CREATE TABLE UKTest
(
lat FLOAT,
lng FLOAT
)

Sono abbastanza nuovo in SQL, quindi non sono sicuro che il tipo di dati sia significativo quando si esegue una query. Ho ipotizzato che la memoria complessiva potesse variare in base al tipo di variabile. C'è un vantaggio nell'utilizzare un database spaziale su un database MySQL di base per questo tipo di lavoro?

Risposte:


16

Questo domanda è stata posta anche su StackOverlow .

La risposta migliore suggerisce le estensioni spaziali di MySQL . Esistono molti collegamenti per lavorare con queste estensioni qui .

Se non si desidera utilizzare tipi spaziali e si ottengono valori da un'unità GPS o da un servizio di geocodifica, è possibile abbinare la precisione decimale all'origine dati. Una regola empirica generale è quella di archiviare i dati con una precisione di due posizioni superiore a quella che verranno visualizzati in un'applicazione.

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

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, oltre a 4 cifre prima del decimale, ad esempio -123,456789 gradi

Non mi preoccuperei delle differenze di prestazioni tra tipi numerici. Gli indici decenti avranno un effetto molto maggiore.


+1 per una buona risposta! Questo è quello che avrei detto e fatto.
OptimizePrime,

Grazie per la risposta: ho letto la documentazione di MySQL Spatial Extensions, ma come inizi a usarli? Ho solo un DB MySQL predefinito su GoDaddy; Non so da dove cominciare.
djq


1
E rispondi aggiornato con un link ad altri link
geographika

Perché 4 cifre intere?
Alix Axel,

6

A meno che tu non sia legato a MySQL per qualche altra ragione, dovresti davvero prendere in considerazione l'uso di un database spazialmente abilitato come Postgis che ha un oggetto Point (e Line, Polygon ecc) per gestire questi dettagli per te. Ottieni anche supporto di proiezione per quando apporti quel cambiamento al mondo intero.

2019 : per le persone come me che non leggono commenti: MySQL supporta tipi di dati spaziali, apparentemente più lenti, senza prove.


Nota: per coloro che sono nuovi e che leggono quanto sopra, MySql 5.7+ ora funziona con gli indici spaziali.
HopeKing

ma è ancora lento
Ian Turton

Potresti aiutare con risorse che mostrano quanto lentamente? Sto pensando di usarlo su un progetto con meno di un milione di dischi. Grazie.
HopeKing

esperienza personale nessun dato pubblico. Troppi problemi con geometrie non valide, ecc. Che rompono le cose
Ian Turton

Grazie. Il mio bisogno è solo la distanza tra i punti in base ai record del database (e nessun requisito complesso come Polygon), quindi per ora sarà probabilmente sicuro usare mysql.
HopeKing
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.