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-Tree, тогда как обычные индексы базы данных обычно используют B-Trees.
Параметры геометрических полей
Для геометрических полей доступны дополнительные параметры. Все следующие параметры необязательны.
dim
-
GeometryField.dim
Этот параметр может использоваться для настройки размерности координат геометрического поля. По умолчанию он установлен в 2, для представления двумерных геометрий. Для пространственных бэкэндов, которые это поддерживают, он может быть установлен в 3 для трехмерной поддержки.
Примечание
В настоящее время поддержка 3D ограничена пространственным бэкэндом PostGIS.
geography
-
GeometryField.geography
Если установлено значение True, этот параметр создаст столбец базы данных типа geography вместо geometry. Обратитесь к разделу тип geography ниже для получения дополнительной информации.
Примечание
Поддержка географии ограничена PostGIS и заставит SRID быть равным 4326.
Тип geography
Тип geography предоставляет встроенную поддержку пространственных объектов, представленных географическими координатами (например, WGS84 долгота/широта). [6] В отличие от плоскости, используемой типом geometry, тип geography использует сферическое представление своих данных. Операции расстояния и измерения, выполняемые со столбцом geography, автоматически применяют вычисления дуг больших кругов и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается для двух географий, возвращается значение в метрах (в отличие от градусов, если оно вызывается для столбца geometry в WGS84).
Поскольку вычисления geography включают больше математических операций, только часть пространственных запросов PostGIS доступна для типа geography. Практически это означает, что помимо запросов на расстояние, только следующие дополнительные пространственные запросы доступны для столбцов 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, Inc., Спецификация простых функций для SQL. |
| [2] | См. id. в гл. 2.3.8, стр. 39 (Значения геометрии и системы пространственных координат). |
| [3] | Как правило, целочисленный идентификатор SRID соответствует идентификатору EPSG (Европейской группе по исследованиям нефти). Однако он также может быть связан с пользовательскими проекциями, определенными в таблице систем пространственных координат пространственной базы данных. |
| [4] | Терри А. Слокам, Роберт Б. Макмастер, Фриц К. Кесслер и Хью Х. Ховард, Тематическая картография и географическая визуализация (Прентис Холл, 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/2.1/ref/contrib/gis/model-api/