【问题标题】:Django + SpatiaLite + srid + distance queriesDjango + SpatiaLite + srid + 距离查询
【发布时间】:2015-02-03 08:05:55
【问题描述】:

我正在尝试做一个简单的 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,我想我应该改变我的模型。但我不知道如何写下来。并且有可能是我尝试获取排序数据的方式存在问题。

【问题讨论】:

    标签: python django geodjango spatialite srid


    【解决方案1】:

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

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

    【讨论】:

    • 我有两个经理,他们工作。我已将:PointField(u"longitude/latitude", geography=True, blank=True, null=True) 改成:PointField(srid=4326, blank=True, null=True),我可以添加店铺,但是它仍然不支持线性距离计算。当我将 SRID 更改为 3857 时,按距离排序有效,但添加无效。
    • 当然,我的错误。我监督了这条线models.Shop.gis.filter(location__distance_lte=(current_point, measure.D(**distance_from_point))),您可以在其中查询正确的过滤器。所以问题不在于模型。我更新我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2011-09-28
    • 1970-01-01
    • 2015-09-18
    • 2017-04-08
    相关资源
    最近更新 更多