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

时间:2012-07-10 20:15:43

标签: django geocoding

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

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

  • 42.761819,11.104863
  • 41.508577,-101.953125

USECASE:

  • 用户点击地图
  • django使用其他数据保存此点
  • 在下次访问django时在地图上显示此点

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

DB:postgres 8

Django:1.4

5 个答案:

答案 0 :(得分:5)

查看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()

要将点保存到数据库,您只需要

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()

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

以下是GeoDjango

的链接

答案 1 :(得分:3)

看起来你将要存储纬度和经度。为此,我会使用DecimalField,并分别存储每个号码。

答案 2 :(得分:2)

来自django documentation about DecimalField

  

DecimalField.max_digits

     

允许的最大位数   数。请注意,此数字必须大于或等于   decimal_places。

     

DecimalField.decimal_places

     

要存储的小数位数   数字。

引用了Python Decimal

要准确选择准确的数据类型和准确性,您应该考虑:

  1. 什么是最小可能值(纬度可以从0(向下)到( - )90度)_ _。
  2. 什么是最大可能值(经度范围从0(向下)到( - )180度)_ _ _。
  3. 你希望什么是准确度(decimal_places)。请注意,它会对Google地图上的缩放级别产生影响。
  4. 顺便说一下,为了更好地理解,最好知道计算是如何完成的(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
    

答案 3 :(得分:1)

我在django设置中使用经度和纬度。

我的模特包括:

long_position   = models.DecimalField (max_digits=8, decimal_places=3)
lat_position   = models.DecimalField (max_digits=8, decimal_places=3)

为了获得更高的精度,您可能希望decimal_places更多。

当您想要在Google Map API方法中显示它时,您将引用您的模型并编写一个python代码输出如下:

output = some_long_position + "," + some_lati_position

答案 4 :(得分:0)

我正在模型中使用它

latitude = models.DecimalField(max_digits=11, decimal_places=7,null=True,blank=True)
longitude = models.DecimalField(max_digits=11, decimal_places=7,null=True,blank=True)