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
Базовый класс для геометрических полей.
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-дерева, в то время как обычные индексы базы данных обычно используют 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 включают в себя больше математики, для типа geography доступен только подмножество пространственных поисков 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, 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/2.2/ref/contrib/gis/model-api/