• 3.1
  • 3.2
  • 5.0
  • Версия документации: 6.1

Функции географических баз данных

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

Например:

>>> from django.contrib.gis.db.models.functions import Length
>>> Track.objects.annotate(length=Length("line")).filter(length__gt=100)

Не все серверные части поддерживают все функции, поэтому обратитесь к документации каждой функции, чтобы узнать, поддерживает ли ваша база данных ту функцию, которую вы хотите использовать. Если вы вызовете географическую функцию на сервере, который ее не поддерживает, вы получите исключение NotImplementedError.

Измерения

Площадь

class Area(expression, **extra)

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

Принимает одно географическое поле или выражение и возвращает площадь поля как меру Area.

MySQL и SpatiaLite без LWGEOM/RTTOPO не поддерживают вычисления площади на географических SRS.

Расстояние

class Distance(expr1, expr2, spheroid=None, **extra)

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

Принимает два географических поля или выражения и возвращает расстояние между ними в виде объекта Distance. В MySQL необработанное значение с плавающей запятой возвращается, когда координаты геодезические.

На серверных модулях, поддерживающих расчет расстояния по геодезическим координатам, соответствующая серверная функция автоматически выбирается в зависимости от значения 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() он предоставляет наборы результатов ближайших соседей с помощью индекса.

Длина

class Length(expression, spheroid=True, **extra)

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

Принимает одно географическое поле или многострочное поле или выражение и возвращает его длину как меру Distance.

В PostGIS и SpatiaLite, когда координаты являются геодезическими (угловыми), вы можете указать, должны ли вычисления основываться на простой сфере (менее точной, менее ресурсоемкой) или на сфероиде (более точной, более ресурсоемкой) с помощью аргумента ключевого слова spheroid.

MySQL не поддерживает вычисления длины для географических SRS.

Периметр

class Perimeter(expression, **extra)

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

Принимает одно географическое поле или выражение и возвращает периметр геометрического поля в виде объекта Distance.

Отношения

Азимут

class Azimuth(point_a, point_b, **extra)

Доступность: PostGIS, SpatiaLite (LWGEOM/RTTOPO)

Возвращает азимут в радианах сегмента, определенного заданной геометрией точки, или «Нет», если две точки совпадают. Азимут представляет собой угол, отсчитываемый от севера, и положителен по часовой стрелке: север = 0; восток = π/2; юг = π; запад = 3π/2.

Ограничивающийкруг

class BoundingCircle(expression, num_seg=48, **extra)

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

Принимает одно географическое поле или выражение и возвращает наименьший круговой многоугольник, который может полностью содержать геометрию.

Параметр num_seg используется только в PostGIS.

Центроид

class Centroid(expression, **extra)

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

Принимает одно географическое поле или выражение и возвращает значение «центроида» геометрии.

Точка Ближайшей

class ClosestPoint(expr1, expr2, **extra)

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

Принимает два географических поля или выражения и возвращает двумерную точку геометрии A, ближайшую к геометрии B.

Конверт

class Envelope(expression, **extra)

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

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

LineLocatePoint

class LineLocatePoint(linestring, point, **extra)

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

Возвращает число с плавающей запятой от 0 до 1, представляющее местоположение ближайшей точки на строке строки к заданной точке в виде доли длины 2D-линии.

ТочкаНаПоверхности

class PointOnSurface(expression, **extra)

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

Принимает одно географическое поле или выражение и возвращает геометрию «Точка», которая гарантированно лежит на поверхности поля; в противном случае возвращает None.

Операции

Разница

class Difference(expr1, expr2, **extra)

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

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

Перекресток

class Intersection(expr1, expr2, **extra)

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

Принимает два географических поля или выражения и возвращает геометрическое пересечение между ними.

SymDifference

class SymDifference(expr1, expr2, **extra)

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

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

Союз

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)

Принимает географическое поле или выражение и пытается преобразовать значение в допустимую геометрию без потери входных вершин. Уже допустимые геометрии возвращаются без изменений. Простые многоугольники могут стать мультиполигонами, и результат может иметь меньшую размерность, чем входные данные.

Реверс

class Reverse(expression, **extra)

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

Принимает одно географическое поле или выражение и возвращает геометрию с обратными координатами.

Повернуть

