Какое поле модели использовать в 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)