Spec-Zone.ru › Django 6.0

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 доступны только следующие дополнительные пространственные операции поиска:

  • bboverlaps
  • coveredby
  • covers
  • intersects

Если вам нужно использовать пространственную операцию поиска или агрегатную функцию, не поддерживающую тип 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.

Сноски

[1]

OpenGIS Consortium, Inc., Спецификация простых объектов для SQL.

[2]

Там же., гл. 2.3.8, с. 39 (геометрические значения и системы пространственных координат).

[3]

Как правило, целочисленный SRID соответствует идентификатору EPSG (Европейской группы по исследованию нефти). Однако он также может быть связан с пользовательскими проекциями, определёнными в таблице систем пространственных координат базы данных.

[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]

Подробнее см. в документации «Тип geography в PostGIS».

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/contrib/gis/model-api/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API