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