Я читал этот вопрос здесь:
Какой тип данных использовать при хранении данных о широте и долготе в базах данных SQL?
И, похоже, общее мнение заключается в том, что использование Decimal (9,6) - это лучший способ. Для меня вопрос, насколько точно мне это нужно?
Например, API Google возвращает такой результат:
"lat": 37.4219720,
"lng": -122.0841430
Сколько цифр мне нужно из -122.0841430? Я прочитал несколько руководств, но не могу понять их смысла, чтобы понять это.
Чтобы быть более точным в моем вопросе: если я хочу быть точным в пределах 50 футов от точного местоположения, сколько десятичных знаков мне нужно сохранить?
Возможно, лучшим вопросом был бы вопрос, не связанный с программированием, но он был бы таков: насколько точнее каждая десятичная точка дает вам?
Это просто?
- Элемент списка
- x00 = 6000 миль
- xx0 = 600 миль
- xxx = 60 миль
- xxx.x = 6 миль
- xxx.xx = 0,6 мили
- и т.д?
mysql
geolocation
Гражданин
источник
источник
Ответы:
Точность по сравнению с десятичными знаками на экваторе
ссылка: https://en.wikipedia.org/wiki/Decimal_degrees#Precision
источник
Если вам нужна точность 50 футов (15 м), используйте 4 цифры. Так
decimal(9,6)
источник
(8,6)
(или,(6,4)
чтобы сохранить байт (в MySQL).Я разрабатываю базы данных и некоторое время изучаю этот вопрос. Мы используем готовое приложение с серверной частью Oracle, где поля данных были определены так, чтобы допускать 17 знаков после запятой. Смешной! Это в тысячных долях дюйма. Ни один прибор GPS в мире не обладает такой точностью. Так что давайте отложим 17 десятичных знаков и займемся практикой. Правительство гарантирует, что их система хороша для «наихудшего случая» точности псевдодальности 7,8 метра при уровне достоверности 95% », но затем заявляет, что фактическое FAA (с использованием своих высококачественных инструментов) показало, что показания GPS обычно хороши для в пределах метра.
Итак, вы должны задать себе два вопроса: 1) Каков источник ваших ценностей? 2) Для чего будут использоваться данные?
Сотовые телефоны не очень точны, и показания Google / MapQuest, вероятно, верны только с точностью до 4 или 5 знаков после запятой. Высококачественный прибор GPS может дать вам 6 баллов (в пределах Соединенных Штатов). Но захват большего - пустая трата времени для набора текста и хранения. Кроме того, если по значениям выполняется какой-либо поиск, пользователю приятно знать, что 6 - это максимум, который он / она должен искать (очевидно, любое введенное значение поиска должно быть сначала округлено с той же точностью, что и искомое значение данных. ).
Кроме того, если все, что вам нужно сделать, это просмотреть местоположение в Картах Google или ввести его в GPS, чтобы добраться туда, четырех или пяти будет достаточно.
Я должен смеяться над людьми, которые вводят все эти цифры. И где именно они снимают это измерение? Ручка передней двери? Почтовый ящик снаружи? Центр строительства? Вершина вышки сотовой связи? И ... все ли постоянно принимают его в одном и том же месте?
В качестве хорошего дизайна базы данных я бы принял значения от пользователя, возможно, несколько больше, чем пять десятичных цифр, а затем округлил и зафиксировал только пять для согласованности [может быть, шесть, если ваши инструменты хороши и ваше конечное использование того требует].
источник
DECIMAL(18,15)
занимает 9 байт.Расстояние между каждым градусом широты меняется из-за формы Земли, и расстояние между каждым градусом долготы становится меньше по мере приближения к полюсам. Итак, давайте поговорим об экваторе, где расстояние между каждым градусом составляет 110,574 км по широте и 111,320 км по долготе.
50 футов составляет 0,01524 км, поэтому:
Вам нужно четыре цифры шкалы, достаточные для уменьшения до десятитысячных градуса, с точностью до семи цифр.
DECIMAL(7,4)
должно быть достаточно для ваших нужд.источник
Принимая во внимание различные части сферы и расстояние по диагонали, вот таблица доступных значений точности:
- http://mysql.rjweb.org/doc.php/latlng#presentation_choices
источник
Не храните значения с плавающей запятой. Вы можете предположить, что они точны, но это не так. Они приблизительные. И оказывается, что разные языки имеют разные методы «синтаксического анализа» информации с плавающей запятой. И разные базы данных имеют разные методы реализации приближений значений.
Вместо этого используйте Geohash . Это видео знакомит с Geohash и наглядно объясняет его менее чем за 5 минут. Geohash - НАИБОЛЬШИЙ лучший способ последовательного кодирования / декодирования информации о долготе / широте. Никогда не «сериализуя» приближенные значения долготы / широты с плавающей запятой в столбцы базы данных и вместо этого используя Geohash, вы получите те же желаемые гарантии согласованности в оба конца, которые вы получаете со значениями String. Этот сайт отлично подходит для того, чтобы помочь вам поиграть с Geohash.
источник
FLOAT
иDOUBLE
, в этом контексте , не страдает от некоторых из описанных вами проблем.FLOAT
значение и «следующее» значение настолько близки друг к другу по значению, что вы не можете отличить один город (или транспортное средство, или человека, или блоху) от другого, тогда ошибки округления и представления не имеют значения. Между тем почти всегда глупо сравнивать дваFLOATs
(DOUBLEs
или приблизительноDECIMALs
) со знаком «=».[mysql]
, а не SQL Server.Если вы щелкнете по местоположению на Google Maps, вы получите широту и долготу с 7 знаками после запятой.
источник