API форм GeoDjango¶
GeoDjango предоставляет несколько специализированных полей форм и виджетов для визуального отображения и редактирования геолокализованных данных на карте. По умолчанию они используют карты на базе OpenLayers, а базовый слой WMS предоставлен NASA.
Аргументы поля¶
В дополнение к обычным аргументам полей формы, поля формы GeoDjango принимают следующие необязательные аргументы.
срид¶
- Field.srid¶
Это код SRID, в который должно быть преобразовано значение поля. Например, если SRID виджета карты отличается от SRID, обычно используемого вашим приложением или базой данных, поле автоматически преобразует входные значения в этот SRID.
geom_type¶
- Field.geom_type¶
Обычно вам не нужно устанавливать или изменять этот атрибут, который должен быть настроен в зависимости от класса поля. Оно соответствует имени стандартной геометрии OpenGIS.
Классы полей формы¶
Поле Геометрии¶
- class GeometryField¶
PointField¶
- class PointField¶
LineStringField¶
- class LineStringField¶
ПолигонФилд¶
- class PolygonField¶
МультиПоинтфилд¶
- class MultiPointField¶
MultiLineStringField¶
- class MultiLineStringField¶
Мультиполигонфилд¶
- class MultiPolygonField¶
GeometryCollectionField¶
- class GeometryCollectionField¶
Виджеты форм¶
Виджеты форм GeoDjango позволяют отображать и редактировать географические данные на визуальной карте. Обратите внимание, что ни один из доступных на данный момент виджетов не поддерживает 3D-геометрию, поэтому поля геометрии будут использовать виджет Textarea для таких данных.
Атрибуты виджета¶
Виджеты GeoDjango основаны на шаблонах, поэтому их атрибуты в основном отличаются от других атрибутов виджетов Django.
- BaseGeometryWidget.base_layer¶
- New in Django 6.0.
Строка, задающая идентификатор слоя базовой карты по умолчанию, который будет использоваться соответствующим виджетом карты JavaScript. Он передается как часть параметров виджета при рендеринге, позволяя MapWidget определить, какой поставщик тайлов карты или базовый слой инициализировать (по умолчанию — None).
- BaseGeometryWidget.geom_type¶
Тип геометрии OpenGIS, обычно задаваемый полем формы.
- BaseGeometryWidget.map_srid¶
Код SRID, используемый картой (по умолчанию — 4326).
- BaseGeometryWidget.display_raw¶
Логическое значение, указывающее, виден ли ввод текстовой области, показывающий сериализованное представление текущей геометрии, в основном для целей отладки (по умолчанию — «False»).
- BaseGeometryWidget.supports_3d¶
Указывает, поддерживает ли виджет редактирование 3D-данных (по умолчанию — «False»).
- BaseGeometryWidget.template_name¶
Шаблон, используемый для отображения виджета карты.
Вы можете передавать атрибуты виджета так же, как и для любого другого виджета Django. Например:
from django.contrib.gis import forms
class MyGeoForm(forms.Form):
point = forms.PointField(widget=forms.OSMWidget(attrs={"display_raw": True}))
Классы виджетов¶
BaseGeometryWidget
- class BaseGeometryWidget¶
Это абстрактный базовый виджет, содержащий логику, необходимую для подклассов. Вы не можете напрямую использовать этот виджет для геометрического поля. Обратите внимание, что рендеринг виджетов GeoDjango основан на имени базового слоя, определяемом атрибутом класса
base_layer.
OpenLayersWidget
- class OpenLayersWidget¶
Это виджет по умолчанию, используемый всеми полями формы GeoDjango. Атрибуты:
- base_layer¶
- New in Django 6.0.
NASAWorldview
- template_name¶
gis/openlayers.html.
- map_srid¶
3857
OpenLayersWidget и :class:OSMWidget включают файлы ol.js и ol.css, размещенные в сети доставки контента cdn.jsdelivr.net. Эти файлы можно переопределить, создав подкласс виджета и установив свойства js и css внутреннего класса Media (см. Определение статических файлов).
Внешние активы с CSP
Когда
ContentSecurityPolicyMiddlewareвключен, ресурсы OpenLayers CDN по умолчанию (ol.jsиol.css) будут заблокированы, если это явно не разрешено. Эту проблему можно решить одним из двух способов: обслуживать ресурсы локально путем создания подкласса виджета и предоставления локальных копий файлов JavaScript и CSS или разрешить CDN в политике CSP.Например, чтобы разрешить базовый слой NASA Worldview по умолчанию (замените
x.y.zактуальной версией):from django.utils.csp import CSP SECURE_CSP = { "default-src": [CSP.SELF], "script-src": [CSP.SELF, "https://cdn.jsdelivr.net/npm/ol@x.y.z/dist/ol.js"], "style-src": [CSP.SELF, "https://cdn.jsdelivr.net/npm/ol@x.y.z/ol.css"], "img-src": [CSP.SELF, "https://*.earthdata.nasa.gov"], }
OSMWidget
- class OSMWidget¶
Этот виджет специализируется на
OpenLayersWidgetи использует базовый слой OpenStreetMap для отображения географических объектов. Атрибуты:- base_layer¶
- New in Django 6.0.
осм
- default_lat¶
- default_lon¶
Центральная широта и долгота по умолчанию — «47» и «5» соответственно, это местоположение на востоке Франции.
- default_zoom¶
Масштаб карты по умолчанию — «12».
Примечание
OpenLayersWidgetоб использовании внешних ресурсов также применимо и здесь. См. также ответ на часто задаваемые вопросы о доступе по протоколу https к фрагментам карты.Плитки OpenStreetMap с CSP
Этот виджет использует плитки OpenStreetMap вместо NASA Worldview. Если Политика безопасности контента включен, должны быть разрешены как ресурсы OpenLayers CDN (как того требует
OpenLayersWidget), так и серверы тайлов OpenStreetMap:from django.utils.csp import CSP SECURE_CSP = { # other directives "img-src": [CSP.SELF, "https://tile.openstreetmap.org"], }
Changed in Django 6.0:OSMWidget больше не использует собственный шаблон. Следовательно, шаблон gis/openlayers-osm.html был удален.
Настройка базового слоя, используемого в виджетах на основе OpenLayers¶
Чтобы настроить базовый слой, отображаемый в геометрических виджетах на основе OpenLayers, определите новый построитель слоев в пользовательском файле JavaScript. Например:
путь к файлу.js¶ MapWidget.layerBuilder.custom_layer_name = function () {
// Return an OpenLayers layer instance.
return new ol.layer.Tile({source: new ol.source.<ChosenSource>()});
};
Затем создайте подкласс стандартного геометрического виджета и установите base_layer:
from django.contrib.gis.forms.widgets import OpenLayersWidget
class YourCustomWidget(OpenLayersWidget):
base_layer = "custom_layer_name"
class Media:
js = ["path-to-file.js"]