API моделей GeoDjango
В этом документе рассматриваются детали API моделей GeoDjango. В этом разделе мы будем использовать следующую географическую модель почтового индекса (ZIP code) и цифровой модели рельефа (Digital Elevation Model) в качестве примеров:
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
LineStringField
-
class LineStringField
PolygonField
-
class PolygonField
MultiPointField
-
class MultiPointField
MultiLineStringField
-
class MultiLineStringField
MultiPolygonField
-
class MultiPolygonField
GeometryCollectionField
-
class GeometryCollectionField
RasterField
-
class RasterField
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.
geography
-
GeometryField.geography
Если установлено значение True, этот параметр создаст столбец базы данных типа geography, а не geometry. Подробнее см. раздел тип географии ниже.
Примечание
Поддержка географии ограничена 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 есть полезный раздел о том, как определить когда использовать тип данных географии вместо типа данных геометрии.
GeoManager
-
class GeoManager
GeoManager необходим для использования устаревших методов GeoQuerySet.
Устаревшее начиная с версии 1.9: Все методы GeoQuerySet устарели и были заменены на эквивалентные функции базы данных. Как только устаревшие методы будут заменены в вашем коде, вы сможете удалить специальные GeoManager из ваших классов, поддерживающих ГИС.
Примечания
| [1] | OpenGIS Consortium, Inc., Проект спецификации простых объектов для SQL. |
| [2] | См. id в главе 2.3.8, стр. 39 (Значения геометрии и системы пространственных ссылок). |
| [3] | Обычно целое число SRID соответствует идентификатору EPSG (Европейская группа по исследованию нефти). Однако оно также может быть связано с пользовательскими проекциями, определенными в таблице систем пространственных ссылок пространственной базы данных. |
| [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/1.11/ref/contrib/gis/model-api/