Django + SpatiaLite + srid + дистанционные запросы

Я пытаюсь сделать простое приложение 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 ответ

Я думаю, что одна проблема в вашем 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()

Таким образом, эта модель ассоциируется с менеджером моделей геоджанго. Также не требуется импортировать поля моделей из разных источников.

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

Другие вопросы по тегам