在Django中使用哪个Model Field来存储经度和纬度值?

j9per5c4  于 2023-04-07  发布在  Go
关注(0)|答案(3)|浏览(168)

我想存储我的用户位置使用经度和纬度,目前这来自谷歌Map,但我将使用GeoDango和一些点来计算点之间的距离也。
然而,我的第一个困惑是我应该使用Django中的哪个字段来存储经度和纬度值?我得到的信息是冲突的。
官方文档使用FloatFieldhttps://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)

那么我应该用什么呢?

dba5bblo

dba5bblo1#

浮点数通常是一种近似值,这里有一些简单的例子。你可以把你的模型修改成DecimalField(max_digits=9, decimal_places=6)这样的值,因为小数在坐标系中非常重要,但是使用6以上的值基本上是没有意义的。

ekqde3dh

ekqde3dh2#

使用PointField存储纬度

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

qyzbxkaa

qyzbxkaa3#

这里使用DecimalField(max_digits=9, decimal_places=6)的建议导致我在试图从谷歌Map保存位置时出错。
如果我们假设最常见的用例是从Maps API中检索点位置,并且当右键单击并选择“What's Here?”时,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位,这就是为什么接受的答案不起作用。因为没有理由验证“尽可能短”,而且db存储很便宜,所以我使用:

max_digits=22,
    decimal_places=16)

相关问题