2013-04-08 3 views
5

Ho una tabella che memorizza le coordinate di longitudine e latitudine (google maps) ho le colonne definite come float tuttavia quando provo a inserire un valore -61.45859899999999 e 10.28289 sono in corso arrotondato a -61,46 e 10,30. Come posso modificare le colonne per contenere i dati così come sono.MySql utilizzando il tipo di dati float per memorizzare coordinate geografiche

Sto usando mysql toad. Sotto è il codice per la tabella:

CREATE TABLE `tblGeoCodes` (
    `recNo` int(11) NOT NULL AUTO_INCREMENT, 
    `longLocation` float(30,2) DEFAULT NULL, 
    `latLocation` float(30,2) DEFAULT NULL 
+0

possibile duplicato di [Qual è il tipo di dati ideale da utilizzare quando si memorizzano latitudine/longitudini in un database MySQL?] (Http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type -uso-quando-memorizzazione-latitudine-longitudes-in-a-mysql) – Gajus

risposta

13

Ci sono due problemi con la vostra implementazione.

Il motivo i valori sono entrambi essendo arrotondati a 2 cifre di precisione che è definito esplicitamente la scala come 2.

Inoltre, FLOAT è un tipo di dati impreciso MySQL.

Per risolvere entrambi i problemi, è necessario utilizzare il tipo di dati DECIMAL con precisione e scala appropriate.

Per esempio, qualcosa di simile:

CREATE TABLE `tblGeoCodes` (
    `recNo` int(11) NOT NULL AUTO_INCREMENT primary key, 
    `longLocation` decimal(18,14) DEFAULT NULL, 
    `latLocation` decimal(18,14) DEFAULT NULL 
); 

Esempio:

mysql> CREATE TABLE `tblGeoCodes` (
    -> `recNo` int(11) NOT NULL AUTO_INCREMENT primary key, 
    -> `longLocation` decimal(18,14) DEFAULT NULL, 
    -> `latLocation` decimal(18,14) DEFAULT NULL 
    ->); 
Query OK, 0 rows affected (0.02 sec) 

mysql> 
mysql> insert into tblGeoCodes (longLocation,latLocation) values(-61.45859899999999 , 10.28289); 
Query OK, 1 row affected (0.00 sec) 

mysql> 
mysql> select * from tblGeoCodes; 
+-------+--------------------+-------------------+ 
| recNo | longLocation  | latLocation  | 
+-------+--------------------+-------------------+ 
|  1 | -61.45859899999999 | 10.28289000000000 | 
+-------+--------------------+-------------------+ 
1 row in set (0.00 sec) 
+0

ho provato questo e sto ottenendo -61.45860000000000 quando inserisco -61.45859899999999 come posso evitare questo? – devdar

+0

Aggiungerò un esempio che mostra questo funzionamento. –

+0

grazie mille penso che costruirò questo tavolo manualmente – devdar

0

Io suggerirei di conversione in MyISAM per sfruttare GSI. È più adatto a tale scopo e dovrebbe funzionare meglio.

Tuttavia, come già suggerito, aumentare la precisione dei campi mobili potrebbe essere una soluzione più semplice. Dal momento che ti viene taggata la domanda come google-maps releted, ti consiglio anche this tutorial nel sito dev di Google.

+0

dovrei inserire il float così com'è senza arrotondare il valore? – devdar

+0

Inoltre, come fai a sapere che l'OP non sta già utilizzando MyISAM? –

+0

Forse non ho dato la risposta più pratica. Ho modificato per più utile (spero). – guessimtoolate

5

Il ,2 in float(30,2) rappresenta 2 cifre decimali. Io uso float(10,6) come questo è sufficiente per contenere le coordinate

+1

Beh, sei punti decimali sono circa 2 pollici all'equatore (o qualsiasi linea di longitudine), quindi se questo è sufficiente precisione, sei a posto con 6 posizioni decimali. Dipende per quale scopo stai usando latitudine e longitudine. –

+0

Dato che OP sta usando le coordinate in Google Maps e la maggior parte dei sistemi GPS sono precisi a circa 10 metri, 6 cifre decimali sono adeguate. –

+0

Overkill, piuttosto che adeguato, suggerirei. Quattro punti decimali sono 18,3 piedi (5.6 m), quindi potresti risparmiare spazio e qualche tempo di calcolo se hai archiviato 4 invece di 6. –

0

Bare a mente che FLOAT(10,6) non ha senso, questo riserva 4 cifre per la parte intera.

Personalmente, preferisco DOUBLE(9,6) ma è possibile utilizzare FLOAT per salvare i 4 byte aggiuntivi.