Как точно я должен хранить широту и долготу?


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

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

и, похоже, общий консенсус заключается в том, что использование Decimal(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. ХХХ.ХХ = .6 миль
  7. etc?
6 81

6 ответов:

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

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

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

Если вы хотите точность 50ft (15m), то пойдите для 4 чисел. Так что decimal(9,6)

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

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

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

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

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

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

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

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

  • 0.01524 / 110.574 = 1/7255 градуса широты
  • 0.01524 / 111.320 = 1/7304 а градус долготы

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

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

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

используйте Geohash. Это видео вводит и визуально объясняет Geohash менее чем за 5 минут. в географической сетки-это однозначно превосходный способ кодирования/декодирования информации о долготе / широте согласованным образом. Никогда не "сериализуя" приближенные значения с плавающей запятой долготы/широты в столбцы базы данных, а вместо этого, используя Geohash, вы получите те же желательные гарантии согласованности туда и обратно, которые вы получаете со строковыми значениями. этот сайт отлично подходит для того, чтобы помочь вам играть с Geohash.

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

   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