Django postgresql postgis неверный пространственный поиск

#django #postgresql #django-models #postgis

#джанго #postgresql #django-модели #postgis

Вопрос:

У меня есть следующая модель:

 class Item(Model):
    lat_lng = PointField(geography=True, null=True)

Item.objects.create(lat_lng=Point(-95.864468, 36.075450))
bbox1 = (-168.3984375, 25.16517336866393, -52.03125, 75.32002523220804)
bbox2 = (-145.1953125, 25.16517336866393, -52.03125, 63.07486569058663)
 

bbox1 содержит bbox2 , но Item.objects.filter(lat_lng__coveredby=Polygon.from_bbox(bbox1)) не возвращает элемент, в то время Item.objects.filter(lat_lng__coveredby=Polygon.from_bbox(bbox2)) как возвращает его.

Я что-то упускаю из виду?

Обновить:

Если я удаляю geographic=True , то все работает. Что означает этот флаг?

Ответ №1:

При использовании geography вместо прямых линий используются дуги большого круга. Это остается верным для линий, соединяющих углы ограничивающей рамки.

Предположение, что box1 содержит box2, неверно. Они могут пересекаться, но одно не полностью содержится в другом.

Поле 1 шире поля 2, поэтому его южная граница, представленная в виде дуги большого круга, будет проходить севернее границы поля 2, и поэтому точка расположена к югу от поля 1, но внутри поля 2.

Комментарии:

1. итак, мне нужно использовать geography=False для проверки расстояния и coveredby?

2. не обязательно… это решение за вами и зависит от ваших данных и целей. Вы просто должны знать о дугах большого круга и прямых линиях, оба имеют свое применение. Вы можете использовать Google geometry vs geography для получения дополнительной информации

3. если у a есть boundingbox и точка широты-долготы, как мне проверить, находится ли точка внутри круга?

4. docs.djangoproject.com/en/3.1/ref/contrib/gis

5. Я видел документы, но соответствующего примера нет.