Spec-Zone.ru › Django 5.0

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

  • bboverlaps
  • coveredby
  • covers
  • intersects

Если вам нужно использовать пространственный поиск или агрегирование, которое не поддерживает тип 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 (Европейская группа по обзору нефтяных месторождений). Однако он также может быть связан с пользовательскими проекциями, определенными в таблице систем пространственных ссылок пространственной базы данных.
[4] Terry A. Slocum, Robert B. McMaster, Fritz C. Kessler, & Hugh H. Howard, Теоматическая картография и визуализация географических данных (Prentice Hall, 2-е издание), в гл. 7.1.3.
[5] Это ограничение не относится к PostGIS.
[6] Для получения более подробной информации см. документацию PostGIS Geography Type.

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

Spec-Zone.ru

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