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]. Для растровых данных такого стандарта не существует.

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] (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.
Вернуться на верх