Справочник по API GIS QuerySet¶
Пространственные поиски¶
Пространственный поиск в этом разделе доступен для GeometryField
и RasterField
.
Введение см. в spatial lookups introduction. Обзор того, какие поисковые запросы совместимы с конкретным пространственным бэкендом, приведен в spatial lookup compatibility table.
Поиск с помощью растров¶
Все примеры, приведенные ниже, даны для геометрических полей и входов, но поиск можно использовать одинаково с растровыми изображениями с обеих сторон. Если поиск не поддерживает растровый ввод, то при необходимости ввод автоматически преобразуется в геометрию с помощью функции ST_Polygon. См. также introduction to raster lookups.
Операторы базы данных, используемые при поиске, можно разделить на три категории:
- Поддержка нативных растров
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 (Native)
Проверяет, полностью ли граничная область геометрии или растрового поля содержит граничную область геометрии поиска.
Пример:
Zipcode.objects.filter(poly__bbcontains=geom)
Бэкэнд | Эквивалент SQL |
---|---|
ПостГИС | poly ~ geom |
MariaDB | MBRContains(poly, geom) |
MySQL | MBRContains(poly, geom) |
SpatiaLite | MbrContains(poly, geom) |
bboverlaps
¶
Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
Проверяет, перекрывает ли граница поля геометрии границу поля геометрии поиска.
Пример:
Zipcode.objects.filter(poly__bboverlaps=geom)
Бэкэнд | Эквивалент SQL |
---|---|
ПостГИС | poly && geom |
MariaDB | MBROverlaps(poly, geom) |
MySQL | MBROverlaps(poly, geom) |
SpatiaLite | MbrOverlaps(poly, geom) |
contained
¶
Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
Проверяет, полностью ли граничная область поля геометрии содержится в граничной области геометрии поиска.
Пример:
Zipcode.objects.filter(poly__contained=geom)
Бэкэнд | Эквивалент SQL |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | ST_ContainsProperly(poly, geom) |
coveredby
¶
Доступность: PostGIS, Oracle, PGRaster (двусторонний), SpatiaLite
Проверяет, не находится ли точка в поле геометрии за пределами геометрии поиска. [3]
Пример:
Zipcode.objects.filter(poly__coveredby=geom)
Бэкэнд | Эквивалент SQL |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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*"))
PostGIS и MariaDB SQL эквивалент:
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"))
Эквивалент Oracle SQL:
SELECT ... WHERE SDO_RELATE(poly, geom, 'anyinteract')
touches
¶
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite
Проверяет, касается ли поле геометрии пространственно геометрии поиска.
Пример:
Zipcode.objects.filter(poly__touches=geom)
Бэкэнд | Эквивалент SQL |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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
Поиск расстояний¶
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
Для получения информации о выполнении запросов на расстояние, пожалуйста, обратитесь к distance queries introduction.
Поиск расстояний имеет следующий вид:
<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
, либо query expression). Чтобы передать индекс диапазона в поиск, используйте 3 кортежа, где второй элемент - это индекс диапазона.
При каждом поиске расстояния, кроме dwithin
, может быть включен необязательный элемент 'spheroid'
для использования более точных функций расчета расстояния до сфероида на полях с геодезической системой координат.
В PostgreSQL опция 'spheroid'
использует ST_DistanceSpheroid вместо ST_DistanceSphere. Более простая функция ST_Distance используется с проецируемыми системами координат. Растры преобразуются в геометрию для поиска по сфероиду.
distance_gt
¶
Возвращает модели, в которых расстояние до поля геометрии от геометрии поиска больше заданного значения расстояния.
Пример:
Zipcode.objects.filter(poly__distance_gt=(geom, D(m=5)))
Бэкэнд | Эквивалент SQL |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | 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 |
---|---|
ПостГИС | ST_DWithin(poly, geom, 5) |
Oracle | SDO_WITHIN_DISTANCE(poly, geom, 5) |
SpatiaLite | PtDistWithin(poly, geom, 5) |
Агрегатные функции¶
Django предоставляет некоторые агрегатные функции, специфичные для ГИС. Подробнее о том, как использовать эти агрегатные функции, смотрите the topic guide on aggregation.
Аргумент по ключевому слову | Описание |
---|---|
tolerance |
Это ключевое слово предназначено только для Oracle. Оно предназначено для значения допуска, используемого процедурой SDOAGGRTYPE ; в Oracle documentation есть более подробная информация. |
Пример:
>>> from django.contrib.gis.db.models import Extent, Union
>>> WorldBorder.objects.aggregate(Extent("mpoly"), Union("mpoly"))
Collect
¶
-
class
Collect
(geo_field, filter=None)¶
Доступность: PostGIS, SpatiaLite
Возвращает объект геометрии GEOMETRYCOLLECTION
или MULTI
из столбца геометрии. Это аналог упрощенной версии агрегата Union
, за исключением того, что он может быть на несколько порядков быстрее, чем выполнение объединения, потому что он сворачивает геометрии в коллекцию или мультиобъект, не заботясь о растворении границ.
Добавлена поддержка использования аргумента filter
.
Extent
¶
-
class
Extent
(geo_field, filter=None)¶
Доступность: 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)
Добавлена поддержка использования аргумента filter
.
Extent3D
¶
-
class
Extent3D
(geo_field, filter=None)¶
Доступность: PostGIS
Возвращает трехмерную протяженность всех 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)
Добавлена поддержка использования аргумента filter
.
MakeLine
¶
-
class
MakeLine
(geo_field, filter=None)¶
Доступность: 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)
Добавлена поддержка использования аргумента filter
.
Union
¶
-
class
Union
(geo_field, filter=None)¶
Доступность: 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.
Добавлена поддержка использования аргумента filter
.
Сноски
[1] | Смотрите OpenGIS Simple Feature Specification For SQL, в гл. 2.1.13.2, стр. 2-13 (Расширенная по размерам модель девяти пересечений). |
[2] | Смотрите SDO_RELATE documentation, из руководства Oracle Spatial and Graph Developer’s Guide. |
[3] | (1, 2) Для объяснения этой процедуры прочитайте Quirks of the «Contains» Spatial Predicate Мартина Дэвиса (разработчика PostGIS). |