Django:我如何在数据库中存储地理点

b1_*_*b1_ 7 django geocoding

需要正确的地理点数据类型.

我将获得并使用谷歌地图API显示它,格式如

  • 42.761819,11.104863
  • 41.508577,-101.953125

用例:

  • 用户点击地图
  • django用额外的数据保存这一点
  • 在下次访问django时,在地图上显示此点

因此,点之间没有距离等等.

DB:postgres 8

Django:1.4

Mev*_*abu 7

查看GeoDjango并查看它是否对您有所帮助.如果您的堆栈配置为运行GeoDjango,则可以执行此操作.

你的模型看起来像这样

from django.contrib.gis.db import models
class LocationPoint(models.Model):
    point = models.PointField(srid=4326,dim=3)
    accuracy = models.FloatField(default=0.0)
    objects = models.GeoManager()
Run Code Online (Sandbox Code Playgroud)

要将点保存到数据库,您只需要做的就是

from django.contrib.gis.geos import Point
point = Point(x=12.734534, y=77.2342, z=0, srid=4326)

location = LocationPoint()
location.point = point
location.save()
Run Code Online (Sandbox Code Playgroud)

GeoDjango为您提供了扩展的能力,可以在不久的将来对您进行地理空间查询,例如找到点之间的距离,查找点周围最近的位置等.

这是GeoDjango的链接


and*_*abs 3

来自关于 DecimalField 的 django 文档

DecimalField.max_digits

号码中允许的最大位数。请注意,该数字必须大于或等于decimal_places。

DecimalField.decimal_places

与数字一起存储的小数位数。

这是指Python Decimal

为了对准确的数据类型和精度做出正确的选择,您应该考虑:

  1. 最小可能值是多少(纬度可以从 0(下)到(-)90 度)_ _。
  2. 最大可能值是多少(经度范围从 0(下)到(-)180 度)_ _ _。
  3. 您希望什么是精度(decimal_places)。请注意,它会影响 Google 地图上的缩放级别。

顺便说一下,为了更好地理解,最好知道计算是如何完成的(Python 代码):

def deg_to_dms(deg):
    d = int(deg)
    md = abs(deg - d) * 60
    m = int(md)
    sd = (md - m) * 60
    return [d, m, sd]

def decimal(deg,min,sec): 
    if deg < 0:
       dec= -1.0 * deg + 1.0 * min/60.0 + 1.0 * sec/3600.0
       return -1.0 * dec
    else:
        dec=1.0 * deg + 1.0 * min/60.0 + 1.0 * sec/3600.0;

    return dec
Run Code Online (Sandbox Code Playgroud)