Spec-Zone.ru › Django 5.1

Справочник API GIS QuerySet

Пространственные запросы

Пространственные запросы в этом разделе доступны для GeometryField и RasterField.

Для ознакомления см. введение в пространственные запросы. Для обзора совместимости запросов с конкретным пространственным бэкендом, обратитесь к таблице совместимости пространственных запросов.

Запросы с растровыми данными

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

Операторы базы данных, используемые запросами, можно разделить на три категории:

  • Прямая поддержка растровых данных N: оператор напрямую принимает растровые данные с обеих сторон запроса, и растровый вход может быть смешан с геометрическими входами.
  • Двусторонняя поддержка растровых данных B: оператор поддерживает растровые данные только в том случае, если с обеих сторон запроса используются растровые входы. Растровые данные автоматически преобразуются в геометрию для смешанных запросов.
  • Поддержка преобразования геометрии C. У запроса нет прямой поддержки растровых данных, все растровые данные автоматически преобразуются в геометрию.

Примеры ниже показывают эквивалентный SQL для запросов в различных типах поддержки растровых данных. Такой же шаблон применим ко всем пространственным запросам.

Случай Запрос Эквивалентный SQL
N, B rast__contains=rst ST_Contains(rast, rst)
N, B rast__1__contains=(rst, 2) ST_Contains(rast, 1, rst, 2)
B, C rast__contains=geom ST_Contains(ST_Polygon(rast), geom)
B, C rast__1__contains=geom ST_Contains(ST_Polygon(rast, 1), geom)
B, C poly__contains=rst ST_Contains(poly, ST_Polygon(rst))
B, C poly__contains=(rst, 1) ST_Contains(poly, ST_Polygon(rst, 1))
C rast__crosses=rst ST_Crosses(ST_Polygon(rast), ST_Polygon(rst))
C rast__1__crosses=(rst, 2) ST_Crosses(ST_Polygon(rast, 1), ST_Polygon(rst, 2))
C rast__crosses=geom ST_Crosses(ST_Polygon(rast), geom)
C poly__crosses=rst ST_Crosses(poly, ST_Polygon(rst))

Пространственные запросы с растровыми данными поддерживаются только для бэкендов PostGIS (обозначаемых как PGRaster в этом разделе).

bbcontains

Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Прямая поддержка)

Проверяет, полностью ли ограничивающая рамка геометрического или растрового поля содержит ограничивающую рамку геометрического объекта запроса.

Пример:

Zipcode.objects.filter(poly__bbcontains=geom)
Бэкенд Эквивалентный SQL
PostGIS poly ~ geom
MariaDB MBRContains(poly, geom)
MySQL MBRContains(poly, geom)
SpatiaLite MbrContains(poly, geom)

bboverlaps

Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Прямая поддержка)

Проверяет, перекрываются ли ограничивающие рамки геометрического поля и геометрического объекта запроса.

Пример:

Zipcode.objects.filter(poly__bboverlaps=geom)
Бэкенд Эквивалентный SQL
PostGIS poly && geom
MariaDB MBROverlaps(poly, geom)
MySQL MBROverlaps(poly, geom)
SpatiaLite MbrOverlaps(poly, geom)

contained

Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Прямая поддержка)

Проверяет, полностью ли ограничивающая рамка геометрического поля содержится в ограничивающей рамке геометрического объекта запроса.

Пример:

Zipcode.objects.filter(poly__contained=geom)
Бэкенд Эквивалентный SQL
PostGIS poly @ geom
MariaDB MBRWithin(poly, geom)
MySQL MBRWithin(poly, geom)
SpatiaLite MbrWithin(poly, geom)

contains

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Двусторонняя поддержка)

Проверяет, содержит ли геометрическое поле пространственно геометрический объект запроса.

Пример:

Zipcode.objects.filter(poly__contains=geom)
Бэкенд Эквивалентный SQL
PostGIS ST_Contains(poly, geom)
Oracle SDO_CONTAINS(poly, geom)
MariaDB ST_Contains(poly, geom)
MySQL ST_Contains(poly, geom)
SpatiaLite Contains(poly, geom)

contains_properly

Доступность: PostGIS, PGRaster (Двусторонняя поддержка)

Возвращает true, если геометрический объект запроса пересекает внутреннюю область геометрического поля, но не границу (или внешнюю область).

Пример:

