关于python:使用srid 4326的GeoDjango距离查询返回’SpatiaLite不支持使用大地坐标系的几何场上的距离查询。’

GeoDjango distance query with srid 4326 returns 'SpatiaLite does not support distance queries on geometry fields with a geodetic coordinate system.'

我正试图去附近的厨房,距离给定的纬度/长度在4公里范围内。
我的空间后端是空间和设置,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django.contrib.gis',
        'rest_framework',
        'oauth2_provider',
        'kitchen',
    )

    DATABASES = {
        'default': {
            'ENGINE': 'django.contrib.gis.db.backends.spatialite',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

这是我的模特

1
2
3
4
5
6
7
8
9
10
11
    from django.contrib.gis.db import models
    from django.contrib.gis.geos import Point

    class Kitchen(models.Model):
        id = models.CharField(max_length=100,primary_key=True)
        #id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=100,blank=False)
        address = models.CharField(max_length=1000, blank=True, default='')
        contact_no = models.CharField(max_length=100,blank=True, default='')
        location = models.PointField(srid=4326, geography=True, blank=True, null=True)
        objects = models.GeoManager()

我从Django shell的查询是,

1
2
3
4
5
6
7
8
    from kitchen.models import Kitchen
    from django.contrib.gis import measure
    from django.contrib.gis import geos

    current_point = geos.fromstr('POINT(%s %s)' % (76.7698996, 17.338993), srid=4326)
    Kitchen.objects.filter(location__distanc

e_lte=(current_point, measure.D(km=4)))

返回以下值错误,

1
    SpatiaLite does not support distance queries on geometry fields with a geodetic coordinate system. Distance objects; use a numeric value of your distance in degrees instead.

在模型中设置不同的投影srid(例如3857,24381等)会返回不正确的结果。
这里的一些帮助将不胜感激。


很可能你的问题是SRID。 看起来,在没有投影坐标系的字段上,spatialite不支持这种类型的距离查询。

因此,您处于正确的轨道上,但只要在模型定义中启用geography=True,将srid设置为不同的值就不起作用。 地理类型强制srid为4326,如django地理文档中所述。

因此,尝试将geography=False和srid设置为您尝试的其中一个投影坐标系。