Spec-Zone.ru › Django 1.8

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. Практически это означает, что помимо запросов расстояния, только следующие дополнительные пространственные запросы доступны для географических столбцов:

  • bboverlaps
  • coveredby
  • covers
  • intersects

Дополнительную информацию можно найти в документации 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API