Джанго модель собственности гео расстояние - PullRequest
2 голосов
/ 06 декабря 2009

Я пытаюсь реализовать поиск близости, основываясь на широте и долготе, используя Django и Postgresql. Вот абстрактная версия модели, которую я имею.

class Item(models.Model):
"""docstring for Item"""
uuid = UUIDField(primary_key=True, auto=True)
name = models.CharField(_("name"), max_length=200)
address = models.CharField(_('street address'), max_length=255, blank=True, null=True)
location = models.CharField(_('location'), max_length=40, blank=True, null=True)

@property
def geo_distance(self, location=None):
    if location is not None:
        cursor = connection.cursor()
        cursor.execute("SELECT geo_distance(CAST('%s')) AS POINT, CAST('%s') AS POINT)" % 
            self.location, location)
        return round(float(cursor.fetchone() * 1.621371192237), 2)

Я хочу иметь возможность сделать что-то подобное в views.py:

items = Item.objects.filter(name__istartwith="Anything")
results = []
for item in items:
    results.append({
        'name': item.name, 
        'distance': item.geo_distance("(11.23123, -12.123213)")
    })

Я понимаю, что это не лучший подход. Любые предложения приветствуются.

Ответы [ 2 ]

2 голосов
/ 06 декабря 2009

Если вы ищете по широте и долготе, я бы порекомендовал вам GeoDjango . Для расчета расстояния между двумя точками или окружающей областью от точки X вы можете использовать формула Хаверсайна . Лучше написать расчет расстояния, используя процедуру . Насколько мне известно, django не поддерживает создание процедур, я сделал несколько тестов с точки зрения вычисления расстояния, я обнаружил, что процедуры быстрее, чем вычисления на конце django. Удачи.

1 голос
/ 06 декабря 2009

Ну, твой код не ужасен. Я полагаю, что вы обеспокоены производительностью из-за выполнения item.geo_distance () внутри для итерации? Неважно, это нужно будет рассчитать в какое-то время. Ваше решение в порядке, но вот несколько других указателей:

  • Использовать geopy (или геоджанго)
  • Обязательно отфильтруйте ваши данные в источнике (базе данных).

Что касается второго пункта, фильтрация ваших данных. Я вижу, что вы фильтруете по имени, что означает, что вы не используете расстояние для фильтрации. Если вы хотите использовать расстояние от точки в качестве фильтра (например, не более 40 миль), то вы столкнетесь с некоторыми новыми проблемами, с которыми могут помочь геопия и геоджанго. Общее решение здесь состоит в том, чтобы приблизить расстояние (в квадрате), отфильтровать данные на основе этого приближения, а затем вычислить точное расстояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...