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

класс GeometryField

Базовый класс для полей геометрии.

PointField

класс PointField

Магазины а Point.

LineStringField

класс LineStringField

Магазины а LineString.

PolygonField

класс PolygonField

Магазины а Polygon.

MultiPointField

класс MultiPointField

Магазины а MultiPoint.

MultiLineStringField

класс MultiLineStringField

Магазины а MultiLineString.

MultiPolygonField

класс MultiPolygonField

Магазины а MultiPolygon.

GeometryCollectionField

класс GeometryCollectionField

Магазины а GeometryCollection.

RasterField

класс 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 .

Дополнительные ресурсы:

  • Spacereference.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. Пожалуйста, обратитесь к разделу типа географии ниже для более подробной информации.

Примечание

Поддержка географии ограничена PostGIS, поэтому SRID будет равен 4326.

Тип географии

Тип geography обеспечивает встроенную поддержку пространственных функций, представленных географическими координатами (например, долгота / широта WGS84). [6] В отличие от плоскости, используемой типом геометрии, тип geography использует сферическое представление своих данных. Операции измерения расстояния и измерения, выполняемые в географическом столбце, автоматически используют вычисления дуги большого круга и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается для двух географических регионов, возвращается значение в метрах (в отличие от градусов, если вызывается в столбце геометрии в WGS84).

Поскольку вычисления географии включают больше математики, только часть пространственных поисков PostGIS доступна для типа geography. Фактически это означает, что в дополнение к поискам расстояния для столбцов географии доступны только следующие дополнительные пространственные поиски :

Если вам нужно использовать пространственный поиск или агрегат, который не поддерживает тип geography в качестве входных данных, вы можете использовать Castфункцию базы данных для преобразования столбца geography в тип геометрии в запросе:

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 ( European Petroleum Survey Group ). Однако он также может быть связан с пользовательскими проекциями, определенными в таблице систем пространственной привязки базы данных.
[4]Терри А. Слокум, Роберт Б. Макмастер, Фриц К. Кесслер и Хью Х. Ховард, Тематическая картография и географическая визуализация (Прентис Холл, 2-е издание), в гл. 7.1.3.
[5]Это ограничение не распространяется на PostGIS.
[6]Пожалуйста, обратитесь к документации PostGIS Geography Type для получения более подробной информации.

Copyright ©2021 All rights reserved