2015-02-03 2 views
1

Я пытаюсь сделать простое приложение geodjango, которое содержит список магазинов, и когда вы помещаете в него адрес, он возвращает ближайшие магазины в ваше местоположение.Django + SpatiaLite + srid + задание расстояния

Я следую руководству, использующему 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 does not support linear distance calculations on geodetic coordinate systems.

Я читал о SRID, я думаю, что я должен измените мою модель. Но я понятия не имею, как записать это. И есть вероятность, что есть проблема с тем, как я пытаюсь получить отсортированные данные.

ответ

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 модели-менеджера. Также не требуется импортировать modelfield из разных источников.

Другая проблема SQLite does not support linear distance calculations on geodetic coordinate systems вы можете избавиться, если вы установите свой srid на что-то вроде 4326 (WGS84). Более подробную информацию вы найдете here. Или вы выполняете собственный расчет расстояний на основе триангуляции. Посмотрите на this для получения более подробного объяснения.

+0

У меня есть два менеджера, и они работают. Я изменил: PointField (u "longitude/latitude", geography = True, blank = True, null = True) в: PointField (srid = 4326, blank = True, null = True), и я могу добавлять магазины, но это все еще не поддерживает линейные расчеты расстояния. Когда я изменяю SRID на 3857, тогда сортировка по расстоянию работает, но добавление - нет. – ajgoralczyk

+0

уверен, мой ошибка. Я наблюдал за этой строкой 'models.Shop.gis.filter (location__distance_lte = (current_point, measure.D (** distance_from_point)))' где вы запрашиваете правильный фильтр. Таким образом, проблема не в модели. Я обновляю свой ответ –

Смежные вопросы