首页 文章

Django SpatiaLite srid距离查询

提问于
浏览
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,我想我应该改变我的模型 . 但我不知道如何写下来 . 并且有可能我如何尝试获取排序数据存在问题 .

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模型管理器相关联 . 它也不需要从不同的源导入modelfields .

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

相关问题