1

I'm trying to fetch nearby kitchens, within 4 km radius from a given lat/long. My spatial backend is spatialite and settings are,

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'),
    }
}

Here is my model

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()

My query from Django shell is,

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__distance_lte=(current_point, measure.D(km=4)))

which return the below Value Error,

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.

Setting a different projected srid in the model(ex. 3857, 24381 etc) returns incorrect results. Some help here would be greatly appreciated.

Slam
  • 8,112
  • 1
  • 36
  • 44
Dev
  • 33
  • 1
  • 6

1 Answers1

1

Most likely your problem is the SRID. It seems like spatialite does not support this type of distance query on fields with unprojected coordinate systems.

So you are on the right track, but setting the srid to a different value will have no effect as long as you have geography=True enabled in your model definition. The geography type forces the srid to be 4326, as described in the django geography docs.

So try setting geography=False and the srid to one of the projected coordinate systems that you were trying out.

yellowcap
  • 3,985
  • 38
  • 51
  • With `srid=3857, geography=False`, it is returning incorrect results(all kitchens). – Dev Sep 07 '16 at 07:44