在Django中使用哪个模型字段来存储经度和纬度值?

时间:2015-06-08 10:30:30

标签: python django geodjango

我希望使用经度和纬度存储我的用户位置,此时这是来自谷歌地图,但我将使用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 个答案:

答案 0 :(得分:73)

Float通常是近似值,有些简单示例请参阅here。你可以得到非常好的结果,将你的模型修改为像DecimalField(max_digits=9, decimal_places=6)这样的东西,因为小数在坐标中非常重要,但使用6以上基本没有意义。

答案 1 :(得分:14)

使用PointField存储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

答案 2 :(得分:2)

此处建议使用DecimalField(max_digits=9, decimal_places=6)导致尝试从Google Maps中保存位置时出现错误。

如果我们假设最常见的用例是从Maps API检索点位置,并在右键单击并选择“这里是什么?”时从Google Maps检索一个典型的URL。产生类似的东西:

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)