Справочник API GIS QuerySet
Пространственные поисковые выражения
Пространственные поисковые выражения из этого раздела доступны для GeometryField и RasterField.
Введение см. в введении в пространственные поисковые выражения. Обзор поисковых выражений, совместимых с конкретным пространственным сервером, см. в таблице совместимости пространственных поисковых выражений.
Поисковые выражения с растровыми данными
Все примеры в приведённом ниже справочнике относятся к геометрическим полям и входным данным, но поисковые выражения можно использовать таким же образом и с растрами с обеих сторон. Если поисковое выражение не поддерживает растровые данные на входе, входные данные автоматически преобразуются в геометрию при необходимости с помощью функции ST_Polygon. См. также введение в поисковые выражения для растровых данных.
Операторы базы данных, используемые поисковыми выражениями, делятся на три категории:
- Нативная поддержка растров
N: оператор нативно принимает растры с обеих сторон поискового выражения, а растровые входные данные можно смешивать с геометрическими. - Двусторонняя поддержка растров
B: оператор поддерживает растры, только если растровые входные данные передаются с обеих сторон поискового выражения. Для смешанных поисковых выражений растровые данные автоматически преобразуются в геометрию. - Поддержка преобразования в геометрию
C. Поисковое выражение не имеет нативной поддержки растровых данных; все растровые данные автоматически преобразуются в геометрию.
В приведённых ниже примерах показан эквивалент SQL для поисковых выражений с разными типами поддержки растровых данных. Один и тот же шаблон применим ко всем пространственным поисковым выражениям.
Случай | Поисковое выражение | Эквивалент SQL |
|---|---|---|
N, B |
|
|
N, B |
|
|
B, C |
|
|
B, C |
|
|
B, C |
|
|
B, C |
|
|
C |
|
|
C |
|
|
C |
|
|
C |
|
|
Пространственные поисковые выражения с растровыми данными поддерживаются только на серверах PostGIS (в этом разделе обозначаются как PGRaster).
bbcontains
Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
Проверяет, полностью ли ограничивающий прямоугольник геометрического поля или растрового поля содержит ограничивающий прямоугольник геометрии поискового выражения.
Пример:
Zipcode.objects.filter(poly__bbcontains=geom)
Эквивалент SQL | |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
bboverlaps
Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
Проверяет, пересекается ли ограничивающий прямоугольник геометрического поля с ограничивающим прямоугольником геометрии поискового выражения.
Пример:
Zipcode.objects.filter(poly__bboverlaps=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
contained
Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
Проверяет, полностью ли ограничивающий прямоугольник геометрического поля содержится в ограничивающем прямоугольнике геометрии поискового выражения.
Пример:
Zipcode.objects.filter(poly__contained=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
contains
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
Проверяет, содержит ли геометрическое поле геометрию поискового выражения в пространственном смысле.
Пример:
Zipcode.objects.filter(poly__contains=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
contains_properly
Доступность: PostGIS, PGRaster (Bilateral)
Возвращает true, если геометрия поискового выражения пересекает внутреннюю область геометрического поля, но не его границу (или внешнюю область).
Пример:
Zipcode.objects.filter(poly__contains_properly=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
coveredby
Доступность: PostGIS, Oracle, MariaDB, MySQL, PGRaster (Bilateral), SpatiaLite
Проверяет, что ни одна точка геометрического поля не находится за пределами геометрии поискового выражения. [3]
Пример:
Zipcode.objects.filter(poly__coveredby=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
Добавлена поддержка MySQL.
Добавлена поддержка MariaDB 12.0.1+.
covers
Доступность: PostGIS, Oracle, MySQL, PGRaster (Bilateral), SpatiaLite
Проверяет, что ни одна точка геометрии поискового выражения не находится за пределами геометрического поля. [3]
Пример:
Zipcode.objects.filter(poly__covers=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MySQL |
|
SpatiaLite |
|
Добавлена поддержка MySQL.
crosses
Доступность: PostGIS, MariaDB, MySQL, SpatiaLite, PGRaster (Conversion)
Проверяет, пересекает ли геометрическое поле геометрию поискового выражения в пространственном смысле.
Пример:
Zipcode.objects.filter(poly__crosses=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
disjoint
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
Проверяет, не пересекается ли геометрическое поле с геометрией поискового выражения в пространственном смысле.
Пример:
Zipcode.objects.filter(poly__disjoint=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
equals
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Conversion)
Проверяет, равняется ли геометрическое поле геометрии поискового выражения в пространственном смысле.
Пример:
Zipcode.objects.filter(poly__equals=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
exact, same_as
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
Проверяет, «равно» ли геометрическое поле геометрии поискового выражения. В Oracle, MySQL и SpatiaLite проверяется пространственное равенство, а в PostGIS — равенство ограничивающих прямоугольников.
Пример:
Zipcode.objects.filter(poly=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
intersects
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
Проверяет, пересекает ли геометрическое поле геометрию поискового выражения в пространственном смысле.
Пример:
Zipcode.objects.filter(poly__intersects=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
isempty
Доступность: PostGIS
Проверяет, является ли геометрия пустой.
Пример:
Zipcode.objects.filter(poly__isempty=True)
isvalid
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Проверяет, является ли геометрия допустимой.
Пример:
Zipcode.objects.filter(poly__isvalid=True)
Сервер | Эквивалент SQL |
|---|---|
MariaDB, MySQL, PostGIS, SpatiaLite |
|
Oracle |
|
Добавлена поддержка MariaDB 12.0.1+.
geom_type
Доступность: PostGIS, Oracle 23c+, MariaDB, MySQL, SpatiaLite
Возвращает тип геометрии геометрического поля.
Пример:
Zipcode.objects.filter(poly__geom_type="POLYGON")
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
overlaps
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
Проверяет, перекрывает ли геометрическое поле геометрию поискового выражения в пространственном смысле.
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
relate
Доступность: PostGIS, MariaDB, Oracle, SpatiaLite, PGRaster (Conversion)
Проверяет, связано ли геометрическое поле с геометрией поискового выражения в пространственном смысле согласно заданным значениям шаблона. Для этого поискового выражения требуется параметр-кортеж, (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 |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
within
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Bilateral)
Проверяет, находится ли геометрическое поле внутри геометрии поискового выражения в пространственном смысле.
Пример:
Zipcode.objects.filter(poly__within=geom)
Сервер | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
left
Доступность: PostGIS, PGRaster (Conversion)
Проверяет, находится ли ограничивающий прямоугольник геометрического поля строго левее ограничивающего прямоугольника геометрии поискового выражения.
Пример:
Zipcode.objects.filter(poly__left=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly << geom
right
Доступность: PostGIS, PGRaster (Conversion)
Проверяет, находится ли ограничивающий прямоугольник геометрического поля строго правее ограничивающего прямоугольника геометрии поискового выражения.
Пример:
Zipcode.objects.filter(poly__right=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly >> geom
overlaps_left
Доступность: PostGIS, PGRaster (Bilateral)
Проверяет, пересекается ли ограничивающий прямоугольник геометрического поля с ограничивающим прямоугольником геометрии поискового выражения или находится ли он левее него.
Пример:
Zipcode.objects.filter(poly__overlaps_left=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly &< geom
overlaps_right
Доступность: PostGIS, PGRaster (Bilateral)
Проверяет, пересекается ли ограничивающий прямоугольник геометрического поля с ограничивающим прямоугольником геометрии поискового выражения или находится ли он правее него.
Пример:
Zipcode.objects.filter(poly__overlaps_right=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly &> geom
overlaps_above
Доступность: PostGIS, PGRaster (Conversion)
Проверяет, пересекается ли ограничивающий прямоугольник геометрического поля с ограничивающим прямоугольником геометрии поискового выражения или находится ли он выше него.
Пример:
Zipcode.objects.filter(poly__overlaps_above=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly |&> geom
overlaps_below
Доступность: PostGIS, PGRaster (Conversion)
Проверяет, пересекается ли ограничивающий прямоугольник геометрического поля с ограничивающим прямоугольником геометрии поискового выражения или находится ли он ниже него.
Пример:
Zipcode.objects.filter(poly__overlaps_below=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly &<| geom
strictly_above
Доступность: PostGIS, PGRaster (Conversion)
Проверяет, находится ли ограничивающий прямоугольник геометрического поля строго выше ограничивающего прямоугольника геометрии поискового выражения.
Пример:
Zipcode.objects.filter(poly__strictly_above=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly |>> geom
strictly_below
Доступность: PostGIS, PGRaster (Conversion)
Проверяет, находится ли ограничивающий прямоугольник геометрического поля строго ниже ограничивающего прямоугольника геометрии поискового выражения.
Пример:
Zipcode.objects.filter(poly__strictly_below=geom)
Эквивалент для PostGIS:
SELECT ... WHERE poly <<| geom
Поиск по расстоянию
Доступность: PostGIS, Oracle, MariaDB, MySQL, SpatiaLite, PGRaster (Native)
Обзор выполнения запросов по расстоянию см. во введении в запросы по расстоянию.
Поиск по расстоянию имеет следующий вид:
<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 или выражение запроса). Чтобы передать индекс полосы в поиск, используйте кортеж из трех элементов, где второй элемент — индекс полосы.
Для любого поиска по расстоянию, кроме dwithin, можно включить необязательный элемент 'spheroid', чтобы использовать более точные функции вычисления расстояния по сфероиду для полей с геодезической системой координат.
В PostgreSQL параметр 'spheroid' использует ST_DistanceSpheroid вместо ST_DistanceSphere. Для проецируемых систем координат используется более простая функция ST_Distance. При поиске по сфероиду растры преобразуются в геометрии.
distance_gt
Возвращает модели, для которых расстояние от геометрии поиска до геометрического поля больше заданного значения.
Пример:
Zipcode.objects.filter(poly__distance_gt=(geom, D(m=5)))
СУБД | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
distance_gte
Возвращает модели, для которых расстояние от геометрии поиска до геометрического поля больше или равно заданному значению.
Пример:
Zipcode.objects.filter(poly__distance_gte=(geom, D(m=5)))
СУБД | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
distance_lt
Возвращает модели, для которых расстояние от геометрии поиска до геометрического поля меньше заданного значения.
Пример:
Zipcode.objects.filter(poly__distance_lt=(geom, D(m=5)))
СУБД | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
distance_lte
Возвращает модели, для которых расстояние от геометрии поиска до геометрического поля меньше или равно заданному значению.
Пример:
Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))
СУБД | Эквивалент SQL |
|---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
dwithin
Возвращает модели, для которых расстояние от геометрии поиска до геометрического поля не превышает заданное расстояние. Обратите внимание: объекты Distance можно передавать только в том случае, если целевые геометрии находятся в проецируемой системе координат. Для географических геометрий следует использовать единицы измерения геометрического поля (например, градусы для WGS84).
Пример:
Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
СУБД | Эквивалент SQL |
|---|---|
PostGIS |
|
Oracle |
|
SpatiaLite |
|
Агрегатные функции
Django предоставляет несколько агрегатных функций, специфичных для ГИС. Сведения об использовании этих агрегатных функций см. в тематическом руководстве по агрегации.
Именованный аргумент | Описание |
|---|---|
| Этот именованный аргумент используется только в Oracle. Он задает значение допуска, используемое процедурой |
Пример:
>>> from django.contrib.gis.db.models import Extent, Union
>>> WorldBorder.objects.aggregate(Extent("mpoly"), Union("mpoly"))
Collect
-
class Collect(geo_field, filter=None)[исходный код]
Доступность: PostGIS, MariaDB, MySQL, SpatiaLite
Возвращает геометрический объект типа GEOMETRYCOLLECTION или MULTI из геометрического столбца. Это аналог упрощенной версии агрегата Union, но он может быть на несколько порядков быстрее объединения, поскольку собирает геометрии в коллекцию или составной объект, не объединяя границы.
Добавлена поддержка MariaDB 12.0.1 и более поздних версий.
Extent
-
class Extent(geo_field, filter=None)[исходный код]
Доступность: PostGIS, Oracle, SpatiaLite
Возвращает охватывающую область всех geo_field в QuerySet в виде кортежа из четырех значений, содержащего координаты нижнего левого и верхнего правого углов.
Пример:
>>> qs = City.objects.filter(name__in=("Houston", "Dallas")).aggregate(Extent("poly"))
>>> print(qs["poly__extent"])
(-96.8016128540039, 29.7633724212646, -95.3631439208984, 32.782058715820)
Extent3D
-
class Extent3D(geo_field, filter=None)[исходный код]
Доступность: PostGIS
Возвращает трехмерную охватывающую область всех geo_field в QuerySet в виде кортежа из шести значений, содержащего координаты нижнего левого и верхнего правого углов (для каждой точки указаны координаты 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)
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)
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.
Сноски
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/contrib/gis/geoquerysets/