Учебник по GeoDjango
Введение
GeoDjango — это модуль contrib для Django, который превращает его в полнофункциональный географический веб-фреймворк. GeoDjango стремится максимально упростить создание географических веб-приложений, таких как сервисы на основе местоположения. Его возможности включают:
- Поля моделей Django для геометрий OGC и растровых данных.
- Расширения ORM Django для запросов и обработки пространственных данных.
- Слабосвязанные, высокоуровневые Python-интерфейсы для операций с геометрией и растровыми данными ГИС, а также обработки данных в различных форматах.
- Редактирование полей геометрии в админке.
В этом учебнике предполагается знакомство с Django; поэтому, если вы новичок в Django, пожалуйста, прочитайте обычный учебник, чтобы сначала ознакомиться с Django.
Примечание
GeoDjango имеет дополнительные требования, помимо требований Django — для получения более подробной информации см. документацию по установке.
Этот учебник проведет вас через создание географического веб-приложения для просмотра границ мира. [1] Часть кода, используемого в этом учебнике, взята из проекта GeoDjango basic apps и/или вдохновлена им. [2]
Примечание
Для пошаговых инструкций следуйте разделам учебника последовательно.
Настройка
Создание пространственной базы данных
Обычно специальная настройка не требуется, поэтому вы можете создать базу данных, как и для любого другого проекта. Мы предоставляем некоторые советы для выбранных баз данных:
Создание нового проекта
Используйте стандартную django-admin команду для создания проекта под названием geodjango:
$ django-admin startproject geodjango
...\> django-admin startproject geodjango
Это инициализирует новый проект. Теперь создайте приложение Django world внутри проекта 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: Содержит информацию о пространственной системе координат для географических данных, хранящихся в shapefile.
Использование ogrinfo для проверки пространственных данных
Утилита GDAL ogrinfo позволяет проверять метаданные shapefiles или других источников векторных данных:
$ 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 сообщает нам, что shapefile содержит один слой, и что этот слой содержит данные о полигонах. Чтобы узнать больше, мы укажем имя слоя и используем опцию -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»), а также типе информации для каждого атрибутивного поля. Например, FIPS: String (2.0) указывает, что символьное поле FIPS имеет максимальную длину 2. Аналогично, LON: Real (8.3) — это поле с плавающей точкой, которое хранит максимум 8 знаков до трех знаков после запятой.
Географические модели
Определение географической модели
После проверки набора данных с помощью 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
Импорт пространственных данных
Этот раздел покажет вам, как импортировать shapefile границ мира в базу данных через модели GeoDjango с помощью утилиты импорта данных LayerMapping.
Существует множество различных способов импорта данных в пространственную базу данных — помимо инструментов, включённых в GeoDjango, вы также можете использовать следующие:
- ogr2ogr: Утилита командной строки, включенная в GDAL, которая может импортировать многие форматы векторных данных в базы данных PostGIS, MySQL и Oracle.
- shp2pgsql: Эта утилита, включённая в PostGIS, импортирует ESRI shapefiles в PostGIS.
Интерфейс GDAL
Ранее вы использовали ogrinfo для проверки содержимого shapefile границ мира. GeoDjango также включает питоновский интерфейс к мощной библиотеке OGR GDAL, который может работать со всеми источниками векторных данных, поддерживаемыми OGR.
Сначала вызовите оболочку Django:
$ python manage.py shell
...\> py manage.py shell
Если вы скачали данные Границы мира ранее в учебнике, то вы можете определить его путь с помощью pathlib.Path Python:
>>> from pathlib import Path >>> import world >>> world_shp = Path(world.__file__).resolve().parent / 'data' / 'TM_WORLD_BORDERS-0.3.shp'
Теперь откройте shapefile границ мира с помощью интерфейса 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)
Объекты источника данных могут иметь разные слои географических объектов; однако, shapefiles разрешены только один слой:
>>> print(len(ds)) 1 >>> lyr = ds[0] >>> print(lyr) TM_WORLD_BORDERS-0.3
Вы можете увидеть тип геометрии слоя и количество объектов в нем:
>>> print(lyr.geom_type) Polygon >>> print(len(lyr)) 246
Примечание
К сожалению, формат данных shapefile не позволяет большей специфичности в отношении типов геометрий. Этот shapefile, как и многие другие, фактически содержит MultiPolygon геометрии, а не Polygons. Важно использовать более общий тип поля в моделях: 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 '
Этот shapefile находится в популярной пространственной системе координат WGS84 — другими словами, данные используют пары долготы и широты в градусах.
Кроме того, shapefiles также поддерживают атрибутивные поля, которые могут содержать дополнительные данные. Вот поля в слое «Границы мира»:
>>> 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 shell из директории проекта geodjango:
$ python manage.py shell
...\> py manage.py shell
Далее, импортируйте модуль load, вызовите функцию run и посмотрите, как LayerMapping выполнит свою работу:
>>> from world import load >>> load.run()
Попробуйте ogrinspect
Теперь, когда вы увидели, как определять географические модели и импортировать данные с помощью инструмента LayerMapping для импорта данных, можно автоматизировать этот процесс с помощью команды управления ogrinspect. Команда ogrinspect инспектирует источник векторных данных, поддерживаемый 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сообщает команде также сгенерировать словарь сопоставлений для использования с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 — это лишь подмножество доступных запросов. Документация GeoDjango по API базы данных содержит больше информации.
Автоматические пространственные преобразования
При выполнении пространственных запросов 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-слайдерной карте (powered by 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 Vector Map Level 0, размещённый на OSGeo).
Файлы сдвига данных PROJ должны быть установлены (подробнее см. в инструкциях по установке PROJ).
Если это условие выполнено, замените класс параметра OSMGeoAdmin в своём файле admin.py:
admin.site.register(WorldBorder, admin.OSMGeoAdmin)
Примечания
| [1] | Особая благодарность Bjørn Sandvik из thematicmapping.org за предоставление и поддержку этого набора данных. |
| [2] | Основные приложения GeoDjango были написаны Дэйном Спрингмейером, Джошем Ливни и Кристофером Шмидтом. |
| [3] | Эта точка — Юридический центр Университета Хьюстона. |
| [4] | Open Geospatial Consortium, Inc., Спецификация OpenGIS для простых объектов в SQL. |
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.2/ref/contrib/gis/tutorial/