API модели GeoDjango

Этот документ представляет подробную информацию об 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

класс GeometryField

Базовый класс для полей геометрического типа.

PointField

класс PointField

Магазины а Point .

LineStringField

класс LineStringField

Магазины а LineString .

PolygonField

класс PolygonField

Магазины а Polygon .

MultiPointField

класс MultiPointField

Магазины а MultiPoint .

MultiLineStringField

класс MultiLineStringField

Магазины а MultiLineString .

MultiPolygonField

класс MultiPolygonField

Магазины а MultiPolygon .

GeometryCollectionField

класс GeometryCollectionField

Магазины а GeometryCollection .

RasterField

класс RasterField

Магазины а GDALRaster .

RasterField в настоящее время реализован только для движка PostGIS.

Параметры пространственного поля

В дополнение к параметрам поля, обычно доступным для полей модели Django, пространственные поля имеют следующие дополнительные параметры. Все не обязательны.

srid

BaseSpatialField.srid

Устанавливает SRID [2] (идентификатор системы пространственной привязки ) геометрического поля на указанное значение. По умолчанию - 4326 (также известный как WGS84 , единицы измерения - градусы долготы и широты).

Выбор SRID

Выбор подходящего SRID для модели - важное решение, которое разработчик должен тщательно рассмотреть. SRID - это целое число, соответствующее системе проецирования, которая будет использоваться для интерпретации данных в пространственной базе данных. [3] Системы проецирования дают контекст координат, определяющих местоположение. Хотя детали геодезии выходят за рамки данной документации, общая проблема заключается в том, что Земля имеет сферическую форму, а ее изображения (например, бумажные карты, веб-карты) - нет.

Большинство людей знакомы с использованием широты и долготы для обозначения местоположения на поверхности Земли. Однако широта и долгота - это углы, а не расстояния. Другими словами, в то время как кратчайший путь между двумя точками на плоской поверхности , представляет собой прямую линию, кратчайший путь между двумя точками на кривой поверхности (например, Земли) представляет собой дугу из большого круг . [4]Поэтому необходимо выполнить дополнительные вычисления для получения расстояний в плоских единицах (километрах или милях). Использование географической системы координат может в дальнейшем вызвать сложности для разработчика. Например, SpatiaLite не может рассчитывать расстояния между геометрическими объектами, выраженными в географической системе координат. Например, создание запроса для поиска всех точек в пределах 5 км от границ отдела, хранящихся в координатах WGS84. [5]

Части земной поверхности можно проецировать на двумерную или декартову плоскость. Системы координат проекции особенно подходят для приложений, специфичных для региона. Например, если вы знаете, что ваша база данных будет содержать только геометрические объекты из Северного Канзаса , вы можете рассмотреть возможность использования системы проекции, специфичной для этого региона. Кроме того, системы координат проекции определены в декартовых единицах (например, метрах или футах), что упрощает вычисление расстояний.

Заметка

Если вы хотите выполнять произвольные дистанционные запросы с геометрическими объектами, отличными от точек в WSG84 с PostGIS, с приличной производительностью, установите ключевое слово GeometryField.geography так, чтобы использовалось географическое положение типа данных .

Дополнительные ресурсы:

  • Spacereference.org : база данных систем пространственной привязки, запрограммированная на Django.
  • Государственная система координат самолета : веб-сайт, на котором представлены различные проекционные системы, используемые в Соединенных Штатах. Большая часть существующих пространственных данных США находится в одной из этих систем координат, а не в географической системе координат, такой как WGS84.

spatial_index

BaseSpatialField.spatial_index

По умолчанию это True . Создает пространственный индекс для данного геометрического поля.

Заметка

Это отличается от варианта поля, db_index потому что пространственные индексы создаются иначе, чем обычные индексы базы данных. В частности, пространственные индексы обычно создаются с использованием варианта R-Tree, тогда как обычные индексы обычно используют алгоритм B-Tree.

Параметры геометрического поля

У геометрических полей есть дополнительные параметры. Все следующие параметры необязательны.

dim

GeometryField.dim

Этот параметр можно использовать для настройки координатных размеров поля геометрии. По умолчанию существует два измерения для представления геометрических объектов в 2D. Для космических двигателей, которые управляют им, можно установить для этого параметра значение 3 для поддержки 3D.

Заметка

В настоящее время 3D поддерживают только космические движки PostGIS и SpatiaLite.

geography

GeometryField.geography

Если установлено значение True , этот параметр создает столбец базы данных географического типа, а не геометрического. См. Более подробную информацию в разделе географического типа ниже.

Заметка

Для поддержки географического типа требуется 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 есть информативный раздел о том, как определить, когда использовать географический тип данных вместо геометрического типа .

Сноски

[1]Консорциум OpenGIS, Inc., Простая спецификация функций для SQL .
[2]Там же. , гл. 2.3.8, п. 39 (Геометрические значения и пространственные системы отсчета).
[3]Целые числа SRID обычно соответствуют идентификаторам EPSG ( European Petroleum Survey Group ). Однако они также могут быть связаны с пользовательскими проекциями, определенными в таблице систем пространственной привязки пространственной базы данных.
[4]Терри А. Слокам, Роберт Б. Макмастер, Фриц К. Кесслер и Хью Х. Ховард, Тематическая картография и географическая визуализация (Прентис Холл, 2-е издание), гл. 7.1.3.
[5]Это ограничение не распространяется на PostGIS.
[6]Пожалуйста, обратитесь к документации по географическому типу PostGIS за подробностями.

Copyright ©2020 All rights reserved