GeoDjango Модель API
В этом документе рассматриваются детали API модели GeoDjango. В этом разделе мы будем использовать следующую географическую модель почтового индекса почтового индекса и цифровой модели рельефа в качестве примеров:
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.
- Система координат штата: веб-сайт, описывающий различные системы проекций, используемые в США. Большая часть пространственных данных США будет в одной из этих систем координат, а не в географической системе координат, такой как WGS84.
spatial_index
-
BaseSpatialField.spatial_index
По умолчанию True. Создает пространственный индекс для данного геометрического поля.
Примечание
Это отличается от параметра поля db_index, потому что пространственные индексы создаются другим способом, чем обычные индексы базы данных. В частности, пространственные индексы обычно создаются с помощью варианта R-дерева, а обычные индексы базы данных обычно используют B-деревья.
Параметры геометрических полей
Доступны дополнительные параметры для геометрических полей. Все следующие параметры необязательны.
dim
-
GeometryField.dim
Этот параметр может использоваться для настройки размерности координат геометрического поля. По умолчанию он равен 2 для представления двумерных геометрий. Для пространственных бэкэндов, которые поддерживают это, он может быть установлен в 3 для поддержки трехмерных данных.
Примечание
В настоящее время поддержка 3D ограничена бэкендами PostGIS и SpatiaLite.
geography
-
GeometryField.geography
Если установлено значение True, этот параметр создаст столбец базы данных типа geography, а не geometry. Для получения дополнительной информации см. раздел тип geography ниже.
Примечание
Поддержка geography ограничена PostGIS и заставит SRID быть 4326.
Тип geography
Тип geography предоставляет нативную поддержку пространственных объектов, представленных географическими координатами (например, WGS84 долгота/широта). [6] В отличие от плоскости, используемой типом geometry, тип geography использует сферическое представление своих данных. Операции по расстоянию и измерениям, выполняемые над столбцом geography, автоматически используют вычисления дуг больших кругов и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается для двух объектов geography, возвращается значение в метрах (в отличие от градусов, если вызов выполняется над столбцом geometry в WGS84).
Поскольку вычисления географии включают больше математики, для типа geography доступен только подмножество пространственных запросов PostGIS. Практически это означает, что помимо поиска расстояний, для географических столбцов доступны только следующие дополнительные пространственные запросы:
Если вам нужно использовать пространственный запрос или агрегат, которые не поддерживают тип geography в качестве входных данных, вы можете использовать базу данных Cast для преобразования географического столбца в тип 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)
Для получения дополнительной информации, в документации PostGIS есть полезный раздел о том, когда использовать тип данных geography вместо типа данных geometry.
Примечания
| [1] | Консорциум OpenGIS, Inc., Спецификация простых функций для SQL. |
| [2] | См. id. в гл. 2.3.8, стр. 39 (Значения геометрии и системы пространственных ссылок). |
| [3] | Как правило, целочисленное значение SRID соответствует идентификатору EPSG (European Petroleum Survey Group). Однако оно также может быть связано с пользовательскими проекциями, определенными в таблице систем пространственных ссылок пространственной базы данных. |
| [4] | Terry A. Slocum, Robert B. McMaster, Fritz C. Kessler, & Hugh H. Howard, Теоматическая картография и географическая визуализация (Prentice Hall, 2-е издание), в гл. 7.1.3. |
| [5] | Это ограничение не относится к PostGIS. |
| [6] | Для получения более подробной информации обратитесь к документации по типу данных PostGIS Geography. |
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.1/ref/contrib/gis/model-api/