Spec-Zone.ru › Django 4.0

GeoDjango Модель API

В этом документе рассматриваются детали GeoDjango Model 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, этот параметр создаст столбец базы данных типа география, а не геометрия. Подробности см. в разделе тип географии ниже.

Примечание

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

Тип географии

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

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

  • bboverlaps
  • coveredby
  • covers
  • intersects

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

Примечания

[1] Консорциум OpenGIS, Inc., Спецификация простых функций для SQL.
[2] См. id. в гл. 2.3.8, стр. 39 (Значения геометрии и системы пространственных ссылок).
[3] Как правило, целочисленный SRID соответствует идентификатору EPSG (European Petroleum Survey Group). Однако он также может быть связан с пользовательскими проекциями, определенными в таблице систем пространственных ссылок пространственной базы данных.
[4] Терри А. Слокам, Роберт Б. Макмастер, Фриц К. Кеслер и Хью Х. Ховард, Теоматическая картография и визуализация географических данных (Prentice Hall, 2-е издание), в гл. 7.1.3.
[5] Это ограничение не относится к PostGIS.
[6] Для получения более подробной информации см. документацию по типу данных PostGIS Geography.

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

Spec-Zone.ru

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