1

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

我正在关注使用 PostgreSQL 和 Postgis 的教程,但我想使用 SQLite 和 SpatiaLite(我想稍后在另一个使用 SQLite 的应用程序中使用它,所以我不知道我是否会搞砸,如果我尝试将其更改为 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,我想我应该改变我的模型。但我不知道如何写下来。并且有可能我尝试获取排序数据的方式存在问题。

4

1 回答 1

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 模型管理器相关联。也不需要从不同来源导入模型字段。

SQLite does not support linear distance calculations on geodetic coordinate systems如果您将 srid 设置为 4326 (WGS84) 之类的东西,您可以摆脱的另一个问题。您可以在此处找到更多信息。或者您根据三角测量实现自己的距离计算。看看这个以获得进一步的解释。

于 2015-02-03T09:50:06.120 回答