Spec-Zone.ru › Django 3.2

GeoDjango Модель API

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

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

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

Если вам нужно использовать пространственный поиск или агрегацию, которые не поддерживают тип 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] См. раздел 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/3.2/ref/contrib/gis/model-api/

Spec-Zone.ru

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