Zipcode.objects.filter(poly__contains_properly=geom)
Бэкенд Эквивалентный SQL
PostGIS ST_ContainsProperly(poly, geom)

coveredby

Доступность: PostGIS, Oracle, PGRaster (Двусторонняя поддержка), SpatiaLite

Проверяет, что ни одна точка геометрического поля не находится за пределами геометрического объекта запроса. [3]

Пример:

Zipcode.objects.filter(poly__coveredby=geom)
Бэкенд Эквивалентный SQL
PostGIS ST_CoveredBy(poly, geom)
Oracle SDO_COVEREDBY(poly, geom)
SpatiaLite CoveredBy(poly, geom)

covers

Доступность: PostGIS, Oracle, PGRaster (Двусторонняя поддержка), SpatiaLite

Проверяет, что ни одна точка геометрического объекта запроса не находится за пределами геометрического поля. [3]

Пример:

Zipcode.objects.filter(poly__covers=geom)
Бэкенд Эквивалентный SQL
PostGIS ST_Covers(poly, geom)
Oracle SDO_COVERS(poly, geom)
SpatiaLite Covers(poly, geom)

crosses

Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Преобразование)

Проверяет, пересекается ли геометрическое поле пространственно с геометрическим объектом запроса.

Пример:

Zipcode.objects.filter(poly__crosses=geom)
Бэкенд Эквивалентный SQL
PostGIS ST_Crosses(poly, geom)
MariaDB ST_Crosses(poly, geom)
MySQL ST_Crosses(poly, geom)
SpatiaLite Crosses(poly, geom)

disjoint

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Двусторонняя поддержка)

Проверяет, являются ли геометрическое поле и геометрический объект запроса пространственно непересекающимися.

Пример:

Zipcode.objects.filter(poly__disjoint=geom)
Бэкенд Эквивалентный SQL
PostGIS ST_Disjoint(poly, geom)
Oracle SDO_GEOM.RELATE(poly, 'DISJOINT', geom, 0.05)
MariaDB ST_Disjoint(poly, geom)
MySQL ST_Disjoint(poly, geom)
SpatiaLite Disjoint(poly, geom)

equals

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Преобразование)

Проверяет, пространственно ли геометрическое поле равно геометрическому объекту запроса.

Пример:

Zipcode.objects.filter(poly__equals=geom)
Бэкенд Эквивалентный SQL
PostGIS ST_Equals(poly, geom)
Oracle SDO_EQUAL(poly, geom)
MariaDB ST_Equals(poly, geom)
MySQL ST_Equals(poly, geom)
SpatiaLite Equals(poly, geom)

exact, same_as

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Двусторонняя поддержка)

Проверяет, "равно" ли геометрическое поле геометрическому объекту запроса. В Oracle, MySQL и SpatiaLite проверяется пространственное равенство, а в PostGIS проверяется равенство ограничивающих рамок.

Пример:

Zipcode.objects.filter(poly=geom)
Бэкенд Эквивалентный SQL
PostGIS poly ~= geom
Oracle SDO_EQUAL(poly, geom)
MariaDB ST_Equals(poly, geom)
MySQL ST_Equals(poly, geom)
SpatiaLite Equals(poly, geom)

intersects

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Взаимный)

Проверяет, пересекается ли геометрическое поле с геометрией поиска.

Пример:

Zipcode.objects.filter(poly__intersects=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Intersects(poly, geom)
Oracle SDO_OVERLAPBDYINTERSECT(poly, geom)
MariaDB ST_Intersects(poly, geom)
MySQL ST_Intersects(poly, geom)
SpatiaLite Intersects(poly, geom)

isempty

Доступность: PostGIS

Проверяет, пуста ли геометрия.

Пример:

Zipcode.objects.filter(poly__isempty=True)

isvalid

Доступность: MySQL, PostGIS, Oracle, SpatiaLite

Проверяет, является ли геометрия валидной.

Пример:

Zipcode.objects.filter(poly__isvalid=True)
Бэкенд Эквивалент SQL
MySQL, PostGIS, SpatiaLite ST_IsValid(poly)
Oracle SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'

overlaps

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Взаимный)

Проверяет, перекрываются ли геометрическое поле и геометрия поиска.

