Як точно я повинен зберігати широту і довготу?


103

Я читав це питання тут:

Який тип даних використовувати для зберігання даних про широту та довготу в базах даних SQL?

І, мабуть, загальний консенсус полягає в тому, що використовувати десятковий (9,6) шлях. Питання для мене полягає в тому, наскільки точно мені це справді потрібно?

Наприклад, API Google повертає такий результат, як:

"lat": 37.4219720,
"lng": -122.0841430

З -122.0841430, скільки цифр мені потрібно? Я прочитав декілька посібників, але не можу вияснити їх, щоб зрозуміти це.

Якщо бути точнішим у моєму запитанні: якщо я хочу бути точним протягом 50 футів від точного місця, скільки знаків після десяткової точки потрібно зберігати?

Можливо, краще питання було б насправді непрограмуючим питанням, але це було б: наскільки точніше дає вам кожна десяткова крапка?

Це просто?

  1. Елемент списку
  2. x00 = 6000 миль
  3. xx0 = 600 миль
  4. ххх = 60 миль
  5. xxx.x = 6 миль
  6. xxx.xx = .6 миль
  7. тощо?

7
Точність координат залежить від того, де ці координати, тому що поверхня планети не є ідеальною сферою, а відстань від полюсів також є великим фактором. На 3 десяткових місцях, в середньому, це приблизно 120 метрів. 4 десяткових знаки становитимуть 12 метрів / 40 футів тощо ...
Марк Б

1
Дивіться це запитання на GIS stackexchange: gis.stackexchange.com/questions/8650/…
Flimm

Відповіді:


191

Точність проти десяткових знаків на екваторі

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

посилання: https://en.wikipedia.org/wiki/Decimal_degrees#Precision


4
Якщо вони є на екваторі, це означає, що це найгірші помилки?
Ліат

6
Насправді найкращий випадок екватора. Одна широта і один градус довготи однакові за розміром на екваторі (69 миль), але одна ступінь довготи зменшується до нуля, коли вона наближається до будь-якого з полюсів. Ось дуже приємне пояснення: nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloud Що б зробило ці найгірші помилки. Або, щоб бути педантичним, це найгірші помилки використання Lat / lon на рівні моря. На висоті 6,378 м похибка збільшується на 0,1%.
Скотт Б

@codingoutload: Такого посилання, мабуть, більше немає :(
Том Стамбо

1
@Tom Stambaugh: Є для цього web.archive.org
Стефан Штайгер

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

Якщо ви хочете точність 50 футів (15 м), перейдіть на 4 цифри. Такdecimal(9,6)


9
Якщо ви використовуєте SQL Server ... Варто зазначити, що для точності 1-9 використовується 5 байт. Тож, можливо, ви можете використовувати десятковий (9,6) замість десяткових (7,4) і скористатися більш високою точністю, оскільки вони обидва займають однакову кількість місця.
Тео

Для широти використовуйте (8,6)(або (6,4)збережіть байт (у MySQL).
Рік Джеймс

15

Я проектую бази даних і певний час вивчаю це питання. Ми використовуємо позачерговий додаток із резервним пакетом Oracle, де поля даних були визначені, щоб містити 17 знаків після коми. Смішно! Це в тисячних частках дюйма. Жоден GPS-прилад у світі не такий точний. Тож давайте відкладемо 17 десяткових знаків і займемося практичним. Уряд гарантує, що їх система хороша до "найгіршого випадку" псевдорантової точності 7,8 метрів при 95% рівні довіри ", але далі йдеться про те, що фактична FAA (використовуючи їх високоякісні інструменти) показала, що GPS-показання зазвичай добре в межах метра.

Отже, ви повинні задати собі два питання: 1) Що є джерелом ваших цінностей? 2) Для чого будуть використовуватися дані?

Мобільні телефони не особливо точні, і показання Google / MapQuest, ймовірно, лише 4 або 5 десяткових знаків. Високоякісний GPS-інструмент може отримати 6 (у Сполучених Штатах). Але захоплення більше, ніж це марно витрачати набравши та зберігати місця. Крім того, якщо будь-який пошук проводиться за значеннями, користувачеві приємно знати, що 6 було б найбільше, що він повинен шукати (очевидно, що будь-яке введене значення пошуку слід спочатку округлити до тієї ж точності, що і значення даних, що шукаються ).

Крім того, якщо все, що ви збираєтеся зробити, це переглянути місце розташування на Картах Google або поставити його в GPS, щоб дістатися туди, чотирьох чи п’яти - це багато.

