Функции географической базы данных
Функции, описанные на этой странице, позволяют пользователям получить доступ к функциям географической базы данных, которые можно использовать в аннотациях, агрегациях или фильтрах в Django.
Пример:
>>> from django.contrib.gis.db.models.functions import Length
>>> Track.objects.annotate(length=Length("line")).filter(length__gt=100)
Не все бэкэнды поддерживают все функции, поэтому обратитесь к документации каждой функции, чтобы узнать, поддерживает ли ваш бэкэнд базы данных используемую вами функцию. Если вы вызываете географическую функцию в бэкэнде, который ее не поддерживает, вы получите исключение NotImplementedError.
Краткое описание функций:
| Измерение | Взаимосвязи | Операции | Редакторы | Формат входных данных | Формат выходных данных | Разное |
|---|---|---|---|---|---|---|
Area | Azimuth | Difference | ForcePolygonCW | AsGeoJSON | IsEmpty | |
Distance | BoundingCircle | Intersection | MakeValid | AsGML | IsValid | |
GeometryDistance | Centroid | SymDifference | Reverse | AsKML | MemSize | |
Length | Envelope | Union | Scale | AsSVG | NumGeometries | |
Perimeter |
LineLocatePoint PointOnSurface
|
SnapToGrid Transform Translate
|
FromWKB FromWKT
|
AsWKB AsWKT GeoHash
| NumPoints |
Площадь
-
class Area(expression, **extra)
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает площадь поля в виде Area меры.
MySQL и SpatiaLite без LWGEOM/RTTOPO не поддерживают вычисления площади в географических системах координат.
Формат GeoJSON
-
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]}
| Ключевой аргумент | Описание |
|---|---|
bbox | Установите значение True , если вы хотите, чтобы прямоугольник ограничительной рамки был включен в возвращаемый GeoJSON. Игнорируется в Oracle. |
crs | Установите значение True , если вы хотите, чтобы система координат была включена в возвращаемый GeoJSON. Игнорируется в MySQL и Oracle. |
precision | Может использоваться для указания числа значащих цифр координат в представлении GeoJSON – значение по умолчанию равно 8. Игнорируется в Oracle. |
Формат GML
-
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>
| Ключевой аргумент | Описание |
|---|---|
precision | Указывает количество значащих цифр координат в представлении GML – значение по умолчанию равно 8. Игнорируется в Oracle. |
version | Указывает используемую версию GML: 2 (по умолчанию) или 3. |
Формат KML
-
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>
| Ключевой аргумент | Описание |
|---|---|
precision | Этот ключевой аргумент может использоваться для указания количества значащих цифр координат в представлении KML – значение по умолчанию равно 8. |
Формат SVG
-
class AsSVG(expression, relative=False, precision=8, **extra)
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает представление геометрии в формате Scalable Vector Graphics (SVG).
| Ключевое слово аргумента | Описание |
|---|---|
relative | Если установлено в True, данные пути будут реализованы в виде относительных перемещений. По умолчанию False, что означает использование абсолютных перемещений. |
precision | Это ключевое слово может быть использовано для указания количества значащих цифр координат в представлении 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)'
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)
Принимает одно географическое поле или выражение и возвращает наименьший круговой полигон, который может полностью содержать геометрию.
Параметр num_seg используется только в PostGIS.
Centroid
-
class Centroid(expression, **extra)
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает центральную точку геометрии.
Difference
-
class Difference(expr1, expr2, **extra)
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает геометрическую разность, то есть часть геометрии A, которая не пересекается с геометрией B.
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 – это значение расстояния в километрах. См. Объекты измерения для получения подробных сведений об использовании и списка Поддерживаемых единиц измерения.
Envelope
-
class Envelope(expression, **extra)
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию, представляющую прямоугольник, окружающий геометрию.
ForcePolygonCW
-
class ForcePolygonCW(expression, **extra)
Доступность: PostGIS, SpatiaLite
Принимает одно географическое поле или выражение и возвращает изменённую версию полигона/многоугольника, в которой все внешние кольца ориентированы по часовой стрелке, а все внутренние кольца – против часовой стрелки. Геометрии, не являющиеся многоугольниками, возвращаются без изменений.
FromWKB
-
class FromWKB(expression, **extra)
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Создаёт геометрию из представления Well-known binary (WKB).
FromWKT
-
class FromWKT(expression, **extra)
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Создаёт геометрию из представления Well-known text (WKT).
GeoHash
-
class GeoHash(expression, precision=None, **extra)
Доступность: MySQL, PostGIS, SpatiaLite (LWGEOM/RTTOPO)
Принимает одно географическое поле или выражение и возвращает представление геометрии в формате GeoHash.
Ключевой аргумент precision управляет количеством символов в результате.
GeometryDistance
-
class GeometryDistance(expr1, expr2, **extra)
Доступность: PostGIS
Принимает два географических поля или выражения и возвращает расстояние между ними. При использовании в операторе order_by(), предоставляет наборы результатов ближайших соседей с поддержкой индексации.
Intersection
-
class Intersection(expr1, expr2, **extra)
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает геометрическое пересечение между ними.
IsEmpty
-
class IsEmpty(expr)
Доступность: PostGIS
Принимает географическое поле или выражение и проверяет, является ли значение пустой геометрией. Возвращает True , если его значение пустое, и False в противном случае.
IsValid
-
class IsValid(expr)
Доступность: MySQL, PostGIS, Oracle, SpatiaLite
Принимает географическое поле или выражение и проверяет, является ли значение правильно сформированной геометрией. Возвращает True , если его значение — допустимая геометрия, и False в противном случае.
Length
-
class Length(expression, spheroid=True, **extra)
Доступность: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite
Принимает одно географическое поле линейной или полилинейной геометрии или выражение и возвращает его длину как меру Distance.
В PostGIS и SpatiaLite, если координаты являются геодезическими (угловыми), вы можете указать, следует ли проводить расчеты на основе простой сферы (менее точная, менее ресурсоемкая) или сфероида (более точная, более ресурсоемкая), используя ключевое слово spheroid.
MySQL не поддерживает вычисления длины для географических систем координат.
LineLocatePoint
-
class LineLocatePoint(linestring, point, **extra)
Доступность: PostGIS, SpatiaLite
Возвращает число с плавающей запятой от 0 до 1, представляющее положение ближайшей точки на linestring к заданной point, как долю длины 2D-линии.
MakeValid
-
class MakeValid(expr)
Доступность: PostGIS, SpatiaLite (LWGEOM/RTTOPO)
Принимает географическое поле или выражение и пытается преобразовать значение в допустимую геометрию, не теряя ни одной из входных вершин. Геометрии, которые уже допустимы, возвращаются без изменений. Простые полигоны могут стать многоугольниками, а результат может быть более низкой размерности, чем входной.
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 возвращает None для любой не-LINESTRING геометрии.
Perimeter
-
class Perimeter(expression, **extra)
Доступность: PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает периметр поля геометрии как объект Distance.
PointOnSurface
-
class PointOnSurface(expression, **extra)
Доступность: PostGIS, MariaDB, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает Point геометрию, гарантированно лежащую на поверхности поля; в противном случае возвращает None.
Reverse
-
class Reverse(expression, **extra)
Доступность: PostGIS, Oracle, SpatiaLite
Принимает одно географическое поле или выражение и возвращает геометрию с обращенными координатами.
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. |
SymDifference
-
class SymDifference(expr1, expr2, **extra)
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает геометрическую симметрическую разность (объединение без пересечения) между заданными параметрами.
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 числовых параметров.
Union
-
class Union(expr1, expr2, **extra)
Доступность: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite
Принимает два географических поля или выражения и возвращает объединение обеих геометрий.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.2/ref/contrib/gis/functions/