在 Django 中使用哪个模型字段来存储经度和纬度值?
Which Model Field to use in Django to store longitude and latitude values?
我想使用经度和纬度来存储我的用户位置,目前这来自 Google 地图,但我将使用 GeoDango 和一些点来计算点与点之间的距离。
但是,我的第一个困惑是我应该使用 Django 中的哪个字段来存储经度和纬度值?我得到的信息是相互矛盾的。
官方文档使用了FloatField
https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models
lon = models.FloatField()
lat = models.FloatField()
Whosebug 上的几乎每个答案都显示 DecimalField
long = models.DecimalField(max_digits=8, decimal_places=3)
lat = models.DecimalField(max_digits=8, decimal_places=3)
那么我应该使用什么?
Float 通常是一个近似值,请参阅 here 了解一些简单示例。将模型修改为 DecimalField(max_digits=9, decimal_places=6)
之类的东西可以获得非常好的结果,因为小数在坐标中非常重要,但使用超过 6 基本上没有意义。
使用 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
此处使用 DecimalField(max_digits=9, decimal_places=6)
的建议导致我在尝试从 Google 地图保存位置时出错。
如果我们假设最常见的用例是从地图 API 中检索点位置,而典型的 URL 从 Google 地图中右键单击并选择 "What's Here?" 产生类似于:
https://www.google.com/maps/place/37°48'52.3"N+122°17'09.1"W/@37.814532,-122.2880467,17z
(随机位置)
所以经度在小数点前后有15位,这就是接受的答案不起作用的原因。由于没有理由验证 "as short as possible" 并且数据库存储很便宜,我使用的是:
max_digits=22,
decimal_places=16)
我想使用经度和纬度来存储我的用户位置,目前这来自 Google 地图,但我将使用 GeoDango 和一些点来计算点与点之间的距离。
但是,我的第一个困惑是我应该使用 Django 中的哪个字段来存储经度和纬度值?我得到的信息是相互矛盾的。
官方文档使用了FloatField
https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models
lon = models.FloatField()
lat = models.FloatField()
Whosebug 上的几乎每个答案都显示 DecimalField
long = models.DecimalField(max_digits=8, decimal_places=3)
lat = models.DecimalField(max_digits=8, decimal_places=3)
那么我应该使用什么?
Float 通常是一个近似值,请参阅 here 了解一些简单示例。将模型修改为 DecimalField(max_digits=9, decimal_places=6)
之类的东西可以获得非常好的结果,因为小数在坐标中非常重要,但使用超过 6 基本上没有意义。
使用 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
此处使用 DecimalField(max_digits=9, decimal_places=6)
的建议导致我在尝试从 Google 地图保存位置时出错。
如果我们假设最常见的用例是从地图 API 中检索点位置,而典型的 URL 从 Google 地图中右键单击并选择 "What's Here?" 产生类似于:
https://www.google.com/maps/place/37°48'52.3"N+122°17'09.1"W/@37.814532,-122.2880467,17z
(随机位置)
所以经度在小数点前后有15位,这就是接受的答案不起作用的原因。由于没有理由验证 "as short as possible" 并且数据库存储很便宜,我使用的是:
max_digits=22,
decimal_places=16)