API модели GeoDjango
В данном документе описывается 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[source]
Базовый класс для геометрических полей.
PointField
-
class PointField[source]
Хранит Point.
LineStringField
-
class LineStringField[source]
Хранит LineString.
PolygonField
-
class PolygonField[source]
Хранит Polygon.
MultiPointField
-
class MultiPointField[source]
Хранит MultiPoint.
MultiLineStringField
-
class MultiLineStringField[source]
Хранит MultiLineString.
MultiPolygonField
-
class MultiPolygonField[source]
Хранит MultiPolygon.
GeometryCollectionField
-
class GeometryCollectionField[source]
Хранит GeometryCollection.
RasterField
-
class RasterField[source]
Хранит 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-дерева, в то время как обычные индексы базы данных обычно используют B-деревья.
Дополнительные параметры геометрических полей
Доступны дополнительные параметры для геометрических полей. Все следующие параметры необязательны.
dim
-
GeometryField.dim
Этот параметр может использоваться для настройки размерности координат геометрического поля. По умолчанию он равен 2, для представления двумерных геометрий. Для пространственных бэкендов, которые это поддерживают, он может быть установлен в 3 для поддержки трехмерных данных.
Примечание
В настоящее время поддержка 3D ограничена бэкендами PostGIS и SpatiaLite.
geography
-
GeometryField.geography
Если значение установлено в True, этот параметр создаст столбец базы данных типа geography, а не geometry. Подробнее см. раздел тип geography ниже.
Примечание
Поддержка geography ограничена PostGIS и принудительно установит SRID в 4326.
Тип geography
Тип geography предоставляет нативную поддержку пространственных объектов, представленных географическими координатами (например, долгота/широта WGS84). [6] В отличие от плоскости, используемой типом geometry, тип geography использует сферическое представление данных. Операции вычисления расстояний и измерений, выполняемые над столбцом geography, автоматически используют вычисления по дуге большого круга и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается для двух географических объектов, возвращается значение в метрах (в отличие от градусов, если вызов производится для столбца geometry в WGS84).
Поскольку вычисления с географическими объектами включают в себя больше математических операций, для типа geography доступен только подмножество пространственных запросов PostGIS. Практически это означает, что помимо запросов на поиск расстояний поиска расстояний доступны только следующие дополнительные пространственные запросы для столбцов типа geography:
Если вам необходимо использовать пространственный запрос или агрегацию, которые не поддерживают тип geography в качестве входных данных, вы можете использовать базу данных функции Cast, чтобы преобразовать столбец типа geography в тип 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/5.1/ref/contrib/gis/model-api/