Spec-Zone.ru › Django 4.2

GeoDjango Модель API

В этом документе рассматриваются детали GeoDjango модели API. В этом разделе мы будем использовать следующую географическую модель: почтовый индекс и цифровую модель рельефа в качестве примеров:

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, чтобы вместо этого использовался тип географической базы данных.

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

  • 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 ниже.

Примечание

Поддержка географии ограничена PostGIS и заставит SRID быть равным 4326.

Тип geography

Тип geography обеспечивает нативную поддержку пространственных объектов, представленных географическими координатами (например, долгота/широта WGS84). [6] В отличие от плоскости, используемой типом geometry, тип geography использует сферическое представление своих данных. Операции по расстоянию и измерениям, выполняемые над столбцом geography, автоматически используют вычисления дуги большого круга и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается на двух географических объектах, возвращается значение в метрах (в отличие от градусов, если вызов выполняется на столбце geometry в WGS84).

Поскольку географические вычисления включают в себя больше математических операций, только подмножество пространственных запросов PostGIS доступно для типа geography. Практически это означает, что помимо запросов на расстояние, только следующие дополнительные пространственные запросы доступны для географических столбцов:

  • 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 Consortium, 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 по типу данных PostGIS Geography здесь.

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

Spec-Zone.ru

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