Неверно отфильтровано поле набора запросов PointField для элементов в пределах определенного диапазона расстояний. - PullRequest
0 голосов
/ 02 октября 2018

Я хотел бы отфильтровать набор запросов для элементов в определенном диапазоне.Вот так выглядит моя модель

class modelEmployee(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    location = models.PointField(srid=4326,max_length=40, blank=True,null=True) 
    objects = GeoManager()

Теперь я запускаю команду фильтра.Чтобы вернуть предметы в пределах определенного диапазона 90 миль.

qset = modelEmployee.objects.filter(location__distance_lte=(someLocation, D(mi=90)))

В результате возвращается элемент, расстояние которого на самом деле составляет 223,732 миль, который он не должен возвращать.

Это местоположения двух элементов

location A - lat: 47.628641 and long: -117.402997

location B - lat: 47.618337 and long: -122.205341

Расстояние ч / б на самом деле составляет 223,732 миль.Я должен фильтровать это неправильно.Любые предложения о том, где я могу пойти не так?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Из документов Django distance_lte - для моделей возврата, в которых расстояние до геометрического поля из геометрии поиска больше или равно заданному значению расстояния.

qset =modelEmployee.objects.filter (location__distance_lte = (someLocation, D (m = 90)))

, вы можете использовать dwithin для запроса.

qset = modelEmployee.objects.filter (poly__dwithin = (geom, D (m = 5))) *

0 голосов
/ 12 октября 2018

Вы можете попробовать этот реф ( gis / db-api ), я надеюсь, что он будет работать, как вы хотите.

Пример:

from django.contrib.gis.db import models
class SouthTexasCity(models.Model):
    name = models.CharField(max_length=30)
    # A projected coordinate system (only valid for South Texas!)
    # is used, units are in meters.
    point = models.PointField(srid=32140)

Затем расстояниезапросы могут быть выполнены следующим образом:

from django.contrib.gis.geos import GEOSGeometry
from django.contrib.gis.measure import D # ``D`` is a shortcut for ``Distance``
from geoapp.models import SouthTexasCity
# Distances will be calculated from this point, which does not have to be projected.
pnt = GEOSGeometry('POINT(-96.876369 29.905320)', srid=4326)
# If numeric parameter, units of field (meters in this case) are assumed.
qs = SouthTexasCity.objects.filter(point__distance_lte=(pnt, 7000))
# Find all Cities within 7 km, > 20 miles away, and > 100 chains away (an obscure unit)
qs = SouthTexasCity.objects.filter(point__distance_lte=(pnt, D(km=7)))
qs = SouthTexasCity.objects.filter(point__distance_gte=(pnt, D(mi=20)))
qs = SouthTexasCity.objects.filter(point__distance_gte=(pnt, D(chain=100)))
0 голосов
/ 05 октября 2018

Из документов Геопространственный запрос Вы должны использовать dwithin

Ваш пример должен использовать это так:

qset = modelEmployee.objects.filter(location__dwithin=(someLocation, D(mi=90)))

...