Spec-Zone.ru › Django 5.2

API моделей GeoDjango

В данном документе рассматриваются подробности 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 [source]

Базовый класс для полей геометрии.

PointField

class PointField [source]

Хранит Point.

LineStringField

class LineStringField [source]

Хранит LineString.

PolygonField

class PolygonField [source]

Хранит Polygon.

MultiPointField

class MultiPointField [source]

Хранит MultiPoint.

MultiLineStringField

class MultiLineStringField [source]

Хранит MultiLineString.

MultiPolygonField

class MultiPolygonField [source]

Хранит MultiPolygon.

GeometryCollectionField

class GeometryCollectionField [source]

Хранит GeometryCollection.

RasterField

class RasterField [source]

Хранит GDALRaster.

RasterField в настоящее время реализован только для бэкенда PostGIS.

Параметры пространственных полей

Помимо обычных параметров полей, доступных для полей модели Django, пространственные поля имеют следующие дополнительные параметры. Все они являются необязательными.

srid

BaseSpatialField.srid

Устанавливает SRID [2] (идентификатор системы пространственных ссылок) поля геометрии на заданное значение. По умолчанию 4326 (также известен как WGS84, единицы измерения — градусы долготы и широты).

Выбор SRID

Выбор подходящего SRID для вашей модели — важное решение, которое разработчик должен тщательно обдумать. SRID — это целочисленный идентификатор, соответствующий проекционной системе, которая будет использоваться для интерпретации данных в пространственной базе данных. [3] Проекционные системы предоставляют контекст координатам, определяющим местоположение. Хотя детали геодезии выходят за рамки этого документа, общая проблема заключается в том, что Земля имеет сферическую форму, а её представления (например, бумажные карты, веб-карты) — нет.

Большинство людей знакомы с использованием широты и долготы для ссылки на местоположение на поверхности Земли. Однако широта и долгота являются углами, а не расстояниями. Другими словами, в то время как кратчайший путь между двумя точками на плоской поверхности — прямая линия, кратчайший путь между двумя точками на криволинейной поверхности (например, Земля) — дуга большого круга. [4] Таким образом, для получения расстояний в плоских единицах (например, километрах и милях) требуется дополнительное вычисление. Использование географической системы координат может привести к осложнениям для разработчика позже. Например, SpatiaLite не имеет возможности выполнять вычисления расстояний между геометриями, использующими географические системы координат, например, построение запроса для поиска всех точек в пределах 5 миль от границ округа, хранящихся в WGS84. [5]

Части поверхности Земли могут быть спроецированы на двумерную, или декартову, плоскость. Проекционные системы координат особенно удобны для приложений, ориентированных на определённый регион, например, если вы знаете, что ваша база данных будет охватывать только геометрии в Северном Канзасе, то вы можете рассмотреть возможность использования проекционной системы, специфичной для этого региона. Кроме того, проекционные системы координат определены в декартовых единицах (таких как метры или футы), что упрощает вычисления расстояний.

Примечание

Если вы хотите выполнить произвольные запросы по расстоянию, используя неточечные геометрии в WGS84 в PostGIS и хотите хорошую производительность, включите ключевое слово GeometryField.geography, чтобы использовался тип базы данных GeometryField.geography вместо него.

Дополнительные ресурсы:

  • spatialreference.org: база данных, управляемая Django, систем пространственных ссылок.
  • Система координат штата: веб-сайт, охватывающий различные проекционные системы, используемые в Соединенных Штатах. Большая часть пространственных данных США будет представлена одной из этих систем координат, а не географической системой координат, такой как WGS84.

spatial_index

BaseSpatialField.spatial_index

По умолчанию True. Создаёт пространственный индекс для данного поля геометрии.

Примечание

Это отличается от опции поля db_index, потому что пространственные индексы создаются другим способом, чем обычные индексы базы данных. В частности, пространственные индексы обычно создаются с использованием варианта R-дерева, а обычные индексы базы данных обычно используют B-деревья.

Параметры поля Geometry

Для полей Geometry доступны дополнительные параметры. Все следующие параметры являются необязательными.

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. Практически это означает, что помимо поиска по расстоянию доступны только следующие дополнительные пространственные запросы для столбцов 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
)

Дополнительную информацию можно найти в документации PostGIS в разделе, посвященном определению использования типа данных geography вместо geometry.

Сноски

[1]

OpenGIS Consortium, Inc., Simple Feature Specification For SQL.

[2]

См. выше в гл. 2.3.8, стр. 39 (Значения геометрии и системы пространственных ссылок).

[3]

Обычно целочисленный SRID соответствует идентификатору EPSG (European Petroleum Survey Group). Однако он также может быть связан с пользовательскими проекциями, определенными в таблице систем пространственных ссылок базы данных.

[4]

Терри А. Слокам, Роберт Б. Макмастер, Фритц К. Кесслер и Хью Х. Ховард, Теоматическая картография и географическая визуализация (Prentice Hall, 2-е издание), в гл. 7.1.3.

[5]

Это ограничение не относится к PostGIS.

[6]

Дополнительные сведения см. в документации PostGIS по типу данных PostGIS Geography.

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

Spec-Zone.ru

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