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

Pro*_*eus 56 python django geodjango

我希望使用经度和纬度来存储我的用户位置,目前这是来自谷歌地图,但我将使用GeoDango和一些点来计算点到点之间的距离.

然而,我的第一个困惑是我应该使用Django中的哪个字段来存储经度和纬度值?我得到的信息是冲突的.

官方文档使用FloatField https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#geographic-models

lon = models.FloatField()
lat = models.FloatField()
Run Code Online (Sandbox Code Playgroud)

几乎所有关于stackoverflow的答案都显示了 DecimalField

long = models.DecimalField(max_digits=8, decimal_places=3)
lat = models.DecimalField(max_digits=8, decimal_places=3)
Run Code Online (Sandbox Code Playgroud)

那么我应该使用什么?

mcc*_*ccc 80

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

  • [请参阅此处了解坐标最大长度.](http://stackoverflow.com/questions/15965166/what-is-the-maximum-length-of-latitude-and-longitude)我建议`DecimalField(max_digits = 9, decimal_places = 6)`因为"坐标十进制度的每个.000001差异大约为10厘米." 我怀疑你会使用更精确的;) (13认同)

Amu*_*rya 18

使用PointField存储lat long

p = Point(85.3240, 27.7172,srid=4326)
Run Code Online (Sandbox Code Playgroud)

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

  • 在 settings.DATABASE 引擎数据库配置中设置 django.contrib.gis.db.backends.mysql (2认同)
  • 正是我想要的..然而,该链接不包含任何有关如何使用字段或其中使用的参数的信息!?我是django的新手所以请告诉我在哪里可以找到更多信息 (2认同)
  • 请注意,您必须在系统上安装其他GDAL库,否则将收到此错误:`django.core.exceptions.ImproperlyConfigured:找不到GDAL库。 (2认同)
  • 如果没有声明与普通 django/数据库的兼容性,这个答案是不完整的。 (2认同)
  • PointField 很好,但它需要安装 postgis 扩展。如果不处理大量与 GIS 相关的数据,则无需此操作。 (2认同)

sha*_*ker 5

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

如果我们假设最常见的用例是从 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)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我得到了 (-36.82931199999999, 174.71627980000001) 所以我使用`DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)` (5认同)
  • 一如既往,有 XKCD 来实现此目的 https://xkcd.com/2170/ (3认同)