Which Model Field to use in Django to store longitude and latitude values?

扶醉桌前 提交于 2020-07-31 09:40:12

问题


I want to store my users location using longitude and latitude, at the moment this comes from Google Maps, but I will be using GeoDango and some point to work out distances between to points also.

However, my first confusion is which field in Django I should be using to store the longitude and latitude values? The information I'm getting is conflicting.

The official documentation uses a FloatField https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models

lon = models.FloatField()
lat = models.FloatField()

Where almost every answer on stackoverflow shows a DecimalField

long = models.DecimalField(max_digits=8, decimal_places=3)
lat = models.DecimalField(max_digits=8, decimal_places=3)

So what should I be using?


回答1:


Float is generally an approximation, see here for some simple examples. You could get very nice results modifying your model to something like DecimalField(max_digits=9, decimal_places=6), since decimals are very important in coordinates but using more than 6 is basically meaningless.




回答2:


Use PointField to store lat long

p = Point(85.3240, 27.7172,srid=4326)

Django: 1.X:

https://docs.djangoproject.com/en/1.11/ref/contrib/gis/model-api/#pointfield

Django: 2.X:

https://docs.djangoproject.com/en/2.2/ref/contrib/gis/model-api/#pointfield

Django: 3.X: https://docs.djangoproject.com/en/3.0/ref/contrib/gis/model-api/#pointfield




回答3:


The suggestion here to use DecimalField(max_digits=9, decimal_places=6) resulted in errors for me when trying to save locations from Google Maps.

If we assume that the most common use case is retrieving point locations from the Maps API, and a typical URL from Google Maps when right-clicking and selecting "What's Here?" yields something like:

https://www.google.com/maps/place/37°48'52.3"N+122°17'09.1"W/@37.814532,-122.2880467,17z

(random place)

So the longitude has 15 places before and after the decimal, which is why the accepted answer doesn't work. Since there's no reason to validate for "as short as possible" and db storage is cheap, I'm using:

    max_digits=22,
    decimal_places=16)


来源:https://stackoverflow.com/questions/30706799/which-model-field-to-use-in-django-to-store-longitude-and-latitude-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!