Pracuję z danymi map i Latitude/Longitude
obejmuje 8 miejsc po przecinku. Na przykład:
Latitude 40.71727401
Longitude -74.00898606
Widziałem w dokumencie Google, który używa:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
Jednak ich miejsca dziesiętne wynoszą tylko 6.
Powinienem użyć FLOAT(10, 8)
lub istnieje inna metoda do rozważenia, aby przechowywać te dane, więc są one dokładne. Będzie używany z obliczeniami mapy. Dzięki!
mysql
types
floating-point
Edward
źródło
źródło
float
typu - ma on tylko 7 cyfr dokładności. Potrzebujesz co najmniej 9. Nie potrzebujesz 10 - dokumenty z jakiegoś dziwnego powodu liczą znak minus jako cyfrę. Wykonaj albo:double(9,6)
albodecimal(9,6)
.FLOAT
rozróżnia dwa elementy w odległości 1,7 m (5,6 stopy) Wszystkie są absurdalnie przesadne jak na aplikacje „mapujące”!Odpowiedzi:
DECIMAL to typ danych MySQL dla dokładnej arytmetyki. W przeciwieństwie do FLOAT, jego precyzja jest ustalona dla dowolnego rozmiaru liczby, więc używając go zamiast FLOAT można uniknąć błędów precyzji podczas wykonywania niektórych obliczeń. Jeśli tylko przechowywałeś i pobierałeś liczby bez obliczeń, w praktyce FLOAT byłby bezpieczny, chociaż korzystanie z DECIMAL nie szkodzi. Z obliczeń FLOAT nadal jest w większości w porządku, ale dla absolutnej pewności co do 8d.p. precyzji należy użyć DECIMAL.
Szerokość geograficzna wynosi od -90 do +90 (stopni), więc DECIMAL (10, 8) jest do tego odpowiedni, ale długości geograficzne wynoszą od -180 do +180 (stopni), więc potrzebujesz DECIMAL (11, 8). Pierwsza liczba to całkowita liczba zapisanych cyfr, a druga to liczba po przecinku.
W skrócie:
lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
To wyjaśnia, jak MySQL działa z zmiennoprzecinkowymi typami danych.
AKTUALIZACJA: MySQL obsługuje typy danych przestrzennych i
Point
jest typem pojedynczej wartości, którego można używać. Przykład:źródło
Dodatkowo zobaczysz, że
float
wartości są zaokrąglone.źródło
double
typu danych, który ma wymaganą precyzję.w laravel wykorzystano dziesiętny typ kolumny do migracji
Aby uzyskać więcej informacji, zobacz dostępny typ kolumny
źródło
Możesz ustawić swój typ danych jako liczbę całkowitą ze znakiem. Podczas przechowywania współrzędnych do SQL można ustawić jako lat * 10000000 i długi * 10000000. A kiedy wybierasz z odległością / promieniem, podzielisz współrzędne miejsca przechowywania na 10000000. Przetestowałem to z 300 000 wierszy, czas odpowiedzi na zapytanie jest dobry. (2 x 2,67 GHz, 2 GB pamięci RAM, MySQL 5.5.49)
źródło
Nie używaj pływaka ... Zaokrągli twoje współrzędne, powodując dziwne zdarzenia.
Użyj dziesiętnego
źródło
MySQL obsługuje teraz typy danych przestrzennych od czasu zadania tego pytania. Tak więc bieżąca akceptowana odpowiedź nie jest zła, ale jeśli szukasz dodatkowej funkcjonalności, takiej jak znalezienie wszystkich punktów w danym wielokącie, użyj typu danych POINT.
Zapoznaj się z dokumentacją MySQL dotyczącą typów danych geoprzestrzennych i funkcji analizy przestrzennej
źródło
Uważam, że najlepszym sposobem przechowywania Lat / Lng w MySQL jest posiadanie kolumny POINT (typ danych 2D) z indeksem SPATIAL.
źródło
Korzystanie z migracji ruby na szynach
źródło
(20,18)
również kończy się na +/- 99.Kod używający / potwierdzający precyzję odpowiedzi Oğuzhan KURNUÇ .
PODSUMOWANIE:
Wielka precyzja (~ 1 cm) w małym rozmiarze (4B).
Dokładność wynosi (bardzo blisko) 7 cyfr dziesiętnych dla wartości z zakresu [-180, 180].
To 7 cyfr na prawo od miejsca po przecinku (~ 1 cm) , w sumie 9 cyfr (lub 10 cyfr, licząc początkowe „1” z „180”) w pobliżu + -180.
Porównaj to z 4-bajtową liczbą zmiennoprzecinkową , która ma tylko ~ 7 cyfr łącznie, więc ~ 5 cyfr po prawej stronie dziesiętnej w pobliżu + = 180 (~ 1m) .
Metody zastosowania tego podejścia:
Testy precyzji:
Metody pomocnicze stosowane w testach:
źródło