Бэкенд Эквивалент SQL
PostGIS ST_Overlaps(poly, geom)
Oracle SDO_OVERLAPS(poly, geom)
MariaDB ST_Overlaps(poly, geom)
MySQL ST_Overlaps(poly, geom)
SpatiaLite Overlaps(poly, geom)

relate

Доступность: PostGIS, MariaDB, Oracle, SpatiaLite, PGRaster (Преобразование)

Проверяет, связаны ли геометрическое поле и геометрия поиска по заданному шаблону. Этот поиск требует кортеж параметров, (geom, pattern); форма pattern будет зависеть от пространственного бэкенда:

MariaDB, PostGIS и SpatiaLite

В этих пространственных бэкендах шаблон пересечения — это строка из девяти символов, определяющих пересечения внутренней, граничной и внешней частей геометрического поля и геометрии поиска. Матрица шаблона пересечения может использовать только следующие символы: 1, 2, T, F, или *. Этот тип поиска позволяет пользователям «точно настроить» конкретные геометрические отношения, соответствующие модели DE-9IM. [1]

Пример геометрии:

# A tuple lookup parameter is used to specify the geometry and
# the intersection pattern (the pattern here is for 'contains').
Zipcode.objects.filter(poly__relate=(geom, "T*T***FF*"))

Эквивалент SQL для PostGIS и MariaDB:

SELECT ... WHERE ST_Relate(poly, geom, 'T*T***FF*')

Эквивалент SQL для SpatiaLite:

SELECT ... WHERE Relate(poly, geom, 'T*T***FF*')

Пример растра:

Zipcode.objects.filter(poly__relate=(rast, 1, "T*T***FF*"))
Zipcode.objects.filter(rast__2__relate=(rast, 1, "T*T***FF*"))

Эквивалент SQL для PostGIS:

SELECT ... WHERE ST_Relate(poly, ST_Polygon(rast, 1), 'T*T***FF*')
SELECT ... WHERE ST_Relate(ST_Polygon(rast, 2), ST_Polygon(rast, 1), 'T*T***FF*')

Oracle

Здесь шаблон отношения состоит хотя бы из одной из девяти строк отношений: TOUCH, OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT, EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS, ON, и ANYINTERACT. Несколько строк могут быть объединены логическим булевым оператором OR, например, 'inside+touch'. [2] Строки отношений нечувствительны к регистру.

Пример:

Zipcode.objects.filter(poly__relate=(geom, "anyinteract"))

Эквивалент SQL для Oracle:

SELECT ... WHERE SDO_RELATE(poly, geom, 'anyinteract')

touches

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite

Проверяет, касается ли геометрическое поле геометрии поиска.

Пример:

Zipcode.objects.filter(poly__touches=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Touches(poly, geom)
MariaDB ST_Touches(poly, geom)
MySQL ST_Touches(poly, geom)
Oracle SDO_TOUCH(poly, geom)
SpatiaLite Touches(poly, geom)

within

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Взаимный)

Проверяет, находится ли геометрическое поле внутри геометрии поиска.

Пример:

Zipcode.objects.filter(poly__within=geom)
Бэкенд Эквивалент SQL
PostGIS ST_Within(poly, geom)
MariaDB ST_Within(poly, geom)
MySQL ST_Within(poly, geom)
Oracle SDO_INSIDE(poly, geom)
SpatiaLite Within(poly, geom)

left

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничительной рамки геометрического поля строго слева от ограничительной рамки геометрии поиска.

Пример:

