GeoDjango Модель API
В этом документе рассматриваются подробности 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]
LineStringField
-
class LineStringField[source]
PolygonField
-
class PolygonField[source]
MultiPointField
-
class MultiPointField[source]
MultiLineStringField
-
class MultiLineStringField[source]
MultiPolygonField
-
class MultiPolygonField[source]
GeometryCollectionField
-
class GeometryCollectionField[source]
RasterField
-
class RasterField[source]
RasterField в настоящее время реализован только для бэкенда PostGIS.
Параметры пространственных полей
Параметры геометрического поля srid и spatial_index теперь совместно используются GeometryField и RasterField через BaseSpatialField.
Помимо стандартных параметров параметров полей, доступных для полей модели 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.
geography
-
GeometryField.geography
Если установлено True, этот параметр создаст столбец базы данных типа geography, а не geometry. Подробности см. в разделе тип geography ниже.
Примечание
Поддержка geography ограничена PostGIS и принудительно установит SRID в 4326.
Тип geography
Тип geography предоставляет встроенную поддержку пространственных объектов, представленных географическими координатами (например, долгота/широта WGS84). [6] В отличие от плоскости, используемой типом geometry, тип geography использует сферическое представление данных. Операции вычисления расстояний и измерений, выполняемые над столбцом geography, автоматически используют вычисления по дугам большого круга и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается для двух географических объектов, возвращается значение в метрах (в отличие от градусов, если оно вызывается для столбца geometry в WGS84).
Поскольку географические вычисления включают больше математики, только подмножество пространственных поисков PostGIS доступно для типа geography. Практически это означает, что помимо поиска расстояний, доступны только следующие дополнительные пространственные запросы для столбцов geography:
Для получения дополнительной информации, в документации PostGIS есть полезный раздел о том, когда использовать тип данных geography вместо geometry.
GeoManager
-
class GeoManager[source]
Менеджер GeoManager необходим для использования устаревших методов GeoQuerySet.
Устарело начиная с версии 1.9: Все GeoQuerySet методы устарели и заменены на эквивалентные функции базы данных. Как только устаревшие методы будут заменены в вашем коде, вы сможете удалить специальный GeoManager из ваших GIS-способных классов.
В более старых версиях менеджер был необходим для выполнения географических запросов. Без него все географические фильтры не работали.
GeoManager был необходим даже если модель сама не имела географического поля, например, в случае ForeignKey связи с моделью, содержащей географическое поле. Например, если у нас есть модель Address с ForeignKey связью с нашей моделью Zipcode:
from django.contrib.gis.db import models
class Address(models.Model):
num = models.IntegerField()
street = models.CharField(max_length=100)
city = models.CharField(max_length=100)
state = models.CharField(max_length=2)
zipcode = models.ForeignKey(Zipcode, on_delete=models.CASCADE)
objects = models.GeoManager()
Географический менеджер был необходим для выполнения пространственных запросов по связанным Zipcode объектам, например:
qs = Address.objects.filter(zipcode__poly__contains='POINT(-104.590948 38.319914)')
Примечания
| [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 Geography Type. |
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.9/ref/contrib/gis/model-api/