Jak dokładnie należy przechowywać szerokość i długość geograficzną?


103

Czytałem to pytanie tutaj:

Jakiego typu danych użyć podczas przechowywania danych o szerokości i długości geograficznej w bazach danych SQL?

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?

  1. Element listy
  2. x00 = 6000 mil
  3. xx0 = 600 mil
  4. xxx = 60 mil
  5. xxx.x = 6 mil
  6. xxx.xx = 0,6 mili
  7. itp?

7
Dokładność współrzędnych zależy od tego, GDZIE te współrzędne się znajdują, ponieważ powierzchnia planety nie jest idealną kulą, a odległość od biegunów jest również NAJWAŻNIEJSZYM czynnikiem. Jednak średnio 3 miejsca po przecinku to około 120 metrów / 400 stóp. 4 miejsca po przecinku to 12 metrów / 40 stóp itd ...
Marc B,

1
Zobacz to pytanie na GIS stackexchange
Flimm

Odpowiedzi:


191

Dokładność a miejsca po przecinku na równiku

decimal  degrees    distance
places
-------------------------------  
0        1.0        111 km
1        0.1        11.1 km
2        0.01       1.11 km
3        0.001      111 m
4        0.0001     11.1 m
5        0.00001    1.11 m
6        0.000001   0.111 m
7        0.0000001  1.11 cm
8        0.00000001 1.11 mm

ref: https://en.wikipedia.org/wiki/Decimal_degrees#Precision


4
Jeśli te są na równiku, czy to oznacza, że ​​są to błędy najgorszego przypadku?
Liath

6
Właściwie najlepszym rozwiązaniem jest równik. Jeden stopień szerokości i jeden stopień długości geograficznej mają taką samą wielkość na równiku (69 mil), ale jeden stopień długości geograficznej zmniejsza się do zera, gdy zbliża się do któregokolwiek z biegunów. Oto bardzo ładne wyjaśnienie: nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloud Co spowodowałoby te najgorsze błędy. Albo mówiąc pedantycznie, są to najgorsze błędy przy używaniu szerokości / długości geograficznej na poziomie morza. Na wysokości 6 378 m błąd wzrasta o 0,1%.
Scott B

@codingoutload: Ten link najwyraźniej już nie istnieje :(
Tom Stambaugh,

1
@Tom Stambaugh: Jest do tego web.archive.org
Stefan Steiger

19
+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+

Jeśli chcesz dokładności 50 stóp (15 m), wybierz 4 cyfry. Więcdecimal(9,6)


9
Jeśli używasz SQL Server ... Warto zauważyć, że precyzja 1-9 zajmuje 5 bajtów. Więc możesz dobrze użyć dziesiętnego (9,6) zamiast dziesiętnego (7,4) i skorzystać z większej dokładności, ponieważ oba zajmują taką samą ilość miejsca.
Theo

Aby uzyskać szerokość geograficzną, użyj (8,6)(lub, (6,4)aby zapisać bajt (w MySQL).
Rick James

15

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].


4
Chociaż zgadzam się, że 17 cyfr to za dużo, sugeruję, że 6 to za mało, jeśli dane mają być przetwarzane dalej. Podczas wykonywania takich czynności, jak zapytanie o promień („Odpowiadaj na obiekty w promieniu 0,5 mili od tego punktu”), błędy - w tym obcięcie - są powiększane. Jeśli potrzebujesz 6 cyfr dziesiętnych na wyjściu takiego zapytania, dane wejściowe powinny zaczynać się od znacznie więcej. Nasz sklep zwykle używa DECIMAL (18,15). Naszym celem jest zapewnienie, aby db nie był czynnikiem ograniczającym dokładność obliczeń przestrzennych.
Tom Stambaugh

Wykroczenie poza 6 miejsc po przecinku wykracza poza dostępną dokładność dzisiejszych satelitów GPS. Przetwarzanie końcowe nie spowoduje znaczącej ilości błędów. DECIMAL(18,15)zajmuje 9 bajtów.
Rick James

11

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:

  • 0,01524 / 110,574 = 1/7255 stopnia szerokości geograficznej
  • 0,01524 / 111,320 = 1/7304 stopnia długości geograficznej

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.


5

Biorąc pod uwagę różne części kuli i odległość po przekątnej, oto tabela dostępnych dokładności:

   Datatype           Bytes       resolution
   ------------------ -----  --------------------------------
   Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
   DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
   SMALLINT scaled        4   682 m    0.4 mi  Cities
   Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
   DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
   MEDIUMINT scaled       6   2.7 m    8.8 ft
   FLOAT                  8   1.7 m    5.6 ft
   DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
   Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
   DOUBLE                16   3.5nm     ...    Fleas on a dog

- http://mysql.rjweb.org/doc.php/latlng#representation_choices


3

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.


FLOATi DOUBLE, w tym kontekście , nie cierpi z niektórych można opisać problemy.
Rick James

@RickJames Nie określiłeś wystarczająco „tego kontekstu”. Jeśli masz na myśli ściśle przechowywanie wartości w dwóch kolumnach DB, to być może. Jednak podane wartości nie są po prostu nieużywane w kolumnach bazy danych, co jest niejawnym założeniem, że będą (bliskości) zapytania zapisywane w odniesieniu do tych wartości. Utrzymanie tego dość pragmatycznego założenia oznacza, że ​​wszystkie kwestie związane z niewiarygodnym przybliżeniem są nadal aktualne.
chaotic3quilibrium

1
Jeśli jedna FLOATwartość 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óch FLOATs( DOUBLEslub przybliżonych DECIMALs) za pomocą „=”.
Rick James

Wydaje się, że nie rozumiesz. Każda próba zapytania będzie niejawnie używać równości, jeśli nie jawnie. A to zakłada, że ​​nie przechodzisz przez inne warstwy i języki z wartościami, ściśle pozostając wewnątrz SQL Server. Oto oficjalna odpowiedź firmy Microsoft dotycząca programu SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
chaotic3quilibrium

Przepraszam, myślałem, że pytanie zostało oznaczone [mysql], a nie SQL Server.
Rick James

2

Klikając lokalizacje w Mapach Google, uzyskasz szerokość i długość geograficzną z 7 miejscami po przecinku

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.