Руководство по GeoDjango ¶
Введение ¶
GeoDjango - это встроенный модуль contrib для Django, который превращает его в географический веб-фреймворк мирового класса. GeoDjango стремится максимально упростить создание географических веб-приложений, таких как службы, основанные на местоположении. Его особенности включают в себя:
- Поля модели Django для геометрии OGC и растровых данных.
- Расширения ORM Django для запросов и управления пространственными данными.
- Слабосвязанные высокоуровневые интерфейсы Python для геометрических и растровых операций ГИС, а также для обработки данных в различных форматах.
- Редактирование полей геометрии из админки.
Это руководство предполагает знакомство с Django; Таким образом, если вы новичок в Django, пожалуйста, прочтите обычное руководство, чтобы сначала познакомиться с Django.
Примечание
GeoDjango имеет дополнительные требования помимо того, что требует Django - пожалуйста, обратитесь к документации по установке для получения более подробной информации.
Это руководство проведет вас через создание географического веб-приложения для просмотра мировых границ . [1] Часть кода, используемого в этом руководстве, взята из проекта базовых приложений GeoDjango и / или вдохновлена им . [2]
Примечание
Последовательно просмотрите разделы руководства, чтобы получить пошаговые инструкции.
Настройка ¶
Создание пространственной базы данных ¶
Обычно никаких специальных настроек не требуется, поэтому вы можете создать базу данных, как и для любого другого проекта. Предлагаем несколько советов для выбранных баз данных:
Создать новый проект ¶
Используйте стандартный django-admin
скрипт для создания проекта под названием
geodjango
:
$ django-admin startproject geodjango
... \> django-admin startproject geodjango
Это инициализирует новый проект. Теперь создайте world
приложение Django в geodjango
проекте:
$ cd geodjango
$ python manage.py startapp world
... \> cd geodjango
... \> py manage.py startapp world
Настроить settings.py
¶
Настройки geodjango
проекта хранятся в geodjango/settings.py
файле. Измените настройки подключения к базе данных в соответствии с вашими настройками:
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'geodjango',
'USER': 'geo',
},
}
Кроме того, изменить INSTALLED_APPS
настройки , чтобы включить
django.contrib.admin
, django.contrib.gis
и world
(для вновь создаваемого приложения):
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.gis',
'world',
]
Географические данные ¶
Границы мира ¶
Данные о мировых границах доступны в этом zip-архиве . Создайте data
каталог в world
приложении, загрузите данные о мировых границах и разархивируйте. На платформах GNU / Linux используйте следующие команды:
$ mkdir world/data
$ cd world/data
$ wget https://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
$ unzip TM_WORLD_BORDERS-0.3.zip
$ cd ../..
...\> mkdir world\data
...\> cd world\data
...\> wget https://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
...\> unzip TM_WORLD_BORDERS-0.3.zip
...\> cd ..\..
ZIP-файл мировых границ содержит набор файлов данных, известных под общим названием ESRI Shapefile , одним из самых популярных форматов геопространственных данных. В распакованном виде набор данных о границах мира включает файлы со следующими расширениями:
.shp
: Содержит векторные данные для геометрии границ мира..shx
: Файл пространственного индекса для геометрии, хранящейся в формате.shp
..dbf
: Файл базы данных для хранения негеометрических данных атрибутов (например, целочисленных и символьных полей)..prj
: Содержит пространственную справочную информацию для географических данных, хранящихся в шейп-файле.
Используйте ogrinfo
для исследования пространственных данных ¶
ogrinfo
Утилита GDAL позволяет исследовать метаданные шейп-файлов или других источников векторных данных:
$ ogrinfo world/data/TM_WORLD_BORDERS-0.3.shp
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)
...\> ogrinfo world\data\TM_WORLD_BORDERS-0.3.shp
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)
ogrinfo
сообщает нам, что шейп-файл имеет один слой и что этот слой содержит данные многоугольника. Чтобы узнать больше, мы укажем имя слоя и воспользуемся -so
опцией, чтобы получить только важную сводную информацию:
$ ogrinfo -so world/data/TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
Layer name: TM_WORLD_BORDERS-0.3
Geometry: Polygon
Feature Count: 246
Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
DATUM["WGS_1984",
SPHEROID["WGS_1984",6378137.0,298.257223563]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]
FIPS: String (2.0)
ISO2: String (2.0)
ISO3: String (3.0)
UN: Integer (3.0)
NAME: String (50.0)
AREA: Integer (7.0)
POP2005: Integer (10.0)
REGION: Integer (3.0)
SUBREGION: Integer (3.0)
LON: Real (8.3)
LAT: Real (7.3)
...\> ogrinfo -so world\data\TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
Layer name: TM_WORLD_BORDERS-0.3
Geometry: Polygon
Feature Count: 246
Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
DATUM["WGS_1984",
SPHEROID["WGS_1984",6378137.0,298.257223563]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]
FIPS: String (2.0)
ISO2: String (2.0)
ISO3: String (3.0)
UN: Integer (3.0)
NAME: String (50.0)
AREA: Integer (7.0)
POP2005: Integer (10.0)
REGION: Integer (3.0)
SUBREGION: Integer (3.0)
LON: Real (8.3)
LAT: Real (7.3)
Эта подробная сводная информация сообщает нам количество объектов в слое (246), географические границы данных, систему пространственной привязки («SRS WKT»), а также информацию о типе для каждого поля атрибута. Например,
указывает, что символьное поле имеет максимальную длину 2. Точно так же это поле с плавающей запятой, которое содержит максимум 8 цифр до трех знаков после запятой.FIPS: String (2.0)
FIPS
LON: Real (8.3)
Географические модели ¶
Определение географической модели ¶
Теперь, когда вы изучили свой набор данных ogrinfo
, создайте модель GeoDjango для представления этих данных:
from django.contrib.gis.db import models
class WorldBorder(models.Model):
# Regular Django fields corresponding to the attributes in the
# world borders shapefile.
name = models.CharField(max_length=50)
area = models.IntegerField()
pop2005 = models.IntegerField('Population 2005')
fips = models.CharField('FIPS Code', max_length=2, null=True)
iso2 = models.CharField('2 Digit ISO', max_length=2)
iso3 = models.CharField('3 Digit ISO', max_length=3)
un = models.IntegerField('United Nations Code')
region = models.IntegerField('Region Code')
subregion = models.IntegerField('Sub-Region Code')
lon = models.FloatField()
lat = models.FloatField()
# GeoDjango-specific: a geometry field (MultiPolygonField)
mpoly = models.MultiPolygonField()
# Returns the string representation of the model.
def __str__(self):
return self.name
Обратите внимание, что models
модуль импортируется из django.contrib.gis.db
.
Системой пространственной привязки по умолчанию для геометрических полей является WGS84 (то есть SRID - 4326) - другими словами, координаты поля выражаются в долготе, а пары широты - в градусах. Чтобы использовать другую систему координат, установите SRID поля геометрии с srid
аргументом. Используйте целое число, представляющее код EPSG системы координат.
Беги migrate
¶
После определения вашей модели вам необходимо синхронизировать ее с базой данных. Сначала создайте миграцию базы данных:
$ python manage.py makemigrations
Migrations for 'world':
world/migrations/0001_initial.py:
- Create model WorldBorder
...\> py manage.py makemigrations
Migrations for 'world':
world/migrations/0001_initial.py:
- Create model WorldBorder
Давайте посмотрим на SQL, который сгенерирует таблицу для WorldBorder
модели:
$ python manage.py sqlmigrate world 0001
...\> py manage.py sqlmigrate world 0001
Эта команда должна выдать следующий результат:
BEGIN;
--
-- Create model WorldBorder
--
CREATE TABLE "world_worldborder" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(50) NOT NULL,
"area" integer NOT NULL,
"pop2005" integer NOT NULL,
"fips" varchar(2) NOT NULL,
"iso2" varchar(2) NOT NULL,
"iso3" varchar(3) NOT NULL,
"un" integer NOT NULL,
"region" integer NOT NULL,
"subregion" integer NOT NULL,
"lon" double precision NOT NULL,
"lat" double precision NOT NULL
"mpoly" geometry(MULTIPOLYGON,4326) NOT NULL
)
;
CREATE INDEX "world_worldborder_mpoly_id" ON "world_worldborder" USING GIST ( "mpoly" );
COMMIT;
Если это выглядит правильно, запустите, migrate
чтобы создать эту таблицу в базе данных:
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, world
Running migrations:
...
Applying world.0001_initial... OK
...\> py manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, world
Running migrations:
...
Applying world.0001_initial... OK
Импорт пространственных данных ¶
В этом разделе показано, как импортировать шейп-файл мировых границ в базу данных через модели GeoDjango с помощью утилиты импорта данных LayerMapping .
Есть много разных способов импорта данных в пространственную базу данных - помимо инструментов, включенных в GeoDjango, вы также можете использовать следующие:
- ogr2ogr : утилита командной строки, включенная в GDAL, которая может импортировать многие форматы векторных данных в базы данных PostGIS, MySQL и Oracle.
- shp2pgsql : Эта утилита, включенная в PostGIS, импортирует шейп-файлы ESRI в PostGIS.
Интерфейс GDAL ¶
Раньше вы использовали ogrinfo
для проверки содержимого шейп-файла мировых границ. GeoDjango также включает интерфейс Pythonic для мощной библиотеки OGR GDAL, которая может работать со всеми источниками векторных данных, которые поддерживает OGR.
Сначала вызовите оболочку Django:
$ python manage.py shell
...\> py manage.py shell
Если вы скачали данные World Borders ранее в руководстве, вы можете определить его путь с помощью Python pathlib.Path
:
>>> from pathlib import Path
>>> import world
>>> world_shp = Path(world.__file__).resolve().parent / 'data' / 'TM_WORLD_BORDERS-0.3.shp'
Теперь откройте шейп-файл границ мира с помощью DataSource
интерфейса GeoDjango
:
>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource(world_shp)
>>> print(ds)
/ ... /geodjango/world/data/TM_WORLD_BORDERS-0.3.shp (ESRI Shapefile)
Объекты источников данных могут иметь разные слои геопространственных функций; однако шейп-файлы могут иметь только один слой:
>>> print(len(ds))
1
>>> lyr = ds[0]
>>> print(lyr)
TM_WORLD_BORDERS-0.3
Вы можете увидеть тип геометрии слоя и количество элементов, которые он содержит:
>>> print(lyr.geom_type)
Polygon
>>> print(len(lyr))
246
Примечание
К сожалению, формат данных шейп-файла не позволяет более точно определять типы геометрии. Этот шейп-файл, как и многие другие, на самом деле включает MultiPolygon
геометрию, а не полигоны. Важно использовать в моделях более общий тип поля: GeoDjango MultiPolygonField
принимает Polygon
геометрию, но
PolygonField
не принимает MultiPolygon
геометрию типа. Вот почему WorldBorder
модель, определенная выше, использует расширение MultiPolygonField
.
С ним Layer
также может быть связана система пространственной привязки. Если это так, srs
атрибут вернет
SpatialReference
объект:
>>> srs = lyr.srs
>>> print(srs)
GEOGCS["GCS_WGS_1984",
DATUM["WGS_1984",
SPHEROID["WGS_1984",6378137.0,298.257223563]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]
>>> srs.proj # PROJ representation
'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs '
Этот шейп-файл находится в популярной системе пространственной привязки WGS84 - другими словами, в данных используются пары долгота и широта в градусах.
Кроме того, шейп-файлы также поддерживают поля атрибутов, которые могут содержать дополнительные данные. Вот поля на слое World Borders:
>>> print(lyr.fields)
['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME', 'AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT']
Следующий код позволит вам проверить типы OGR (например, целые или строковые), связанные с каждым из полей:
>>> [fld.__name__ for fld in lyr.field_types]
['OFTString', 'OFTString', 'OFTString', 'OFTInteger', 'OFTString', 'OFTInteger', 'OFTInteger', 'OFTInteger', 'OFTInteger', 'OFTReal', 'OFTReal']
Вы можете перебирать каждый объект в слое и извлекать информацию как из геометрии объекта (доступ к которой осуществляется через geom
атрибут), так и из полей атрибутов объекта ( значения которых доступны через get()
метод):
>>> for feat in lyr:
... print(feat.get('NAME'), feat.geom.num_points)
...
Guernsey 18
Jersey 26
South Georgia South Sandwich Islands 338
Taiwan 363
Layer
объекты могут быть нарезаны:
>>> lyr[0:2]
[<django.contrib.gis.gdal.feature.Feature object at 0x2f47690>, <django.contrib.gis.gdal.feature.Feature object at 0x2f47650>]
И отдельные функции могут быть получены по их идентификатору функции:
>>> feat = lyr[234]
>>> print(feat.get('NAME'))
San Marino
Граничные геометрии могут быть экспортированы как WKT и GeoJSON:
>>> geom = feat.geom
>>> print(geom.wkt)
POLYGON ((12.415798 43.957954,12.450554 ...
>>> print(geom.json)
{ "type": "Polygon", "coordinates": [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...
LayerMapping
¶
Чтобы импортировать данные, используйте LayerMapping в скрипте Python. Создайте файл, вызываемый load.py
внутри world
приложения, со следующим кодом:
from pathlib import Path
from django.contrib.gis.utils import LayerMapping
from .models import WorldBorder
world_mapping = {
'fips' : 'FIPS',
'iso2' : 'ISO2',
'iso3' : 'ISO3',
'un' : 'UN',
'name' : 'NAME',
'area' : 'AREA',
'pop2005' : 'POP2005',
'region' : 'REGION',
'subregion' : 'SUBREGION',
'lon' : 'LON',
'lat' : 'LAT',
'mpoly' : 'MULTIPOLYGON',
}
world_shp = Path(__file__).resolve().parent / 'data' / 'TM_WORLD_BORDERS-0.3.shp'
def run(verbose=True):
lm = LayerMapping(WorldBorder, world_shp, world_mapping, transform=False)
lm.save(strict=True, verbose=verbose)
Несколько заметок о том, что происходит:
- Каждый ключ в
world_mapping
словаре соответствует полю вWorldBorder
модели. Значение - это имя поля шейп-файла, из которого будут загружены данные. - Ключевым моментом
mpoly
для поля геометрии является тоMULTIPOLYGON
, что тип геометрии GeoDjango импортирует поле как. Даже простые многоугольники в шейп-файле будут автоматически преобразованы в коллекции перед вставкой в базу данных. - Путь к шейп-файлу не является абсолютным - другими словами, если вы переместите
world
приложение (сdata
подкаталогом) в другое место, сценарий все равно будет работать. - Для
transform
ключевого слова установлено значение,False
потому что данные в шейп-файле не нужно преобразовывать - они уже находятся в WGS84 (SRID = 4326).
После этого вызовите оболочку Django из geodjango
каталога проекта:
$ python manage.py shell
...\> py manage.py shell
Затем импортируйте load
модуль, вызовите run
процедуру и посмотрите
LayerMapping
, как работает:
>>> from world import load
>>> load.run()
Попробуйте ogrinspect
¶
Теперь, когда вы узнали, как определять географические модели и импортировать данные с помощью утилиты импорта данных
LayerMapping , можно дополнительно автоматизировать этот процесс с помощью команды ogrinspect
управления. ogrinspect
Команда introspects в GDAL поддерживаемого источник данных вектора (например, шейп) и генерирует определение модели и LayerMapping
словарь автоматически.
Общее использование команды выглядит следующим образом:
$ python manage.py ogrinspect [options] <data_source> <model_name> [options]
...\> py manage.py ogrinspect [options] <data_source> <model_name> [options]
data_source
- это путь к источнику данных, поддерживаемый GDAL, и
model_name
имя, используемое для модели. Параметры командной строки могут использоваться для дальнейшего определения способа создания модели.
Например, следующая команда WorldBorder
автоматически почти воспроизводит созданный выше словарь модели и сопоставления:
$ python manage.py ogrinspect world/data/TM_WORLD_BORDERS-0.3.shp WorldBorder \
--srid=4326 --mapping --multi
...\> py manage.py ogrinspect world\data\TM_WORLD_BORDERS-0.3.shp WorldBorder \
--srid=4326 --mapping --multi
Несколько замечаний о параметрах командной строки, приведенных выше:
--srid=4326
Опция устанавливает SRID для географической области.--mapping
Опция указываетogrinspect
также генерировать словарь отображения для использования сLayerMapping
.- Параметр
--multi
указан таким образом, что географическое поле представляет собой,MultiPolygonField
а не простоPolygonField
.
Команда производит следующий вывод, который можно скопировать непосредственно в models.py
приложение GeoDjango:
# This is an auto-generated Django model module created by ogrinspect.
from django.contrib.gis.db import models
class WorldBorder(models.Model):
fips = models.CharField(max_length=2)
iso2 = models.CharField(max_length=2)
iso3 = models.CharField(max_length=3)
un = models.IntegerField()
name = models.CharField(max_length=50)
area = models.IntegerField()
pop2005 = models.IntegerField()
region = models.IntegerField()
subregion = models.IntegerField()
lon = models.FloatField()
lat = models.FloatField()
geom = models.MultiPolygonField(srid=4326)
# Auto-generated `LayerMapping` dictionary for WorldBorder model
worldborders_mapping = {
'fips' : 'FIPS',
'iso2' : 'ISO2',
'iso3' : 'ISO3',
'un' : 'UN',
'name' : 'NAME',
'area' : 'AREA',
'pop2005' : 'POP2005',
'region' : 'REGION',
'subregion' : 'SUBREGION',
'lon' : 'LON',
'lat' : 'LAT',
'geom' : 'MULTIPOLYGON',
}
Пространственные запросы ¶
Пространственные поиски ¶
GeoDjango добавляет пространственный поиск в Django ORM. Например, вы можете найти в WorldBorder
таблице страну , содержащую конкретную точку. Сначала запустите оболочку управления:
$ python manage.py shell
...\> py manage.py shell
Теперь определите интересующий объект [3] :
>>> pnt_wkt = 'POINT(-95.3385 29.7245)'
pnt_wkt
Строка представляет собой точку на -95.3385 градусов долготы, 29.7245 градусов широты. Геометрия имеет формат, известный как Well Known Text (WKT), стандарт, выпущенный Open Geospatial Consortium (OGC). [4] Импортируйте WorldBorder
модель и выполните contains
поиск, используя в pnt_wkt
качестве параметра:
>>> from world.models import WorldBorder
>>> WorldBorder.objects.filter(mpoly__contains=pnt_wkt)
<QuerySet [<WorldBorder: United States>]>
Здесь вы получили QuerySet
только одну модель: границу Соединенных Штатов (именно то, что вы ожидали).
Точно так же вы также можете использовать объект геометрии GEOS . Здесь вы можете объединить intersects
пространственный поиск с get
методом для получения только WorldBorder
экземпляра для Сан-Марино вместо набора запросов:
>>> from django.contrib.gis.geos import Point
>>> pnt = Point(12.4604, 43.9420)
>>> WorldBorder.objects.get(mpoly__intersects=pnt)
<WorldBorder: San Marino>
contains
И intersects
поиски только подмножество доступных запросов - API базы данных GeoDjango документация имеет больше.
Автоматические пространственные преобразования ¶
При выполнении пространственных запросов GeoDjango автоматически преобразует геометрии, если они находятся в другой системе координат. В следующем примере координаты будут выражены в EPSG SRID 32140 , система координат , специфичные для южного Техаса только и в единицах метров , а не градусы:
>>> from django.contrib.gis.geos import GEOSGeometry, Point
>>> pnt = Point(954158.1, 4215137.1, srid=32140)
Обратите внимание, что pnt
это также может быть создано с помощью EWKT, «расширенной» формы WKT, которая включает в себя SRID:
>>> pnt = GEOSGeometry('SRID=32140;POINT(954158.1 4215137.1)')
ORM GeoDjango автоматически обернет значения геометрии в SQL преобразования, позволяя разработчику работать на более высоком уровне абстракции:
>>> qs = WorldBorder.objects.filter(mpoly__intersects=pnt)
>>> print(qs.query) # Generating the SQL
SELECT "world_worldborder"."id", "world_worldborder"."name", "world_worldborder"."area",
"world_worldborder"."pop2005", "world_worldborder"."fips", "world_worldborder"."iso2",
"world_worldborder"."iso3", "world_worldborder"."un", "world_worldborder"."region",
"world_worldborder"."subregion", "world_worldborder"."lon", "world_worldborder"."lat",
"world_worldborder"."mpoly" FROM "world_worldborder"
WHERE ST_Intersects("world_worldborder"."mpoly", ST_Transform(%s, 4326))
>>> qs # printing evaluates the queryset
<QuerySet [<WorldBorder: United States>]>
Необработанные запросы
При использовании необработанных запросов вы должны заключить свои геометрические поля в оболочку, чтобы значение поля могло быть распознано GEOS:
from django.db import connection
# or if you're querying a non-default database:
from django.db import connections
connection = connections['your_gis_db_alias']
City.objects.raw('SELECT id, name, %s as point from myapp_city' % (connection.ops.select % 'point'))
Вам следует использовать необработанные запросы только тогда, когда вы точно знаете, что делаете.
Ленивая геометрия ¶
GeoDjango загружает геометрию в стандартизированном текстовом представлении. При первом доступе к полю геометрии GeoDjango создает
GEOSGeometry
объект, демонстрирующий мощные функции, такие как свойства сериализации для популярных геопространственных форматов:
>>> sm = WorldBorder.objects.get(name='San Marino')
>>> sm.mpoly
<MultiPolygon object at 0x24c6798>
>>> sm.mpoly.wkt # WKT
MULTIPOLYGON (((12.4157980000000006 43.9579540000000009, 12.4505540000000003 43.9797209999999978, ...
>>> sm.mpoly.wkb # WKB (as Python binary buffer)
<read-only buffer for 0x1fe2c70, size -1, offset 0 at 0x2564c40>
>>> sm.mpoly.geojson # GeoJSON
'{ "type": "MultiPolygon", "coordinates": [ [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...
Это включает доступ ко всем расширенным геометрическим операциям, предоставляемым библиотекой GEOS:
>>> pnt = Point(12.4604, 43.9420)
>>> sm.mpoly.contains(pnt)
True
>>> pnt.contains(sm.mpoly)
False
Географические аннотации ¶
GeoDjango также предлагает набор географических аннотаций для вычисления расстояний и некоторых других операций (пересечение, разность и т. Д.). См. Документацию по функциям географических баз данных .
Размещение ваших данных на карте ¶
Географический администратор ¶
GeoDjango расширяет административное приложение Django поддержкой редактирования геометрических полей.
Основы ¶
GeoDjango также дополняет администратор Django, позволяя пользователям создавать и изменять геометрию на скользкой карте JavaScript (на базе OpenLayers ).
Давайте приступим. Создайте файл, вызываемый admin.py
внутри
world
приложения, со следующим кодом:
from django.contrib.gis import admin
from .models import WorldBorder
admin.site.register(WorldBorder, admin.GeoModelAdmin)
Затем отредактируйте ваш файл urls.py
в geodjango
папке приложения следующим образом:
from django.contrib.gis import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
]
Создайте пользователя с правами администратора:
$ python manage.py createsuperuser
...\> py manage.py createsuperuser
Затем запустите сервер разработки Django:
$ python manage.py runserver
...\> py manage.py runserver
Наконец, перейдите к http://localhost:8000/admin/
только что созданному пользователю и войдите в него. Перейдите к любой из WorldBorder
записей - границы можно отредактировать, щелкнув многоугольник и перетащив вершины в желаемое положение.
OSMGeoAdmin
¶
С помощью OSMGeoAdmin
GeoDjango использует слой Open Street Map в админке. Это обеспечивает больше контекста (включая детали улиц и проезжей части), чем доступно с GeoModelAdmin
(который использует набор данных WMS уровня 0 векторной карты, размещенный в OSGeo ).
Должны быть установлены файлы смещения датума PROJ (подробности см. В инструкции по установке PROJ ).
Если вы соответствуете этому требованию, замените OSMGeoAdmin
класс опции в своем admin.py
файле:
admin.site.register(WorldBorder, admin.OSMGeoAdmin)
Сноски
[1] | Особая благодарность Бьёрну Сандвику из сайта thematicmapping.org за предоставление и поддержку этого набора данных. |
[2] | Базовые приложения GeoDjango были написаны Дэйном Спрингмейером, Джошем Ливни и Кристофером Шмидтом. |
[3] | Это юридический центр Хьюстонского университета . |
[4] | Open Geospatial Consortium, Inc., Простая спецификация функций OpenGIS для SQL . |