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]. Для растровых данных такого стандарта не существует.
Поле Геометрии¶
- class GeometryField¶
Базовый класс для полей геометрии.
PointField¶
- class PointField¶
Хранит Point.
LineStringField¶
- class LineStringField¶
Хранит LineString.
ПолигонФилд¶
- class PolygonField¶
Хранит Polygon.
МультиПоинтфилд¶
- class MultiPointField¶
Хранит MultiPoint.
MultiLineStringField¶
- class MultiLineStringField¶
Хранит MultiLineString.
Мультиполигонфилд¶
- class MultiPolygonField¶
Хранит MultiPolygon.
GeometryCollectionField¶
- class GeometryCollectionField¶
Хранит GeometryCollection.
RasterField¶
- class RasterField¶
Хранит GDALRaster.
RasterField в настоящее время реализован только для серверной части PostGIS.
Параметры пространственного поля¶
В дополнение к обычным Параметры поля, доступным для полей модели Django, пространственные поля имеют следующие дополнительные параметры. Все это необязательно.
срид¶
- BaseSpatialField.srid¶
Устанавливает SRID [2] (идентификатор пространственной системы координат) поля геометрии в заданное значение. По умолчанию 4326 (также известное как `WGS84`__, единицы измерения указаны в градусах долготы и широты).
Выбор SRID¶
Выбор подходящего SRID для вашей модели — важное решение, которое разработчик должен тщательно обдумать. SRID — это целочисленный спецификатор, соответствующий системе проекции, которая будет использоваться для интерпретации данных в пространственной базе данных. [3] Системы проекций предоставляют контекст координатам, определяющим местоположение. Хотя детали «геодезии»__ выходят за рамки этой документации, общая проблема заключается в том, что Земля имеет сферическую форму, а ее изображения (например, бумажные карты, веб-карты) — нет.
Большинству людей знакомо использование широты и долготы для обозначения местоположения на поверхности Земли. Однако широта и долгота — это углы, а не расстояния. Другими словами, хотя кратчайший путь между двумя точками на плоской поверхности — это прямая линия, кратчайший путь между двумя точками на изогнутой поверхности (например, на Земле) — это дуга «большого круга»__. [4]
Таким образом, для получения расстояний в плоских единицах (например, километрах и милях) требуются дополнительные вычисления. Использование географической системы координат может в дальнейшем создать сложности для разработчика. Например, SpatiaLite не имеет возможности выполнять расчеты расстояний между геометриями с использованием географических систем координат, например построение запроса для поиска всех точек в пределах 5 миль от границы округа, хранящихся как WGS84. [5]
Части земной поверхности могут быть проецированы на двумерную или декартову плоскость. Системы координат проекции особенно удобны для приложений, специфичных для региона, например, если вы знаете, что ваша база данных будет охватывать геометрию только в «Северном Канзасе»__, тогда вы можете рассмотреть возможность использования системы проекции, специфичной для этого региона. Кроме того, системы координат проекции определяются в декартовых единицах (например, метрах или футах), что упрощает расчет расстояний.
Примечание
Если вы хотите выполнять запросы произвольного расстояния с использованием неточечной геометрии в WGS84 в PostGIS и хотите получить достойную производительность, включите ключевое слово GeometryField.geography, чтобы вместо него использовалось geography type data data.
Дополнительные ресурсы:
`spatialreference.org`__: база данных пространственных систем привязки на базе Django.
`Система координат плоскости штата`__: веб-сайт, посвященный различным проекционным системам, используемым в Соединенных Штатах. Большая часть пространственных данных США будет находиться в одной из этих систем координат, а не в географической системе координат, такой как WGS84.
пространственный_индекс¶
- BaseSpatialField.spatial_index¶
По умолчанию установлено True. Создает пространственный индекс для данного геометрического поля.
Примечание
Это отличается от опции поля db_index, поскольку пространственные индексы создаются иначе, чем обычные индексы базы данных. В частности, пространственные индексы обычно создаются с использованием варианта R-дерева, тогда как обычные индексы базы данных обычно используют B-деревья.
Параметры поля геометрии¶
Для полей геометрии доступны дополнительные параметры. Все следующие параметры являются необязательными.
тусклый¶
- GeometryField.dim¶
Эту опцию можно использовать для настройки координатного размера геометрического поля. По умолчанию для него установлено значение 2 для представления двумерной геометрии. Для пространственных серверов, которые его поддерживают, для трехмерной поддержки можно установить значение 3.
Примечание
В настоящее время поддержка 3D ограничена серверными модулями PostGIS и SpatiaLite.
география¶
- GeometryField.geography¶
Если установлено значение «True», этот параметр создаст столбец базы данных с типом «география», а не «геометрия». Для получения более подробной информации обратитесь к разделу geography type ниже.
Примечание
Поддержка географии ограничена PostGIS и приведет к тому, что SRID будет равен 4326.
Тип географии¶
Тип «география» обеспечивает встроенную поддержку пространственных объектов, представленных географическими координатами (например, долгота/широта WGS84). [6] В отличие от плоскости, используемой типом геометрии, тип географии использует сферическое представление своих данных. Операции измерения расстояний и измерений, выполняемые в столбце географии, автоматически используют вычисления дуги большого круга и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается для двух географических регионов, возвращается значение в метрах (в отличие от градусов, если вызывать столбец геометрии в WGS84).
Поскольку географические вычисления требуют больше математических вычислений, для типа «география» доступна только часть пространственных поисков PostGIS. На практике это означает, что в дополнение к поискам расстояний для географических столбцов доступны только следующие дополнительные пространственные поиски:
обложкипересекается
Если вам нужно использовать пространственный поиск или агрегат, который не поддерживает тип географии в качестве входных данных, вы можете использовать функцию базы данных Cast для преобразования столбца географии в тип геометрии в запросе:
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 есть полезный раздел, посвященный определению того, «когда использовать тип данных «география» вместо типа данных «геометрическая» <https://postgis.net/docs/using_postgis_dbmanagement.html#PostGIS_GeographyVSGeometry>`__.
Сноски