【问题标题】:Which Model Field to use in Django to store longitude and latitude values?在 Django 中使用哪个模型字段来存储经度和纬度值?
【发布时间】:2015-08-22 18:44:43
【问题描述】:

我想使用经度和纬度存储我的用户位置,目前这来自谷歌地图,但我将使用 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)

那么我应该使用什么?

【问题讨论】:

标签: python django geodjango


【解决方案1】:

浮点数通常是一个近似值,有关一些简单示例,请参阅here。将模型修改为DecimalField(max_digits=9, decimal_places=6) 之类的内容可以获得非常好的结果,因为小数在坐标中非常重要,但使用超过 6 基本上没有意义。

【讨论】:

  • 这个。只需使用足够的小数位即可获得所需的任何精度。当您需要支持大范围的数量级时,浮点数很好。将多个值组合在一起时,有时会出现令人惊讶的舍入等行为,为此您付出了代价。
  • See here for coordinates max length. 我会推荐DecimalField(max_digits=9, decimal_places=6),因为“坐标十进制度数的每个 .000001 差异大约是 10 厘米长。”我怀疑你会使用比这更精确的;)
【解决方案2】:

【讨论】:

  • 在您的 settings.DATABASE 引擎数据库配置中设置 django.contrib.gis.db.backends.mysql
  • 正是我想要的。但是该链接不包含有关如何使用这些字段或其中使用的参数是什么的任何信息!?我是 django 的新手,所以请告诉我在哪里可以找到更多信息
  • 请注意,您必须在系统上安装额外的 GDAL 库,否则您会收到此错误:django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library
  • 如果没有声明与 vanilla django/databases 的兼容性,这个答案是不完整的。
  • PointField 不错,但需要安装 postgis 扩展。如果不处理与 GIS 相关的许多数据,则无需这样做。
【解决方案3】:

此处使用 DecimalField(max_digits=9, decimal_places=6) 的建议导致我在尝试从 Google 地图保存位置时出错。

如果我们假设最常见的用例是从 Maps API 中检索点位置,并在右键单击并选择“这里有什么?”时从 Google 地图中检索典型 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)

【讨论】:

  • 谢谢,但我得到了一个 (-36.82931199999999, 174.71627980000001) 所以我使用DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)
  • 啊!感谢您的报告 - 我会更新答案。
  • 一如既往,xkcd.com/2170 有 XKCD
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多