Zipcode.objects.filter(poly__left=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly << geom

right

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничительной рамки геометрического поля строго справа от ограничительной рамки геометрии поиска.

Пример:

Zipcode.objects.filter(poly__right=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly >> geom

overlaps_left

Доступность: PostGIS, PGRaster (Взаимный)

Проверяет, перекрывается ли или находится слева прямоугольник ограничительной рамки геометрического поля от ограничительной рамки геометрии поиска.

Пример:

Zipcode.objects.filter(poly__overlaps_left=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly &< geom

overlaps_right

Доступность: PostGIS, PGRaster (Взаимный)

Проверяет, перекрывается ли или находится справа прямоугольник ограничительной рамки геометрического поля от ограничительной рамки геометрии поиска.

Пример:

Zipcode.objects.filter(poly__overlaps_right=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly &> geom

overlaps_above

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, перекрывается ли или находится прямоугольник ограничительной рамки геометрического поля сверху от ограничительной рамки геометрии поиска.

Пример:

Zipcode.objects.filter(poly__overlaps_above=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly |&> geom

overlaps_below

Доступность: PostGIS, PGRaster (Преобразование)

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

Пример:

Zipcode.objects.filter(poly__overlaps_below=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly &<| geom

strictly_above

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничительной рамки геометрического поля строго сверху от ограничительной рамки геометрии поиска.

Пример:

Zipcode.objects.filter(poly__strictly_above=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly |>> geom

strictly_below

Доступность: PostGIS, PGRaster (Преобразование)

Проверяет, находится ли прямоугольник ограничительной рамки геометрического поля строго снизу от ограничительной рамки геометрии поиска.

Пример:

Zipcode.objects.filter(poly__strictly_below=geom)

Эквивалент PostGIS:

SELECT ... WHERE poly <<| geom

Поиск по расстоянию

Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Нативный)

Для получения обзора выполнения запросов по расстоянию см. введение в запросы по расстоянию.

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

<field>__<distance lookup>=(<geometry/raster>, <distance value>[, "spheroid"])
<field>__<distance lookup>=(<raster>, <band_index>, <distance value>[, "spheroid"])
<field>__<band_index>__<distance lookup>=(<raster>, <band_index>, <distance value>[, "spheroid"])

Передаваемое значение в поиск по расстоянию — это кортеж; первые два значения обязательны и представляют собой геометрию, до которой необходимо вычислить расстояния, и значение расстояния (число в единицах поля, объект Distance или выражение запроса). Для передачи индекса диапазона в поиск используйте кортеж из 3 элементов, где второй элемент — индекс диапазона.

При каждом поиске по расстоянию, кроме dwithin, может быть включён необязательный элемент 'spheroid', чтобы использовать более точные функции вычисления расстояний по эллипсоиду для полей с геодезической системой координат.

В PostgreSQL опция 'spheroid' использует ST_DistanceSpheroid вместо ST_DistanceSphere. Простая функция ST_Distance используется с проекционными системами координат. Растры преобразуются в геометрии для поисков по эллипсоидам.

distance_gt

Возвращает модели, где расстояние до геометрического поля от геометрии поиска больше заданного значения расстояния.

Пример:

Zipcode.objects.filter(poly__distance_gt=(geom, D(m=5)))
Бэкенд Эквивалент SQL
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) > 5
MariaDB ST_Distance(poly, geom) > 5
MySQL ST_Distance(poly, geom) > 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) > 5
SpatiaLite Distance(poly, geom) > 5

distance_gte

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

Пример:

Zipcode.objects.filter(poly__distance_gte=(geom, D(m=5)))
Бэкенд SQL эквивалент
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) >= 5
MariaDB ST_Distance(poly, geom) >= 5
MySQL ST_Distance(poly, geom) >= 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) >= 5
SpatiaLite Distance(poly, geom) >= 5

distance_lt

Возвращает модели, где расстояние до геометрического поля от поля поиска меньше заданного значения расстояния.

Пример:

Zipcode.objects.filter(poly__distance_lt=(geom, D(m=5)))
Бэкенд SQL эквивалент
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) < 5
MariaDB ST_Distance(poly, geom) < 5
MySQL ST_Distance(poly, geom) < 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) < 5
SpatiaLite Distance(poly, geom) < 5

distance_lte

Возвращает модели, где расстояние до геометрического поля от поля поиска меньше или равно заданному значению расстояния.

Пример:

Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))
Бэкенд SQL эквивалент
PostGIS ST_Distance/ST_Distance_Sphere(poly, geom) <= 5
MariaDB ST_Distance(poly, geom) <= 5
MySQL ST_Distance(poly, geom) <= 5
Oracle SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) <= 5
SpatiaLite Distance(poly, geom) <= 5

dwithin

Возвращает модели, где расстояние до геометрического поля от поля поиска находится в пределах заданного расстояния друг от друга. Обратите внимание, что вы можете указать только объекты Distance, если целевые геометрии находятся в проекционной системе. Для географических геометрий следует использовать единицы измерения поля геометрии (например, градусы для WGS84) .

Пример:

Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
Бэкенд SQL эквивалент
PostGIS ST_DWithin(poly, geom, 5)
Oracle SDO_WITHIN_DISTANCE(poly, geom, 5)
SpatiaLite PtDistWithin(poly, geom, 5)

