2010-01-27 9 views
6

Ich habe einen Datensatz von Städtenamen mit ihren entsprechenden Breiten/Längen, die ich in eine MySQL-Tabelle geladen habe:Wie berechne ich die Breiten-/Längengraddaten korrekt in MySQL?

city_id | Stadtname | Breitengrad DEZIMAL (9,6) | Länge DEZIMAL (9,6)

Typische Breiten-/Längengrade können wie folgt aussehen: 54.284758/32.484736.

Ich bekomme jedoch nur Werte mit einer Skala von 2, um korrekt in meiner Tabelle zu erscheinen, mit anderen Worten, das Äquivalent von DECIMAL (5,2). Die Daten werden von einer Text-CSV hochgeladen, die aus OpenOffice Calc für UTF-8-Zwecke exportiert wurde. Ich weiß, dass OpenOffice Probleme mit Dezimalstellen hat, aber die volle Breite/Länge sind sicherlich in der exportierten CSV. Wenn ich die CSV-Datei mit dem Editor öffne, sind die Daten in Ordnung.

Kann jemand sehen, was ich falsch machen könnte?

Danke.

UPDATE: Habe es funktioniert, danke für den ganzen Eingang. Ich habe alles von Grund auf neu erstellt, eine neue Schemadatei (ich benutze ein ORM), einen neuen CSV-Export, eine neue Tabelle, ein neues LOAD DATA INFILE und es funktioniert mit der korrekten Dezimalausgabe. Schlägt mich.

+0

Wenn Sie in Ihrer Tabelle "inkorrekt" sagen, meinen Sie, wenn Sie an einer MySQL-Eingabeaufforderung "SELECT * FROM mytable" eingeben? Oder hast du einen Zuschauer? – Tenner

+0

@Tenner .... Ich benutze MySQL Workbench, aber das Ergebnis ist das gleiche, wenn ich eine Koordinate über PHP ziehen. – Tom

+0

Da die Datentypen "DECIMAL (9,6)" sind und die CSV-Datei korrekt ist, wenn Sie sie in Notepad anzeigen, ist etwas damit zu tun, was Sie zum Importieren der Daten verwenden. Sehen Sie sich das MySQL LOAD DATA INFILE an, falls es das Problem umgeht: http://dev.mysql.com/doc/refman/5.1/en/load-data.html –

Antwort

5

Dies kann für Ihre Anforderungen zu viel Aufwand sein, aber wenn Sie geografische Daten bearbeiten, sollten Sie die Verwendung von MySQL Spatial Extensions in Betracht ziehen.

Ich füge hinzu, dass der Datentyp, den Sie gerade verwenden, ausreicht, um die Daten so darzustellen, wie es in Ihrer CSV-Datei ist. Es gibt entweder etwas in Ihrem Importeur, das es beim Import abschneidet, oder was auch immer Sie verwenden, um die Daten anzuzeigen, schneidet es ab.

+0

Danke, hatte einen Blick früher ..... es ist ein wenig Overkill :) – Tom

1

Ich würde vorschlagen, einen String-Datentyp wie Varchar zum Speichern von Lat, Long. Ich arbeite an einer App, die diese Koordinaten ausgiebig nutzt und ich habe keine Probleme damit gehabt, sie als String zu speichern. Speichern Sie es als eine Zahl, die Sie auf Präzisionsprobleme stoßen werden.

Nur etwas zu beachten.

+0

Danke Lukasz. Was meinst du mit Präzisionsfragen? Ich werde die Daten nicht sehr streng verwenden. Nur um noch einige Google Map Koordinaten und Mini-Apps zu generieren. Ich hätte gedacht, dass eine Skala von 6 ziemlich genau ist? – Tom

+2

Wie sortieren Sie? Oder in einem Umkreis suchen? Es scheint, als würde das Speichern dieser Dateien als Zeichenfolgen zu unnötigem Laufzeit-Casting führen. – Tenner

+0

Präzision weise würde ich empfehlen, eine Zeichenfolge oder eine ausreichend große Dezimalstelle zu verwenden. Zum Beispiel kann mit float folgendes passieren.Ich habe diese Koordinate, die von Bing Maps zurückgegeben wurde, 43.371240452765925 Speichern dieses Werts als Float führt zu 43.3712404527659. Es ist kein großer Fehler, aber es ist ein Fehler. Wie beim Sortieren sortiert T-SQL mit der lexikographischen Reihenfolge, was bedeutet, dass String und Zahlen in ähnlicher Weise sortiert werden, so dass kein Cast erforderlich ist. – Lukasz

0

Warum deklarieren Sie nicht einfach die Felder DOUBLE in Ihrer MySQL-Tabelle? Die Qualifikationsmerkmale für die Anzahl der Ziffern und die Ziffern hinter dem Dezimalpunkt sind optional.

+0

Danke, werde versuchen, dass in einem Moment, aber wie das MySQL-Handbuch sagt, DOUBLE/FLOAT ist nicht das richtige Format, wenn genaue Präzision benötigt wird, während DECIMAL ist. – Tom