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