2013-04-08 4 views
5

Ich habe eine Tabelle, die Längen- und Breitengrad-Koordinaten speichert (google maps) Ich habe die Spalten float aber wenn ich versuche, einen Wert -61.4585989999999999 und 10.28289 einfügen werden sie auf -61,46 und 10,30 abgerundet. Wie kann ich die Spalten ändern, um die Daten so zu halten, wie sie sind.MySql mit Float-Datentyp zum Speichern geographischer Koordinaten

Ich verwende Mysql Kröte. Unter ist der Code für die Tabelle:

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

mögliches Duplikat von [Welchen idealen Datentyp verwendet man zum Speichern von Breiten-/Längenangaben in einer MySQL-Datenbank?] (Http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type) to-use-when-storing-Längengrad-in-a-mysql) – Gajus

Antwort

13

Es gibt zwei Probleme mit Ihrer Implementierung.

Der Grund wird die Werte sowohl auf zwei Stellen hinter dem Komma gerundet werden, ist, dass Sie explizit die Waage als 2.

auch definiert, FLOAT ist ein ungenauer Datentyp in MySQL.

Um beide Probleme zu lösen, sollten Sie den Datentyp DECIMAL mit einer geeigneten Genauigkeit und Skalierung verwenden.

Zum Beispiel so etwas wie diese:

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

Beispiel:

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

Ich habe das versucht und ich bekomme -61.45860000000000, wenn ich -61.45859899999999 einfüge, wie kann ich das verhindern? – devdar

+0

Ich füge ein Beispiel hinzu, das das funktioniert zeigt. –

+0

vielen Dank denke ich werde diese Tabelle manuell – devdar

0

ich MYISAM Umwandlung würde vorschlagen Vorteil GSI zu nehmen. Es ist besser für diesen Zweck geeignet und sollte besser funktionieren.

Wie bereits vorgeschlagen, könnte die Erhöhung der Genauigkeit von Float-Feldern jedoch eine einfachere Lösung sein. Da du mit der Frage "Google-Maps" versehen bist, würde ich auch empfehlen, this tutorial auf Googles Dev-Seite zu empfehlen.

+0

würde ich den Float eingefügt werden wie es ist ohne runden den Wert? – devdar

+0

Woher wissen Sie, dass das OP MyISAM nicht bereits verwendet? –

+0

Vielleicht habe ich nicht die praktischste Antwort gegeben. Ich habe es zu nützlicher bearbeitet (ich hoffe). – guessimtoolate

5

Die ,2 in float(30,2) für 2 Dezimalstellen. Ich benutze float(10,6), da dies ausreichend ist, um Koordinaten zu halten

+1

Nun, sechs Dezimalstellen ist etwa 2 Zoll am Äquator (oder eine beliebige Länge der Länge), wenn das ausreichende Genauigkeit ist, sind Sie mit 6 Dezimalstellen in Ordnung. Es hängt davon ab, für welchen Zweck Sie Breiten- und Längengrad verwenden. –

+0

Wie OP verwendet Koordinaten in Google Maps und die meisten GPS-Systeme sind auf etwa 10 Meter genau, 6 Nachkommastellen ist ausreichend –

+0

Overkill, eher als angemessen, würde ich vorschlagen. Vier Dezimalstellen sind 18,3 Fuß (5.6 m), damit Sie Platz und Rechenzeit sparen können, wenn Sie 4 statt 6 gespeichert haben. –

0

Berücksichtigen Sie, dass FLOAT(10,6) keinen Sinn ergibt, reserviert dies 4 Ziffern für den ganzzahligen Teil.

Persönlich bevorzuge ich DOUBLE(9,6), aber Sie könnten stattdessen FLOAT verwenden, um die 4 zusätzlichen Bytes zu speichern.

Verwandte Themen