Мені доводиться сміятися з людей навколо, вводячи всі ці цифри. І де саме вони беруть це вимірювання? Ручка передніх дверей? Поштова скринька спереду? Центр будівлі? Верхівка башти келії? І ... чи всі послідовно приймають його там же?

Як хороший дизайн бази даних, я б прийняв значення від користувача, можливо, на кілька більше п'яти десяткових цифр, а потім округлюйте і фіксуйте лише п'ять для узгодженості [можливо, шість, якщо ваші інструменти хороші, а ваше кінцеве використання гарантує це].


4
Хоча я погоджуюся, що 17 цифр - це занадто багато, я вважаю, що 6 занадто мало, якщо дані будуть оброблені після. Виконуючи такі дії, як радіус-запит ("Особливості відповіді в радіусі 0,5 милі від цієї точки"), помилки, включаючи усікання, збільшуються. Якщо вам потрібно 6 десяткових цифр на виході такого запиту, то введення слід починати зі значно більше. Наш магазин, як правило, використовує DECIMAL (18,15). Наша мета - переконатися, що db не є обмежуючим фактором точності просторових обчислень.
Том Стамбо

Вихід за межі 6 десяткових знаків перевищує доступну точність сучасних супутників GPS. Обробка після публікації не призведе до значної кількості помилок. DECIMAL(18,15)займає 9 байт.
Рік Джеймс

11

Відстань між кожним ступенем широти змінюється через форму землі та відстань між кожним ступенем довготи стає меншою, коли ви наближаєтесь до полюсів. Тож давайте поговоримо про екватор, де відстань між кожним градусом становить 110.574 км для широти та 111.320 км для довготи.

50 футів - 0,01524 км, тож:

  • 0,01524 / 110,574 = 1/7255 градуса широти
  • 0,01524 / 111,320 = 1/7304 градуса довготи

Вам потрібно чотири цифри шкали, достатньо, щоб спуститися до десятитисячних градусів із загальною точністю до семи цифр.

DECIMAL(7,4) повинно бути достатньо для ваших потреб.


5

Беручи до уваги різні частини сфери та діагональну відстань, ось таблиця доступних заходів:

   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

Не зберігайте значення з плаваючою комою. Хоча ви можете припустити, що вони точні, вони не є. Вони є наближенням. І виявляється, різні мови мають різні методи "розбору" інформації з плаваючою точкою. І різні бази даних мають різні методи реалізації наближень значення.

Замість цього використовуйте Geohash . Це відео представляє та наочно пояснює Geohash менше ніж за 5 хвилин. Geohash НАДАЛЬШЕ найкращий спосіб послідовного кодування / декодування інформації про довготу / широту. Ніколи не "серіалізуючи" приблизні значення плаваючої точки довготи / широти в стовпці бази даних, а замість цього, використовуючи Geohash, ви отримаєте ті ж бажані гарантії узгодженості подорожі, які ви отримаєте зі значеннями String. Цей веб-сайт чудово допомагає вам грати з Geohash.


FLOATі DOUBLE, в цьому контексті , не страждає від деяких описуваних вами питань.
Рік Джеймс

@RickJames Ви недостатньо вказали "цей контекст". Якщо ви маєте на увазі суворо зберігання значення у двох стовпцях БД, то, можливо. Однак задані значення не просто не вживаються у стовпцях БД, які не використовуються, неявне припущення про те, що будуть запити (близькості), записані проти цих значень. І якщо дотримуватися цього досить прагматичного припущення, то означає, що всі його питання є надійним наближенням і надалі.
хаотична рівновага

1
Якщо одне FLOATзначення та значення "наступний" настільки близькі одне до одного за значенням, що ви не можете сказати одне місто (або транспортний засіб, чи особу, чи блоху) від іншого, то помилки округлення та подання не мають значення. Тим часом майже завжди безглуздо порівнювати два FLOATs( DOUBLEsабо приблизні DECIMALs) з '='.
Рік Джеймс

Ви, здається, не вистачаєте точки. Будь-який спробу запиту буде неявним використанням рівних, якщо не явно. І це передбачає, що ви не переживаєте інші шари та мови зі значеннями, суворо залишаючись всередині SQL Server. Ось офіційний відповідь Майкрософт на це для SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
хаотичний3рівноваги

Вибачте, я подумав, що питання було позначено [mysql]не SQL Server.
Рік Джеймс

2

Якщо натиснути місця на Картах Google, ви отримаєте широту та довготу із 7 десятковими знаками

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.