GeoDjango Модель API
В этом документе рассматриваются детали GeoDjango Модели API. В этом разделе мы будем использовать следующую географическую модель почтового индекса в качестве примера:
from django.contrib.gis.db import models
class Zipcode(models.Model):
code = models.CharField(max_length=5)
poly = models.PolygonField()
objects = models.GeoManager()
Типы геометрических полей
Каждый из следующих типов геометрических полей соответствует спецификации 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
Параметры геометрических полей
В дополнение к стандартным параметрам полей параметров полей, доступных для полей Django-моделей, геометрические поля имеют следующие дополнительные параметры. Все они являются необязательными.
srid
-
GeometryField.srid
Устанавливает SRID [2] (идентификатор пространственной системы отсчета) поля геометрии заданному значению. По умолчанию используется 4326 (также известный как WGS84, единицы измерения — градусы долготы и широты).
Выбор SRID
Выбор подходящего SRID для вашей модели — важное решение, которое разработчик должен тщательно продумать. SRID — это целое число, которое соответствует системе проекций, которая будет использоваться для интерпретации данных в пространственной базе данных. [3] Системы проекций задают контекст для координат, определяющих местоположение. Хотя детали геодезии выходят за рамки данного документа, общая проблема заключается в том, что Земля имеет форму шара, а представления Земли (например, бумажные карты, веб-карты) не являются таковыми.
Большинство людей знакомы с использованием широты и долготы для указания местоположения на поверхности Земли. Однако широта и долгота — это углы, а не расстояния. [4] Другими словами, в то время как кратчайший путь между двумя точками на плоской поверхности — это прямая линия, кратчайший путь между двумя точками на криволинейной поверхности (например, Земля) — это дуга большого круга. [5] Таким образом, для получения расстояний в плоских единицах (например, километрах и милях) требуется дополнительное вычисление. Использование географической системы координат может привести к осложнениям для разработчика в дальнейшем. Например, Spatialite не имеет возможности выполнять вычисления расстояний между геометриями, использующими географические системы координат, например, построение запроса для поиска всех точек в пределах 5 миль от границ округа, хранящихся в WGS84. [6]
Части земной поверхности могут быть спроецированы на двумерную или декартову плоскость. Проекционные системы координат особенно удобны для приложений, специфичных для региона, например, если вы знаете, что ваша база данных будет охватывать только геометрии в северном Канзасе, то вы можете рассмотреть систему проекций, специфичную для этого региона. Более того, проекционные системы координат определяются в декартовых единицах (например, метрах или футах), что упрощает вычисления расстояний.
Примечание
Если вы хотите выполнить произвольные запросы расстояний, используя неточечные геометрии в WGS84 в PostGIS и вам нужна хорошая производительность, включите ключевое слово GeometryField.geography, чтобы вместо этого использовался тип базы данных географический тип.
Дополнительные ресурсы:
- spatialreference.org: База данных пространственных систем отсчета, работающая на Django.
- Система координат штата: веб-сайт, описывающий различные системы проекций, используемые в США. Большая часть пространственных данных США, с которыми вы столкнетесь, будет в одной из этих систем координат, а не в географической системе координат, такой как WGS84.
spatial_index
-
GeometryField.spatial_index
По умолчанию True. Создаёт пространственный индекс для данного геометрического поля.
Примечание
Это отличается от параметра поля db_index, поскольку пространственные индексы создаются другим способом, чем обычные индексы базы данных. В частности, пространственные индексы обычно создаются с использованием варианта R-дерева, в то время как обычные индексы базы данных обычно используют B-деревья.
dim
-
GeometryField.dim
Этот параметр можно использовать для настройки размерности координат геометрического поля. По умолчанию он равен 2, для представления двумерных геометрий. Для пространственных бэкэндов, которые его поддерживают, он может быть установлен в 3 для поддержки трёхмерных данных.
Примечание
В настоящее время поддержка 3D ограничена пространственным бэкэндом PostGIS.
geography
-
GeometryField.geography
Если установлено значение True, этот параметр создаст столбец базы данных типа geography, а не geometry. Подробнее см. раздел географического типа ниже.
Примечание
Поддержка географии ограничена PostGIS и принудительно установит SRID в 4326.
Географический тип
Тип geography предоставляет встроенную поддержку пространственных объектов, представленных географическими координатами (например, широтой/долготой WGS84). [7] В отличие от плоскости, используемой типом geometry, тип geography использует сферическое представление своих данных. Операции с расстоянием и измерениями, выполняемые над столбцом geography, автоматически используют вычисления дуг больших кругов и возвращают линейные единицы. Другими словами, когда ST_Distance вызывается на двух географических объектах, возвращается значение в метрах (в отличие от градусов, если он вызывается на столбце geometry в WGS84).
Поскольку вычисления с географией включают больше математики, только подмножество пространственных запросов PostGIS доступно для типа geography. Практически это означает, что помимо запросов расстояния, только следующие дополнительные пространственные запросы доступны для географических столбцов:
Дополнительную информацию можно найти в документации PostGIS, где есть полезный раздел о том, когда использовать географический тип данных вместо геометрического .
GeoManager
-
class GeoManager
Для выполнения географических запросов каждая географическая модель требует менеджера модели GeoManager. Этот менеджер позволяет правильно строить SQL-запросы для географических запросов; без него все географические фильтры будут работать неправильно. Также следует отметить, что 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)
objects = models.GeoManager()
Менеджер географических данных нужен для выполнения пространственных запросов на связанных Zipcode объектах, например:
qs = Address.objects.filter(zipcode__poly__contains='POINT(-104.590948 38.319914)')
Примечания
| [1] | OpenGIS Consortium, Inc., Спецификация Simple Feature для SQL. |
| [2] | См. id. в гл. 2.3.8, стр. 39 (Геометрические значения и пространственные системы отсчета). |
| [3] | Обычно, целочисленный идентификатор SRID соответствует идентификатору EPSG (European Petroleum Survey Group). Однако он также может быть связан с пользовательскими проекциями, определёнными в таблице систем пространственной привязки пространственной базы данных. |
| [4] | Гарвардская школа дизайна, Обзор геодезии и систем географической привязки. Это отличный ресурс для обзора принципов, связанных с географическими и декартовыми системами координат. |
| [5] | Терри А. Слоком, Роберт Б. Макмастер, Фриц К. Кеслер и Хью Х. Ховард, Теоматическая картография и визуализация географических данных (Prentice Hall, 2-е издание), в гл. 7.1.3. |
| [6] | Это ограничение не распространяется на PostGIS. |
| [7] | Для получения дополнительной информации обратитесь к документации типа PostGIS Geography. |
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/ref/contrib/gis/model-api/