GeoDjango Модель API
В этом документе рассматриваются детали GeoDjango Модель API. В этом разделе мы будем использовать следующую географическую модель почтового индекса почтового индекса и цифровой модели рельефа в качестве примеров:
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, чтобы вместо этого использовался тип географической базы данных тип базы данных 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 ниже.
Примечание
Поддержка географии ограничена PostGIS и заставит SRID быть равным 4326.
Тип geography
Тип geography обеспечивает встроенную поддержку пространственных объектов, представленных географическими координатами (например, долгота/широта WGS84). [6] В отличие от плоскости, используемой типом geometry, тип geography использует сферическое представление своих данных. Операции вычисления расстояний и измерений, выполняемые над столбцом geography, автоматически используют вычисления дуги большого круга и возвращают линейные единицы. Другими словами, когда ST_Distance применяется к двум географическим объектам, возвращается значение в метрах (в отличие от градусов, если это применяется к геометрическому столбцу в WGS84).
Поскольку вычисления с географией включают в себя больше математики, только подмножество пространственных поисков PostGIS доступно для типа geography. Практически это означает, что помимо поисков по расстоянию, доступны только следующие дополнительные пространственные поиски для географических столбцов:
Если вам нужно использовать пространственный поиск или агрегирование, которое не поддерживает тип geography в качестве входных данных, вы можете использовать функцию базы данных Cast для преобразования столбца geography в тип 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 Consortium, Inc., Спецификация Simple Feature для SQL. |
| [2] | См. выше в гл. 2.3.8, стр. 39 (Значения геометрии и системы пространственных ссылок). |
| [3] | Обычно целое число SRID соответствует идентификатору EPSG (European Petroleum Survey Group). Однако оно также может быть связано с пользовательскими проекциями, определёнными в таблице систем пространственной привязки пространственной базы данных. |
| [4] | Terry A. Slocum, Robert B. McMaster, Fritz C. Kessler, & Hugh H. Howard, Теоматическая картография и визуализация географических данных (Prentice Hall, 2-е издание), гл. 7.1.3. |
| [5] | Это ограничение не распространяется на PostGIS. |
| [6] | Для получения более подробной информации обратитесь к документации Тип географии PostGIS. |
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/ref/contrib/gis/model-api/