Функции географических баз данных
Описанные на этой странице функции позволяют пользователям обращаться к функциям географических баз данных для использования в аннотациях, агрегатах и фильтрах Django.
Пример:
>>> from django.contrib.gis.db.models.functions import Length
>>> Track.objects.annotate(length=Length("line")).filter(length__gt=100)
Не все серверы баз данных поддерживают все функции, поэтому обратитесь к документации каждой функции, чтобы проверить, поддерживает ли ваш сервер баз данных нужную вам функцию. Если вызвать географическую функцию на сервере, который её не поддерживает, возникнет исключение NotImplementedError.
Измерения
Area
-
class Area(expression, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает площадь поля как величину Area.
MySQL и SpatiaLite без LWGEOM/RTTOPO не поддерживают вычисление площади для географических систем пространственной привязки.
Distance
-
class Distance(expr1, expr2, spheroid=None, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает расстояние между ними в виде объекта Distance. В MySQL при геодезических координатах возвращается значение типа float.
На серверах, поддерживающих вычисление расстояния для геодезических координат, подходящая функция сервера выбирается автоматически в зависимости от значения SRID геометрий (например, ST_DistanceSphere в PostGIS).
При вычислении расстояний по геодезическим (угловым) координатам, как в случае с используемым по умолчанию SRID WGS84 (4326), можно задать именованный аргумент spheroid, чтобы выбрать, будет ли вычисление выполняться на основе обычной сферы (менее точно, но с меньшими затратами ресурсов) или сфероида (точнее, но с большими затратами ресурсов).
В следующем примере вычисляется расстояние от города Хобарт до каждого другого объекта PointField в наборе запросов AustraliaCity:
>>> from django.contrib.gis.db.models.functions import Distance
>>> pnt = AustraliaCity.objects.get(name="Hobart").point
>>> for city in AustraliaCity.objects.annotate(distance=Distance("point", pnt)):
... print(city.name, city.distance)
...
Wollongong 990071.220408 m
Shellharbour 972804.613941 m
Thirroul 1002334.36351 m
...
Примечание
Поскольку атрибут distance — это объект Distance, вы можете легко выразить значение в нужных единицах измерения. Например, city.distance.mi — это расстояние в милях, а city.distance.km — расстояние в километрах. Подробнее об использовании и списке поддерживаемых единиц измерения см. в разделе Объекты измерения.
GeometryDistance
-
class GeometryDistance(expr1, expr2, **extra)[исходный код]
Доступность: PostGIS
Принимает два географических поля или выражения и возвращает расстояние между ними. При использовании в предложении order_by() эта функция обеспечивает выборку ближайших соседей с использованием индекса.
Length
-
class Length(expression, spheroid=True, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение типа «линейная строка» или «мультилинейная строка» и возвращает его длину как величину Distance.
В PostGIS и SpatiaLite при угловых геодезических координатах можно с помощью именованного аргумента spheroid указать, должно ли вычисление выполняться на основе обычной сферы (менее точно, но с меньшими затратами ресурсов) или сфероида (точнее, но с большими затратами ресурсов).
MySQL не поддерживает вычисление длины для географических систем пространственной привязки.
Perimeter
-
class Perimeter(expression, **extra)[исходный код]
Доступность: PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает периметр геометрического поля как объект Distance.
Отношения
Azimuth
-
class Azimuth(point_a, point_b, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite (LWGEOM/RTTOPO)
Возвращает азимут в радианах отрезка, заданного указанными геометрическими точками, или None, если точки совпадают. Азимут — это угол, отсчитываемый от севера по часовой стрелке: север = 0; восток = π/2; юг = π; запад = 3π/2.
BoundingCircle
-
class BoundingCircle(expression, num_seg=48, **extra)[исходный код]
Доступность: PostGIS, Oracle, SpatiaLite 5.1+
Принимает одно географическое поле или выражение и возвращает наименьший полигон в форме круга, полностью содержащий геометрию.
Параметр num_seg используется только в PostGIS.
Centroid
-
class Centroid(expression, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает значение centroid геометрии.
ClosestPoint
-
class ClosestPoint(expr1, expr2, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Принимает два географических поля или выражения и возвращает двумерную точку геометрии A, ближайшую к геометрии B.
Envelope
-
class Envelope(expression, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию, представляющую ограничивающую рамку этой геометрии.
LineLocatePoint
-
class LineLocatePoint(linestring, point, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Возвращает число с плавающей точкой от 0 до 1, представляющее положение ближайшей точки на linestring к указанной point в виде доли длины двумерной линии.
PointOnSurface
-
class PointOnSurface(expression, **extra)[исходный код]
Доступность: PostGIS, MariaDB, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию Point, гарантированно лежащую на поверхности поля; в противном случае возвращает None.
Операции
Difference
-
class Difference(expr1, expr2, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает геометрическую разность, то есть часть геометрии A, не пересекающуюся с геометрией B.
Intersection
-
class Intersection(expr1, expr2, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает геометрическое пересечение между ними.
SymDifference
-
class SymDifference(expr1, expr2, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает геометрическую симметрическую разность (объединение без пересечения) заданных параметров.
Union
-
class Union(expr1, expr2, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает объединение обеих геометрий.
Редакторы
ForcePolygonCW
-
class ForcePolygonCW(expression, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает изменённую версию полигона или мультиполигона, в которой все внешние кольца ориентированы по часовой стрелке, а все внутренние — против часовой стрелки. Геометрии, не являющиеся полигонами, возвращаются без изменений.
MakeValid
-
class MakeValid(expr)[исходный код]
Доступность: PostGIS, SpatiaLite (LWGEOM/RTTOPO)
Принимает географическое поле или выражение и пытается преобразовать значение в корректную геометрию, не теряя ни одной исходной вершины. Уже корректные геометрии возвращаются без изменений. Простые полигоны могут стать мультиполигонами, а размерность результата может быть меньше размерности исходной геометрии.
Reverse
-
class Reverse(expression, **extra)[исходный код]
Доступность: PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию с обратным порядком координат.
Rotate
-
class Rotate(expression, angle, origin=None, **extra)[исходный код]
Поворачивает геометрию на заданный angle вокруг начала координат. При желании поворот можно выполнить вокруг точки, заданной параметром origin.
Scale
-
class Scale(expression, x, y, z=0.0, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию с масштабированными координатами, умноженными на параметры x, y и, при необходимости, z.
SnapToGrid
-
class SnapToGrid(expression, *args, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию, все точки которой привязаны к заданной сетке. Способ привязки геометрии к сетке зависит от количества переданных числовых аргументов (типа float, integer или long).
Количество аргументов | Описание |
|---|---|
1 | Единый размер шага для привязки сеток по X и Y. |
2 | Размеры шага сетки по X и Y. |
4 | Размеры шага сетки по X и Y и соответствующие начала координат X и Y. |
Transform
-
class Transform(expression, srid, **extra)[исходный код]
Доступность: PostGIS, Oracle, SpatiaLite
Принимает географическое поле или выражение и целочисленный код SRID, возвращая геометрию, преобразованную в систему пространственной привязки, заданную параметром srid.
Примечание
Система пространственной привязки, соответствующая целочисленному SRID, может зависеть от используемой пространственной базы данных. Иными словами, номера SRID, используемые в Oracle, не обязательно совпадают с номерами, используемыми в PostGIS.
Translate
-
class Translate(expression, x, y, z=0.0, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию со смещёнными координатами; смещение задаётся числовыми параметрами x, y и, при необходимости, z.
Формат входных данных
FromWKB
-
class FromWKB(expression, srid=0, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Создаёт геометрию из представления WKB (Well-known binary). Необязательный аргумент srid позволяет указать SRID результирующей геометрии. В Oracle srid игнорируется.
FromWKT
-
class FromWKT(expression, srid=0, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Создаёт геометрию из представления WKT (Well-known text). Необязательный аргумент srid позволяет указать SRID результирующей геометрии. В Oracle srid игнорируется.
Формат вывода
AsGeoJSON
-
class AsGeoJSON(expression, bbox=False, crs=False, precision=8, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает представление геометрии в формате GeoJSON. Обратите внимание: результат не является полной структурой GeoJSON, а содержит только содержимое ключа geometry структуры GeoJSON. См. также Сериализатор GeoJSON.
Пример:
>>> City.objects.annotate(json=AsGeoJSON("point")).get(name="Chicago").json
{"type":"Point","coordinates":[-87.65018,41.85039]}
Именованный аргумент | Описание |
|---|---|
| Установите значение |
| Установите значение |
| Позволяет указать количество значащих цифр координат в представлении GeoJSON — значение по умолчанию равно 8. Игнорируется в Oracle. |
AsGML
-
class AsGML(expression, version=2, precision=8, **extra)[исходный код]
Доступность: Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает представление геометрии на языке Geographic Markup Language (GML).
Пример:
>>> qs = Zipcode.objects.annotate(gml=AsGML("poly"))
>>> print(qs[0].gml)
<gml:Polygon srsName="EPSG:4326"><gml:OuterBoundaryIs>-147.78711,70.245363 ...
-147.78711,70.245363</gml:OuterBoundaryIs></gml:Polygon>
Именованный аргумент | Описание |
|---|---|
| Указывает количество значащих цифр координат в представлении GML — значение по умолчанию равно 8. Игнорируется в Oracle. |
| Указывает используемую версию GML: 2 (по умолчанию) или 3. |
AsKML
-
class AsKML(expression, precision=8, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает представление геометрии на языке Keyhole Markup Language (KML).
Пример:
>>> qs = Zipcode.objects.annotate(kml=AsKML("poly"))
>>> print(qs[0].kml)
<Polygon><outerBoundaryIs><LinearRing><coordinates>-103.04135,36.217596,0 ...
-103.04135,36.217596,0</coordinates></LinearRing></outerBoundaryIs></Polygon>
Именованный аргумент | Описание |
|---|---|
| Этот аргумент позволяет указать количество значащих цифр координат в представлении KML — значение по умолчанию равно 8. |
AsSVG
-
class AsSVG(expression, relative=False, precision=8, **extra)[исходный код]
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает представление геометрии в формате Scalable Vector Graphics (SVG).
Именованный аргумент | Описание |
|---|---|
| Если задано значение |
| Этот аргумент позволяет указать количество значащих цифр координат в представлении SVG — значение по умолчанию равно 8. |
AsWKB
-
class AsWKB(expression, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает представление геометрии в формате Well-known binary (WKB).
Пример:
>>> bytes(City.objects.annotate(wkb=AsWKB("point")).get(name="Chelyabinsk").wkb)
b'\x01\x01\x00\x00\x00]3\xf9f\x9b\x91K@\x00X\x1d9\xd2\xb9N@'
AsWKT
-
class AsWKT(expression, **extra)[исходный код]
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает представление геометрии в формате Well-known text (WKT).
Пример:
>>> City.objects.annotate(wkt=AsWKT("point")).get(name="Chelyabinsk").wkt
'POINT (55.137555 61.451728)'
GeoHash
-
class GeoHash(expression, precision=None, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, SpatiaLite (LWGEOM/RTTOPO)
Принимает одно географическое поле или выражение и возвращает представление геометрии в формате GeoHash.
Именованный аргумент precision определяет количество символов в результате.
Добавлена поддержка MariaDB 12.0.1+.
Разное
IsEmpty
-
class IsEmpty(expr)[исходный код]
Доступность: PostGIS
Принимает географическое поле или выражение и проверяет, является ли значение пустой геометрией. Возвращает True, если значение пустое, и False в противном случае.
IsValid
-
class IsValid(expr)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает географическое поле или выражение и проверяет, корректно ли оно сформировано. Возвращает True, если значение является корректной геометрией, и False в противном случае.
Добавлена поддержка MariaDB 12.0.1+.
GeometryType
-
class GeometryType(expr)[исходный код]
Доступность: PostGIS, Oracle 23c+, MariaDB, MySQL, SpatiaLite
Принимает географическое поле или выражение и возвращает тип геометрии.
MemSize
-
class MemSize(expression, **extra)[исходный код]
Доступность: PostGIS
Принимает одно географическое поле или выражение и возвращает размер памяти (количество байтов), занимаемый полем геометрии.
NumGeometries
-
class NumGeometries(expression, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает количество геометрий, если поле геометрии представляет собой коллекцию (например, поле GEOMETRYCOLLECTION или MULTI*). Для одиночных геометрий возвращает 1.
В MySQL для одиночных геометрий возвращает None.
NumPoints
-
class NumPoints(expression, **extra)[исходный код]
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает количество точек в геометрии.
В MySQL для любой геометрии, не являющейся LINESTRING, возвращает None.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/contrib/gis/functions/