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


104

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

Какой тип данных использовать при хранении данных о широте и долготе в базах данных 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. xxx.xx = 0,6 мили
  7. и т.д?

7
Точность координат зависит от ГДЕ эти координаты, потому что поверхность планеты не является идеальной сферой, и расстояние от полюсов также является ГЛАВНЫМ фактором. Тем не менее, 3 десятичных знака в среднем составляют около 120 метров / 400 футов. 4 десятичных знака будут 12 метров / 40 футов и т. Д.
Marc B

1
См. Этот вопрос на GIS stackexchange: gis.stackexchange.com/questions/8650/…
Flimm

Ответы:


193

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

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
Если они находятся на экваторе, означает ли это, что это наихудшие ошибки?
Liath

6
Собственно, экватор - лучший случай. Один градус широты и один градус долготы равны по величине на экваторе (69 миль), но один градус долготы уменьшается до нуля по мере приближения к любому из полюсов. Вот очень хорошее объяснение: nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloud Что могло бы сделать эти худшие ошибки. Или, чтобы быть педантичным, это наихудшие ошибки при использовании широты и долготы на уровне моря. На высоте 6378 м погрешность увеличивается на 0,1%.
Scott B

@codingoutload: этой ссылки, по-видимому, больше нет :(
Том Стэмбо

1
@Tom Stambaugh: Для этого есть web.archive.org: web.archive.org/web/20070810120810/http://nationalatlas.gov/…
Stefan Steiger

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). Наша цель - убедиться, что дб не является ограничивающим фактором точности пространственных вычислений.
Tom Stambaugh

Выход за пределы 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#presentation_choices


3

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

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


FLOATи DOUBLE, в этом контексте , не страдает от некоторых из описанных вами проблем.
Рик Джеймс

@RickJames Вы недостаточно указали «этот контекст». Если вы имеете в виду, строго в хранении значения в двух столбцах БД, то возможно. Однако заданные значения не просто находятся в неиспользуемых столбцах БД, это неявное предположение, что будут (близкие) запросы, написанные против этих значений. И если придерживаться этого довольно прагматичного предположения, значит, все проблемы, связанные с его ненадежным приближением, остаются в силе.
chaotic3quilibrium 02

1
Если одно FLOATзначение и «следующее» значение настолько близки друг к другу по значению, что вы не можете отличить один город (или транспортное средство, или человека, или блоху) от другого, тогда ошибки округления и представления не имеют значения. Между тем почти всегда глупо сравнивать два FLOATs( DOUBLEsили приблизительно DECIMALs) со знаком «=».
Рик Джеймс

Вы, кажется, упускаете суть. Любая попытка запроса будет неявно использовать equals, если не явно. И это предполагает, что вы не проходите через другие уровни и языки со значениями, строго оставаясь внутри SQL Server. Вот официальный ответ Microsoft на это для SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
chaotic3quilibrium

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

2

Если вы щелкнете по местоположению на Google Maps, вы получите широту и долготу с 7 знаками после запятой.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.