Django + SpatiaLite + srid +距离查询

时间:2015-02-03 08:05:56

标签: python django geodjango spatialite srid

我正在尝试使用简单的geodjango应用程序,其中包含商店列表,当您在其中放置地址时,它会将最近的商店返回到您的位置。

我正在学习使用PostgreSQL和Postgis的教程,但是我想使用SQLite和SpatiaLite(我想稍后在另一个使用SQLite的应用程序中使用它,所以我不知道我是否赢了#t搞砸了,如果我试着将它改成PostgreSQL。我通常不会使用Python,也不能使用SQLite,也不能使用PostgreSQL)

当我尝试查询并计算距离时,我遇到了问题。

在我的 models.py 中我有:

from django.contrib.gis.db import models as gis_models
from django.contrib.gis import geos
from django.db import models

class Shop(models.Model):
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    location = gis_models.PointField(u"longitude/latitude", geography=True, blank=True, null=True)
    gis = gis_models.GeoManager()
    objects = models.Manager()

views.py 中我有功能:

def get_shops(longitude, latitude):
    current_point = geos.fromstr("POINT(%s %s)" % (longitude, latitude))
    distance_from_point = {'km': 10}
    shops = models.Shop.gis.filter(location__distance_lte=(current_point, measure.D(**distance_from_point)))
    shops = shops.distance(current_point).order_by('distance')
    return shops.distance(current_point)

我收到错误:

  

SQLite不支持大地坐标系上的线性距离计算。

我读过SRID,我想我应该改变我的模型。但我不知道如何写下来。并且我有可能在尝试获取排序数据方面存在问题。

1 个答案:

答案 0 :(得分:0)

我认为你的models.py中存在一个问题 您的模型管理器仍然是默认的模型管理器。 你的模型看起来应该是这样的。

from django.contrib.gis.db import models
from django.contrib.gis import geos


class Shop(models.Model):
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    location = models.PointField(u"longitude/latitude", geography=True, blank=True, null=True)
    objects = models.GeoManager()

所以这个模型与geodjango模型管理器相关联。它也不需要从不同的源导入modelfields。

如果你将srid设置为4326(WGS84),你可以摆脱另一个问题SQLite does not support linear distance calculations on geodetic coordinate systems。您可以找到更多信息here。 或者您基于三角测量实现自己的距离计算。 请查看this以获得进一步的解释。