Dezimal- oder Punktdatentyp zum Speichern von Geostandortdaten in MySQL

8

Ich möchte den Geo-Speicherort für jede Adresse in meiner MySQL (Innodb) "tblAddress" -Tabelle speichern und habe 2 Optionen:

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

2) One Column for Each Address:
GeoLocation POINT

Mein Programm muss alle Adressen finden, die unter 1 km Radius vom aktuellen Standort (Mobile Client) liegen.

Auch der folgende Befehl funktioniert bei mir nicht, ich bin mir nicht sicher, was ich dafür haben muss.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

Was ist der vorgeschlagene Ansatz, um Daten für eine schnellere Berechnung und einen schnelleren Abruf hier zu speichern? Bitte beraten.

Prabhat
quelle

Antworten:

6

Sie können die räumlichen Erweiterungen von MySQL mit GIS verwenden.

In einem Codebeispiel von Google , in dem Punkte auf einer Karte angezeigt werden, heißt es:

Wenn Sie die MySQL-Tabelle erstellen, möchten Sie den Attributen lat und lng besondere Aufmerksamkeit widmen. Mit den aktuellen Zoomfunktionen von Google Maps sollten Sie nach der Dezimalstelle nur 6 Stellen Genauigkeit benötigen.

Um den für unsere Tabelle erforderlichen Speicherplatz auf ein Minimum zu beschränken, können Sie angeben, dass die Attribute lat und lng Floats der Größe (10,6) sind. Dadurch können die Felder 6 Stellen nach der Dezimalstelle sowie bis zu 4 Stellen vor der Dezimalstelle speichern, z. B. -123.456789 Grad. Ich würde mir keine Sorgen über Leistungsunterschiede zwischen numerischen Typen machen. Anständige Indizes werden eine weitaus größere Wirkung haben.

Sie können es auch versuchen, DECIMALwie @ gandaliter vorschlägt.

DECIMAList der MySQL-Datentyp für exakte Arithmetik. Im Gegensatz dazu ist FLOATdie Genauigkeit für jede FLOATZahlengröße festgelegt. Wenn Sie sie stattdessen verwenden, können Sie bei einigen Berechnungen Präzisionsfehler vermeiden. Wenn Sie nur die Zahlen ohne Berechnung speichern und abrufen FLOAT würden, wäre dies in der Praxis sicher, obwohl die Verwendung keinen Schaden anrichtet DECIMAL. Mit Berechnungen FLOATist meistens noch ok, aber um absolut sicher zu sein, 8d.p. Präzision, die Sie verwenden sollten DECIMAL.

Die Breiten reichen von -90 bis +90 (Grad), das DECIMAL(10,8)ist also in Ordnung, aber die Längen reichen von -180 bis +180 (Grad), so dass Sie es brauchen DECIMAL(11,8). Die erste Zahl ist die Gesamtzahl der gespeicherten Ziffern und die zweite die Zahl nach dem Dezimalpunkt. Kurz gesagt: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL Dies erklärt, wie MySQL mit Gleitkomma-Datentypen funktioniert.

Verwandte Informationen:

oNare
quelle
Vielen Dank an @oNare für Ihre ausführlichen Erklärungen und Referenzen. Ich habe den Vorschlag von Gandaliter in der Frage gesehen ( stackoverflow.com/questions/12504208/… ). Ich habe auch den Vorschlag von ypercube hier gesehen ( stackoverflow.com/questions/9560147/… ).
Prabhat