API моделей GeoDjango
В этом документе подробно рассматривается API моделей GeoDjango. В этом разделе в качестве примеров будут использоваться следующие географические модели: почтового индекса ZIP и цифровой модели рельефа:
from django.contrib.gis.db import models
class Zipcode(models.Model):
code = models.CharField(max_length=5)
poly = models.PolygonField()
class Elevation(models.Model):
name = models.CharField(max_length=100)
rast = models.RasterField()
Типы пространственных полей
Пространственные поля включают ряд типов геометрических полей и один тип растрового поля. Каждый из типов геометрических полей соответствует спецификации OpenGIS Simple Features [1]. Для растровых данных подобного стандарта нет.
GeometryField
-
class GeometryField[исходный код]
Базовый класс для геометрических полей.
PointField
-
class PointField[исходный код]
Хранит объект Point.
LineStringField
-
class LineStringField[исходный код]
Хранит объект LineString.
PolygonField
-
class PolygonField[исходный код]
Хранит объект Polygon.
MultiPointField
-
class MultiPointField[исходный код]
Хранит объект MultiPoint.
MultiLineStringField
-
class MultiLineStringField[исходный код]
Хранит объект MultiLineString.
MultiPolygonField
-
class MultiPolygonField[исходный код]
Хранит объект MultiPolygon.
GeometryCollectionField
-
class GeometryCollectionField[исходный код]
Хранит объект GeometryCollection.
RasterField
-
class RasterField[исходный код]
Хранит объект GDALRaster.
RasterField в настоящее время реализовано только для бэкенда PostGIS.
Параметры пространственных полей
Помимо обычных параметров полей, доступных для полей моделей Django, у пространственных полей есть следующие дополнительные параметры. Все они необязательны.
srid
-
BaseSpatialField.srid
Задаёт SRID [2] (идентификатор системы пространственных координат) для геометрического поля. По умолчанию используется значение 4326 (также известное как WGS84; единицы измерения — градусы долготы и широты).
Выбор SRID
Выбор подходящего SRID для модели — важное решение, которое разработчику следует тщательно обдумать. SRID — это целочисленный идентификатор системы проецирования, которая будет использоваться для интерпретации данных в пространственной базе данных. [3] Системы проецирования задают контекст для координат, определяющих местоположение. Хотя подробное рассмотрение геодезии выходит за рамки этой документации, основная проблема заключается в том, что Земля имеет сферическую форму, а её изображения (например, бумажные карты и веб-карты) — нет.
Большинство людей привыкли указывать местоположение на поверхности Земли с помощью широты и долготы. Однако широта и долгота — это углы, а не расстояния. Иными словами, если кратчайший путь между двумя точками на плоской поверхности — прямая, то кратчайший путь между двумя точками на искривлённой поверхности (например, на Земле) — это дуга большого круга. [4]
Поэтому для вычисления расстояний в плоских единицах (например, в километрах и милях) требуются дополнительные вычисления. Использование географической системы координат может впоследствии вызвать затруднения у разработчика. Например, SpatiaLite не умеет вычислять расстояния между геометриями в географических системах координат. Так, нельзя составить запрос для поиска всех точек в пределах 5 миль от границы округа, заданной в WGS84. [5]
Участки поверхности Земли можно проецировать на двумерную, или декартову, плоскость. Проецированные системы координат особенно удобны для приложений, ориентированных на конкретный регион. Например, если известно, что база данных будет содержать геометрические объекты только в Северном Канзасе, можно рассмотреть систему проецирования, предназначенную для этого региона. Кроме того, проецированные системы координат используют декартовы единицы измерения (например, метры или футы), что упрощает вычисление расстояний.
Примечание
Если вы хотите выполнять произвольные запросы расстояния для геометрий, отличных от точек, в WGS84 с помощью PostGIS и рассчитываете на хорошую производительность, включите ключевое слово GeometryField.geography, чтобы использовать тип данных geography.
Дополнительные ресурсы:
- spatialreference.org: база данных пространственных систем координат на базе Django.
- Система координат State Plane: сайт с описанием различных систем проецирования, используемых в США. Большинство пространственных данных США встречаются именно в одной из этих систем координат, а не в географической системе, например WGS84.
spatial_index
-
BaseSpatialField.spatial_index
По умолчанию — True. Создаёт пространственный индекс для указанного геометрического поля.
Примечание
Это отличается от параметра поля db_index, поскольку пространственные индексы создаются не так, как обычные индексы базы данных. В частности, для пространственных индексов обычно используется разновидность R-дерева, тогда как для обычных индексов баз данных, как правило, используются B-деревья.
Параметры геометрических полей
Для геометрических полей доступны дополнительные параметры. Все перечисленные ниже параметры необязательны.
dim
-
GeometryField.dim
Этот параметр позволяет настроить размерность координат геометрического поля. По умолчанию значение равно 2, что соответствует двумерным геометрическим объектам. Для пространственных бэкендов, поддерживающих эту возможность, можно задать значение 3 для поддержки трёх измерений.
Примечание
На данный момент поддержку 3D обеспечивают только бэкенды PostGIS и SpatiaLite.
geography
-
GeometryField.geography
Если задано значение True, вместо столбца типа geometry будет создан столбец базы данных типа geography. Подробнее см. в разделе Тип geography ниже.
Примечание
Тип geography поддерживается только в PostGIS и требует, чтобы SRID был равен 4326.
Тип geography
Тип geography обеспечивает встроенную поддержку пространственных объектов, заданных географическими координатами (например, долготой и широтой WGS84). [6] В отличие от плоскости, используемой типом geometry, тип geography представляет данные на сфере. Операции вычисления расстояний и измерений для столбца geography автоматически используют расчёты по дуге большого круга и возвращают линейные единицы измерения. Иными словами, при вызове ST_Distance для двух объектов geography возвращается значение в метрах (в отличие от градусов, которые возвращаются при вызове для столбца geometry в WGS84).
Поскольку вычисления для geography требуют более сложных математических операций, для этого типа доступно лишь подмножество пространственных операций поиска PostGIS. На практике это означает, что помимо операций поиска по расстоянию для столбцов geography доступны только следующие дополнительные пространственные операции поиска:
Если вам нужно использовать пространственную операцию поиска или агрегатную функцию, не поддерживающую тип geography в качестве входных данных, воспользуйтесь функцией базы данных Cast, чтобы преобразовать столбец geography в тип geometry в запросе:
from django.contrib.gis.db.models import PointField
from django.db.models.functions import Cast
Zipcode.objects.annotate(geom=Cast("geography_field", PointField())).filter(
geom__within=poly
)
Подробнее о том, когда следует использовать тип данных geography вместо типа geometry, можно узнать в соответствующем разделе документации PostGIS.
Сноски
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/contrib/gis/model-api/