Функции агрегирования

Django предоставляет некоторые специфичные для ГИС функции агрегирования. Подробную информацию о том, как использовать эти функции агрегирования, см. в руководстве по агрегированию.

Ключевое слово Описание
tolerance Это ключевое слово только для Oracle. Оно используется для значения допуска, используемого процедурой SDOAGGRTYPE; дополнительная информация содержится в документации Oracle.

Пример:

>>> from django.contrib.gis.db.models import Extent, Union
>>> WorldBorder.objects.aggregate(Extent("mpoly"), Union("mpoly"))

Collect

class Collect(geo_field, filter=None) [source]

Доступность: PostGIS, MySQL, SpatiaLite

Возвращает объект геометрии GEOMETRYCOLLECTION или MULTI из столбца геометрии. Это аналогично упрощенной версии агрегата Union, за исключением того, что он может быть на несколько порядков быстрее при выполнении объединения, так как он группирует геометрии в коллекцию или многообъектный объект, не заботясь о растворении границ.

Изменено в Django 5.0:

Добавлена поддержка использования аргумента filter.

Изменено в Django 5.1:

Добавлена поддержка MySQL 8.0.24+.

Extent

class Extent(geo_field, filter=None) [source]

Доступность: PostGIS, Oracle, SpatiaLite

Возвращает область всех geo_field в QuerySet в виде 4-кортежа, состоящего из координаты нижнего левого угла и координаты верхнего правого угла.

Пример:

>>> qs = City.objects.filter(name__in=("Houston", "Dallas")).aggregate(Extent("poly"))
>>> print(qs["poly__extent"])
(-96.8016128540039, 29.7633724212646, -95.3631439208984, 32.782058715820)
Изменено в Django 5.0:

Добавлена поддержка использования аргумента filter.

Extent3D

class Extent3D(geo_field, filter=None) [source]

Доступность: PostGIS

Возвращает 3D область всех geo_field в QuerySet в виде 6-кортежа, содержащего координаты нижнего левого угла и верхнего правого угла (каждая с координатами x, y и z).

Пример:

>>> qs = City.objects.filter(name__in=("Houston", "Dallas")).aggregate(Extent3D("poly"))
>>> print(qs["poly__extent3d"])
(-96.8016128540039, 29.7633724212646, 0, -95.3631439208984, 32.782058715820, 0)
Изменено в Django 5.0:

Добавлена поддержка использования аргумента filter.

MakeLine

class MakeLine(geo_field, filter=None) [source]

Доступность: PostGIS, SpatiaLite

Возвращает LineString , построенный из геометрий точечных полей в QuerySet. В настоящее время сортировка набора запросов не оказывает никакого влияния.

Пример:

>>> qs = City.objects.filter(name__in=("Houston", "Dallas")).aggregate(MakeLine("poly"))
>>> print(qs["poly__makeline"])
LINESTRING (-95.3631510000000020 29.7633739999999989, -96.8016109999999941 32.7820570000000018)
Изменено в Django 5.0:

Добавлена поддержка использования аргумента filter.

Union

class Union(geo_field, filter=None) [source]

Доступность: PostGIS, Oracle, SpatiaLite

Этот метод возвращает объект GEOSGeometry, представляющий собой объединение всех геометрий в наборе запросов. Обратите внимание, что использование Union является ресурсоемким процессом и может занимать значительное время при больших наборах запросов.

Примечание

Если время вычислений при использовании этого метода слишком велико, рассмотрите возможность использования Collect вместо него.

Пример:

>>> u = Zipcode.objects.aggregate(Union(poly))  # This may take a long time.
>>> u = Zipcode.objects.filter(poly__within=bbox).aggregate(
...     Union(poly)
... )  # A more sensible approach.
Изменено в Django 5.0:

Добавлена поддержка использования аргумента filter.

Примечания

[1] См. Спецификацию OpenGIS Simple Feature Specification For SQL, в главе 2.1.13.2, стр. 2-13 (Модель девяти пересечений с расширением размерности).
[2] См. документацию SDO_RELATE из Руководства разработчика Oracle Spatial and Graph.
[3] (1, 2) Для объяснения этой процедуры ознакомьтесь с Свойствами пространственного предиката "Contains" Мартина Дэвиса (разработчик PostGIS).

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.1/ref/contrib/gis/geoquerysets/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API