API модели GeoDjango¶
В этом документе рассматриваются детали API модели GeoDjango. В этом разделе мы будем использовать в качестве примеров следующие географические модели ZIP code и Digital Elevation Model:
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]. Для растровых данных такого стандарта не существует.
RasterField
¶
-
class
RasterField
¶
Сохраняет значение GDALRaster
.
RasterField
в настоящее время реализовано только для бэкенда PostGIS.
Параметры пространственного поля¶
В дополнение к обычным Опции полей, доступным для полей модели Django, пространственные поля имеют следующие дополнительные опции. Все они являются необязательными.
srid
¶
-
BaseSpatialField.
srid
¶
Устанавливает SRID [2] (Spatial Reference System Identity) геометрического поля на заданное значение. Значение по умолчанию равно 4326 (также известно как WGS84, единицы измерения - градусы долготы и широты).
Выбор SRID¶
Выбор подходящего SRID для вашей модели - это важное решение, которое разработчик должен тщательно продумать. SRID - это целочисленный спецификатор, соответствующий системе проекций, которая будет использоваться для интерпретации данных в пространственной базе данных. [3] Системы проекций придают контекст координатам, определяющим местоположение. Хотя детали geodesy выходят за рамки данной документации, общая проблема заключается в том, что Земля сферическая, а представления Земли (например, бумажные карты, веб-карты) - нет.
Большинство людей знакомы с использованием широты и долготы для определения местоположения на земной поверхности. Однако широта и долгота - это углы, а не расстояния. Другими словами, если кратчайший путь между двумя точками на плоской поверхности - это прямая линия, то кратчайший путь между двумя точками на изогнутой поверхности (такой как Земля) - это *дуга great circle. [4] Таким образом, для получения расстояний в плоскостных единицах (например, километрах и милях) требуются дополнительные вычисления. Использование географической системы координат может в дальнейшем создать сложности для разработчика. Например, SpatiaLite не имеет возможности выполнять вычисления расстояний между геометриями, использующими географические системы координат, например, построить запрос для поиска всех точек в пределах 5 миль от границы округа, сохраненной как WGS84. [5]
Части земной поверхности могут проецироваться на двухмерную, или декартову, плоскость. Проецируемые системы координат особенно удобны для приложений, ориентированных на конкретный регион, например, если вы знаете, что ваша база данных будет охватывать только геометрию в North Kansas, то вы можете рассмотреть возможность использования системы проекций, специфичной для этого региона. Более того, проецируемые системы координат определены в декартовых единицах (таких как метры или футы), что облегчает вычисления расстояний.
Примечание
Если вы хотите выполнять произвольные запросы расстояний с использованием неточечных геометрий в WGS84 в PostGIS и хотите получить достойную производительность, включите ключевое слово GeometryField.geography
, чтобы вместо него использовалось geography database type.
Дополнительные ресурсы:
- spatialreference.org: База данных пространственных систем координат на основе Django.
- The State Plane Coordinate System: Веб-сайт, посвященный различным системам проекций, используемым в США. Большая часть пространственных данных США будет представлена в одной из этих систем координат, а не в географической системе координат, такой как WGS84.
spatial_index
¶
-
BaseSpatialField.
spatial_index
¶
По умолчанию имеет значение True
. Создает пространственный индекс для заданного геометрического поля.
Примечание
Это отличается от опции поля db_index
тем, что пространственные индексы создаются иначе, чем обычные индексы баз данных. В частности, пространственные индексы обычно создаются с использованием варианта R-дерева, в то время как обычные индексы баз данных обычно используют B-деревья.
Параметры поля геометрии¶
Для полей Geometry доступны дополнительные опции. Все следующие параметры являются необязательными.
dim
¶
-
GeometryField.
dim
¶
Этот параметр можно использовать для настройки размерности координат поля геометрии. По умолчанию он имеет значение 2 для представления двумерных геометрий. Для пространственных бэкендов, которые поддерживают это, он может быть установлен в значение 3 для поддержки трехмерной геометрии.
Примечание
В настоящее время поддержка 3D ограничена бэкендами PostGIS и SpatiaLite.
geography
¶
-
GeometryField.
geography
¶
Если установлено значение True
, этот параметр создаст колонку базы данных типа география, а не геометрия. Пожалуйста, обратитесь к разделу geography type ниже для получения более подробной информации.
Примечание
Поддержка географии ограничена PostGIS и заставляет SRID быть равным 4326.
Тип географии¶
Тип geography обеспечивает встроенную поддержку пространственных характеристик, представленных географическими координатами (например, долгота/широта WGS84). [6] В отличие от плоскости, используемой типом геометрии, тип географии использует сферическое представление своих данных. Операции измерения расстояний и измерений, выполняемые на графе географии, автоматически используют вычисления дуги большого круга и возвращают линейные единицы. Другими словами, при вызове ST_Distance
на двух географиях возвращается значение в метрах (в отличие от градусов при вызове на колонке геометрии в WGS84).
Поскольку в географических расчетах используется больше математики, только часть пространственных поисков PostGIS доступна для географического типа. Практически это означает, что в дополнение к distance lookups для столбцов географии доступны только следующие дополнительные spatial lookups:
Если вам необходимо использовать пространственный поиск или агрегат, который не поддерживает тип географии в качестве входных данных, вы можете использовать функцию базы данных Cast
для преобразования столбца географии в тип геометрии в запросе:
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 есть полезный раздел об определении when to use geography data type over geometry data type.
Сноски
[1] | Консорциум OpenGIS, Inc., Simple Feature Specification For 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, Thematic Cartography and Geographic Visualization (Prentice Hall, 2-е издание), в гл. 7.1.3. |
[5] | Это ограничение не распространяется на PostGIS. |
[6] | Для получения более подробной информации обратитесь к документации PostGIS Geography Type. |