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