New in Django 6.0.
class Rotate(expression, angle, origin=None, **extra)

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

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

Масштаб

class Scale(expression, x, y, z=0.0, **extra)

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

Принимает одно географическое поле или выражение и возвращает геометрию с масштабированными координатами, умножая их на параметры «x», «y» и, опционально, «z».

SnapToGrid

class SnapToGrid(expression, *args, **extra)

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

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

Количество аргументов

Описание

1

Единый размер для привязки сеток X и Y.

2

Размеры X и Y для привязки сетки.

4

Размеры X, Y и соответствующие начала координат X, Y.

Трансформировать

class Transform(expression, srid, **extra)

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

Принимает географическое поле или выражение и целочисленный код SRID и возвращает преобразованную геометрию в систему пространственной привязки, указанную параметром srid.

Примечание

Какой системе пространственной привязки соответствует целочисленный SRID, может зависеть от используемой пространственной базы данных. Другими словами, номера SRID, используемые для Oracle, не обязательно совпадают с номерами, используемыми PostGIS.

Перевести

class Translate(expression, x, y, z=0.0, **extra)

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

Принимает одно географическое поле или выражение и возвращает геометрию со смещением координат на числовые параметры x, y и, возможно, z.

Формат ввода

Из WKB

class FromWKB(expression, srid=0, **extra)

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

Создает геометрию из Well-known бинарного (WKB) представления. Необязательный аргумент srid позволяет указать SRID результирующей геометрии. srid игнорируется в Oracle.

Из WKT

class FromWKT(expression, srid=0, **extra)

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

Создает геометрию из представления Well-known text (WKT). Необязательный аргумент srid позволяет указать SRID результирующей геометрии. srid игнорируется в Oracle.

Выходной формат

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]}

Ключевое слово Аргумент

Описание

bbox

Установите для этого параметра значение «True», если вы хотите, чтобы ограничивающая рамка была включена в возвращаемый GeoJSON. Игнорируется в Oracle.

crs

Установите для этого параметра значение «True», если вы хотите, чтобы система координат была включена в возвращаемый GeoJSON. Игнорируется в MySQL и Oracle.

точность

Его можно использовать для указания количества значащих цифр координат в представлении GeoJSON — значение по умолчанию — 8. Игнорируется в Oracle.

АсГМЛ

class AsGML(expression, version=2, precision=8, **extra)

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

Принимает одно географическое поле или выражение и возвращает представление геометрии в формате «Язык географической разметки (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.

АскМЛ

class AsKML(expression, precision=8, **extra)

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

Принимает одно географическое поле или выражение и возвращает представление геометрии в виде языка разметки Keyhole (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)`__.

Ключевое слово Аргумент

Описание

родственник

Если установлено значение «True», данные пути будут реализованы в виде относительных перемещений. По умолчанию установлено значение «False», что означает, что вместо этого используются абсолютные перемещения.

точность

Это ключевое слово можно использовать для указания количества значащих цифр координат в представлении SVG — значение по умолчанию — 8.

АсВКБ

class AsWKB(expression, **extra)

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

Принимает одно географическое поле или выражение и возвращает «хорошо известное двоичное (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@'

АсВКТ

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)'

ГеоХэш

class GeoHash(expression, precision=None, **extra)

Доступность: MariaDB, MySQL, PostGIS, SpatiaLite (LWGEOM/RTTOPO)

Принимает одно географическое поле или выражение и возвращает представление геометрии GeoHash__.

Аргумент ключевого слова precision контролирует количество символов в результате.

Changed in Django 6.0:

Добавлена ​​поддержка MariaDB 12.0.1+.

Разнообразный

IsEmpty

class IsEmpty(expr)

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

Принимает географическое поле или выражение и проверяет, является ли значение пустой геометрией. Возвращает True, если его значение пусто, и False в противном случае.

Действителен

class IsValid(expr)

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

Принимает географическое поле или выражение и проверяет, правильно ли сформировано значение. Возвращает True, если его значение является допустимой геометрией, и False в противном случае.

Changed in Django 6.0:

Добавлена ​​поддержка MariaDB 12.0.1+.

Тип Геометрии

New in Django 6.0.
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 возвращает None для любой геометрии, отличной от LINESTRING.

Back to Top