Как точно я должен хранить широту и долготу?
Я читал этот вопрос здесь:
какой тип данных использовать при хранении данных широты и долготы в базах данных SQL?
и, похоже, общий консенсус заключается в том, что использование Decimal(9,6) - это путь. Вопрос для меня в том, насколько точно мне это действительно нужно?
например, API Google возвращает результат типа:
"lat": 37.4219720,
"lng": -122.0841430
из -122.0841430, сколько цифр мне нужно? Я прочитал несколько руководств, но я не могу иметь достаточно смысла из них, чтобы понять это.
чтобы быть более точным в моем вопросе: если я хочу быть точным в пределах 50 футов от точного местоположения, сколько десятичных знаков мне нужно хранить?
возможно, лучший вопрос на самом деле был бы непрограммным вопросом, но это было бы: насколько точнее каждая десятичная точка дает вам?
это просто?
- элемент списка
- x00 = 6000 миль
- xx0 = 600 Майлз
- xxx = 60 миль
- xxx. x = 6 миль
- ХХХ.ХХ = .6 миль
- etc?
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
+----------------+-------------+ | 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