Какое поле модели использовать в Django для хранения значений долготы и широты?
Я хочу сохранить местоположение моих пользователей с использованием долготы и широты, на данный момент это происходит из Карт Google, но я буду использовать GeoDango, а также указать расстояние между точками.
Однако, первая моя путаница - какое поле в Django я должен использовать для хранения значений долготы и широты? Информация, которую я получаю, противоречива.
В официальной документации используется FloatField
https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models
lon = models.FloatField()
lat = models.FloatField()
Где почти каждый ответ на stackoverflow показывает a DecimalField
long = models.DecimalField(max_digits=8, decimal_places=3)
lat = models.DecimalField(max_digits=8, decimal_places=3)
Итак, что я должен использовать?
Ответы
Ответ 1
Поплавок, как правило, приближен, см. здесь для некоторых простых примеров. Вы можете получить очень хорошие результаты, изменив вашу модель на что-то вроде DecimalField(max_digits=9, decimal_places=6)
, так как десятичные знаки очень важны в координатах, но использование более 6 в принципе бессмысленно.
Ответ 2
Используйте PointField для хранения длинных лат
p = Point(85.3240, 27.7172,srid=4326)
Джанго: 1.X:
https://docs.djangoproject.com/en/1.11/ref/contrib/gis/model-api/#pointfield
Джанго: 2.X:
https://docs.djangoproject.com/en/2.2/ref/contrib/gis/model-api/#pointfield
Ответ 3
Предлагаемое здесь использование DecimalField(max_digits=9, decimal_places=6)
привело к ошибкам при попытке сохранить местоположения из Карт Google.
Если предположить, что наиболее распространенный вариант использования - это получение местоположений точек из API Карт и типичный URL-адрес из Карт Google при щелчке правой кнопкой мыши и выборе "Что здесь?" дает что-то вроде:
https://www.google.com/maps/place/37°48'52.3"N+122°17'09.1"W/@37.814532,-122.2880467,17z
(случайное место)
Таким образом, долгота имеет 15 знаков до и после десятичной дроби, поэтому принятый ответ не работает. Поскольку нет причин проверять "как можно короче", а хранилище БД дешево, я использую:
max_digits=22,
decimal_places=16)