Nano Hash - криптовалюты, майнинг, программирование

Запрос расстояния для произвольных точек с GeoDjango не работает должным образом - расчет расстояния кажется отключенным

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

Расстояния значительно различаются до такой степени, что если результаты отсортированы по значениям расстояний БД в километрах и geopy значениям в км, они не будут в том же порядке.

Я предполагаю, что значения geopy верны, поэтому мне интересно, что-то не так с тем, как я реализовал GeoDjango?

Работает как надо?
Это как-то связано с попыткой рассчитать расстояние для всего мира, а не только для конкретной области, которая может иметь srid?

views.py

pnt = GEOSGeometry('POINT({} {})'.format(latitude, longitude), srid=4326)
qs = Place.filter(point__distance_lte=(pnt, D(km=radius*2))).annotate(distance=Distance('point', pnt)).order_by('distance')

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'USER': '',
        'NAME': 'places',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

models.py:

from django.contrib.gis.db import models
from geopy.distance import vincenty

class Place(models.Model):
        latitude = models.DecimalField(max_digits=10, decimal_places=6, null=True, blank=True)
        longitude = models.DecimalField(max_digits=10, decimal_places=6, null=True, blank=True)
        point = models.PointField(null=True, geography=True)

    def distance_from_target(self, target_lat, target_lon):
        if not target_lat or not target_lon:
            return None
        instance_point = (self.latitude, self.longitude)
        target_point = (target_lat, target_lon)
        return vincenty(instance_point, target_point).kilometers

Ответы:


1

Вам не нужно умножать радиус * 2!

Я также столкнулся с разницей между вычисленным расстоянием postgres/postgis и расстоянием от geopy.distance.vincenty, но очень маленькой (на уровне метров, а не километров)

Я делаю запрос так

from django.contrib.gis.measure import Distance
from django.contrib.gis.db.models.functions import Distance as DistanceFun
from django.contrib.gis.geos import fromstr

user_location = fromstr(
    "POINT({value_lon} {value_lat})".format(value_lon=value_lon, value_lat=value_lat)
)
qs.filter(
    location__distance_lte=(user_location, Distance(m=value_radius_in_meters))
).annotate(
    distance=DistanceFun('location', user_location)
).order_by('distance')
12.03.2018
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..