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