Czytałem to pytanie tutaj:
Wydaje się, że ogólny konsensus jest taki, że najlepszym rozwiązaniem jest użycie Decimal (9,6). Pytanie do mnie brzmi, jak dokładne jest to naprawdę potrzebne?
Na przykład interfejs API Google zwraca wynik taki:
"lat": 37.4219720,
"lng": -122.0841430
Z -122,0841430, ile cyfr potrzebuję? Przeczytałem kilka przewodników, ale nie mam z nich na tyle sensu, aby to rozgryźć.
Aby być bardziej precyzyjnym w moim pytaniu: jeśli chcę być dokładny z dokładnością do 50 stóp od dokładnej lokalizacji, ile miejsc dziesiętnych muszę zapisać?
Być może lepszym pytaniem byłoby w rzeczywistości pytanie niezwiązane z programowaniem, ale brzmiałoby: o ile dokładniejsze jest każde miejsce dziesiętne?
Czy to takie proste?
- Element listy
- x00 = 6000 mil
- xx0 = 600 mil
- xxx = 60 mil
- xxx.x = 6 mil
- xxx.xx = 0,6 mili
- itp?
mysql
geolocation
Obywatel
źródło
źródło
Odpowiedzi:
Dokładność a miejsca po przecinku na równiku
ref: https://en.wikipedia.org/wiki/Decimal_degrees#Precision
źródło
Jeśli chcesz dokładności 50 stóp (15 m), wybierz 4 cyfry. Więc
decimal(9,6)
źródło
(8,6)
(lub,(6,4)
aby zapisać bajt (w MySQL).Projektuję bazy danych i od jakiegoś czasu zajmuję się tą kwestią. Używamy gotowej aplikacji z zapleczem Oracle, w którym pola danych zostały zdefiniowane tak, aby dopuszczały 17 miejsc po przecinku. Śmieszny! To jest w tysięcznych częściach cala. Żaden instrument GPS na świecie nie jest tak dokładny. Odłóżmy więc na bok 17 miejsc po przecinku i zajmijmy się sprawami praktycznymi. Rząd gwarantuje, że ich system jest dobry dla „najgorszego przypadku” pseudoodległości z dokładnością 7,8 metra przy 95% poziomie ufności ”, ale następnie mówi, że faktyczna FAA (przy użyciu ich wysokiej jakości instrumentów) wykazała, że odczyty GPS są zwykle dobre dla w promieniu metra.
Musisz więc zadać sobie dwa pytania: 1) Jakie jest źródło twoich wartości? 2) Do czego będą wykorzystywane dane?
Telefony komórkowe nie są szczególnie dokładne, a odczyty Google / MapQuest są prawdopodobnie dobre tylko do 4 lub 5 miejsc po przecinku. Wysokiej jakości instrument GPS może dać ci 6 punktów (w Stanach Zjednoczonych). Ale przechwytywanie więcej to strata miejsca na pisanie i przechowywanie. Ponadto, jeśli jakiekolwiek wyszukiwania są wykonywane na wartościach, dobrze jest dla użytkownika wiedzieć, że 6 byłoby najbardziej pożądanym przez niego / nią (oczywiście każda wprowadzona wartość wyszukiwania powinna być najpierw zaokrąglona z taką samą dokładnością jak wartość przeszukiwanej danych ).
Co więcej, jeśli wszystko, co zamierzasz zrobić, to wyświetlić lokalizację w Mapach Google lub umieścić ją w GPS, aby się tam dostać, cztery lub pięć to dużo.
Muszę się śmiać z ludzi tutaj wpisujących te wszystkie cyfry. A gdzie dokładnie dokonują tego pomiaru? Gałka do drzwi wejściowych? Skrzynka pocztowa z przodu? Centrum budynku? Wierzchołek wieży komórkowej? I ... czy wszyscy konsekwentnie biorą to w to samo miejsce?
Jako dobry projekt bazy danych, zaakceptowałbym wartości od użytkownika dla może kilku więcej niż pięciu cyfr dziesiętnych, a następnie zaokrągliłbym i przechwycił tylko pięć dla spójności [może sześć, jeśli twoje instrumenty są dobre i twoje końcowe użycie to uzasadnia].
źródło
DECIMAL(18,15)
zajmuje 9 bajtów.Odległość między poszczególnymi stopniami szerokości geograficznej zmienia się ze względu na kształt ziemi, a odległość między poszczególnymi stopniami długości geograficznej maleje w miarę zbliżania się do biegunów. Porozmawiajmy więc o równiku, gdzie odległość między poszczególnymi stopniami wynosi 110,574 km dla szerokości geograficznej i 111,320 km dla długości geograficznej.
50 stóp to 0,01524 km, więc:
Potrzebujesz czterech cyfr skali, wystarczających do zejścia do dziesięciu tysięcznych stopnia, z dokładnością do siedmiu cyfr.
DECIMAL(7,4)
powinno wystarczyć na Twoje potrzeby.źródło
Biorąc pod uwagę różne części kuli i odległość po przekątnej, oto tabela dostępnych dokładności:
- http://mysql.rjweb.org/doc.php/latlng#representation_choices
źródło
Nie przechowuj wartości zmiennoprzecinkowych. Chociaż możesz założyć, że są dokładne, tak nie jest. Są przybliżeniem. Okazuje się, że różne języki mają różne metody „analizowania” informacji zmiennoprzecinkowych. Różne bazy danych mają różne metody implementacji przybliżeń wartości.
Zamiast tego użyj Geohash . Ten film przedstawia i wizualnie wyjaśnia Geohash w mniej niż 5 minut. Geohash jest ZDECYDOWANIE lepszym sposobem kodowania / dekodowania informacji o długości / szerokości geograficznej w spójny sposób. Nigdy nie „serializując” przybliżonych wartości zmiennoprzecinkowych długości / szerokości geograficznej w kolumnach bazy danych, a zamiast tego, używając Geohash, uzyskasz taką samą pożądaną spójność w obie strony, jaką otrzymasz z wartościami String. Ta strona jest świetna, aby pomóc ci grać z Geohash.
źródło
FLOAT
iDOUBLE
, w tym kontekście , nie cierpi z niektórych można opisać problemy.FLOAT
wartość i wartość „następna” są tak bliskie sobie pod względem wartości, że nie można odróżnić jednego miasta (lub pojazdu, osoby lub pchły) od drugiego, wówczas błędy zaokrąglenia i reprezentacji nie mają znaczenia. Tymczasem prawie zawsze szaleństwem jest porównywanie dwóchFLOATs
(DOUBLEs
lub przybliżonychDECIMALs
) za pomocą „=”.[mysql]
, a nie SQL Server.Klikając lokalizacje w Mapach Google, uzyskasz szerokość i długość geograficzną z 7 miejscami po przecinku
źródło