Насколько точно я должен хранить широту и долготу? - PullRequest
89 голосов
/ 24 августа 2011

Я читал этот вопрос здесь:

Какой тип данных использовать при хранении данных широты и долготы в базах данных SQL?

И, похоже, общее мнение заключается в том, чтоиспользование десятичного (9,6) путь.Вопрос для меня: насколько точно это мне действительно нужно?

Например, API Google возвращает результат, такой как:

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

из -122.0841430, сколько цифр мне нужно?Я прочитал несколько руководств, но не могу найти в них достаточного смысла, чтобы понять это.

Чтобы быть более точным в моем вопросе: если я хочу быть точным в пределах 50 футов от точного местоположения,Сколько десятичных точек мне нужно хранить?

Возможно, лучшим вопросом на самом деле был бы вопрос, не связанный с программированием, но он был бы таков: насколько точнее дает каждая десятичная точка?

Это так просто?

  1. Элемент списка
  2. x00 = 6000 миль
  3. xx0 = 600 миль
  4. xxx = 60 миль
  5. xxx.x = 6 миль
  6. xxx.xx = .6 миль
  7. и т. Д.

Ответы [ 6 ]

166 голосов
/ 26 ноября 2012

Точность по сравнению с десятичными знаками на экваторе

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

18 голосов
/ 24 августа 2011
+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+

Если вам нужна точность 50 футов (15 м), используйте 4 цифры. Итак decimal(9,6)

15 голосов
/ 29 апреля 2014

Я проектирую базы данных и некоторое время изучаю этот вопрос. Мы используем готовое приложение с серверной частью Oracle, где поля данных были определены, чтобы разрешить 17 десятичных знаков. Смешной! Это в тысячных дюйма. Ни один GPS-инструмент в мире не является таким точным. Итак, давайте отложим 17 десятичных знаков и разберемся с практическими. Правительство гарантирует, что их система хороша для "псевдодальности" наихудшего случая с точностью 7,8 метра при уровне достоверности 95% ", но затем продолжает говорить, что фактический FAA (с использованием их высококачественных инструментов) показал, что показания GPS обычно хороши для в пределах метра.

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

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

Кроме того, если все, что вы собираетесь сделать, это просмотреть местоположение в Картах Google или поместить его в GPS, чтобы добраться туда, четыре или пять - это достаточно.

Я должен смеяться над людьми, которые вводят все эти цифры. И где именно они проводят это измерение? Ручка передней двери? Почтовый ящик снаружи? Центр строительства? Верх сотовой вышки? И ... все постоянно принимают его в одном и том же месте?

Как хороший дизайн базы данных, я бы принял значения от пользователя для, возможно, нескольких больше пяти десятичных цифр, затем округлил бы и собрал только пять для согласованности [возможно, шесть, если ваши инструменты хороши, и ваше конечное использование гарантирует это].

11 голосов
/ 24 августа 2011

Расстояние между каждым градусом широты варьируется из-за формы земли, а расстояние между каждым градусом долготы уменьшается по мере приближения к полюсам.Итак, давайте поговорим об экваторе, где расстояние между каждым градусом составляет 110,574 км для широты и 111,320 км для долготы.

50 футов составляет 0,01524 км, поэтому:

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

Вам нужно четыре цифры шкалы, достаточно дляперейдите к десяти тысячным градуса с семизначной точностью.

DECIMAL(7,4) должно быть достаточно для ваших нужд.

3 голосов
/ 02 мая 2018

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

   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 голосов
/ 11 марта 2017

Не хранить значения с плавающей запятой. Хотя вы можете предположить, что они точны, это не так. Они приблизительные. И оказывается, что разные языки имеют разные методы «разбора» информации с плавающей запятой. И разные базы данных имеют разные методы реализации приближений значений.

Вместо этого используйте Geohash . Это видео знакомит с Geohash и визуально объясняет его менее чем за 5 минут. Geohash - это ПОДАВЛЯЮЩИЙСЯ ФИЛЬМ превосходного способа кодирования / декодирования информации о долготе / широте согласованным способом. Никогда не «сериализуя» приближенные значения с плавающей запятой долготы / широты в столбцы базы данных, и вместо этого, используя Geohash, вы получите такую ​​же желаемую согласованность в обоих направлениях, которую вы получите со значениями String. Этот сайт отлично подходит для того, чтобы помочь вам поиграть с геохэшами.

...