Учебник по 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 ..\..
Архив границ стран содержит набор файлов данных, объединённых под названием ESRI Shapefile, одного из самых популярных форматов пространственных данных. При распаковке набор данных границ стран включает файлы с такими расширениями:
-
.shp: Содержит векторные данные для геометрий границ стран. -
.shx: Файл пространственного индекса для геометрий, хранящихся в.shp. -
.dbf: Файл базы данных для хранения негеометрических атрибутивных данных (например, целых чисел и символьных полей). -
.prj: Содержит информацию о системе пространственной привязки для географических данных, хранящихся в shapefile.
Использование ogrinfo для проверки пространственных данных
Утилита GDAL ogrinfo позволяет проверять метаданные shapefile или других источников векторных данных:
$ 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)
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 также включает Python-интерфейс к мощной библиотеке OGR GDAL, который может работать со всеми источниками векторных данных, поддерживаемыми OGR.
Сначала вызовите оболочку Django:
$ python manage.py shell
...\> py manage.py shell
Если вы загрузили данные границы стран мира ранее в учебнике, вы можете определить его путь, используя встроенный в Python модуль os:
>>> import os >>> import world >>> world_shp = os.path.abspath(os.path.join(os.path.dirname(world.__file__), ... 'data', 'TM_WORLD_BORDERS-0.3.shp'))
Теперь откройте shapefile границ стран мира, используя интерфейс GeoDjango DataSource:
>>> 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.proj4 # PROJ.4 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>]
Также можно извлечь отдельные записи по их ID:
>>> 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 с указанным ниже кодом:
import os
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 = os.path.abspath(
os.path.join(os.path.dirname(__file__), '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сообщает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)')
GeoDjango ORM автоматически оборачивает значения геометрии в 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 admin с поддержкой редактирования полей геометрии.
Основы
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 Vector Map Level 0, размещённый на OSGeo).
Файлы сдвига данных PROJ.4 должны быть установлены (см. инструкции по установке PROJ.4 для получения более подробной информации).
Если вы удовлетворяете этому требованию, просто замените класс опции OSMGeoAdmin в вашем файле admin.py:
admin.site.register(WorldBorder, admin.OSMGeoAdmin)
Примечания
| [1] | Особая благодарность Bjørn Sandvik из thematicmapping.org за предоставление и поддержку этого набора данных. |
| [2] | Основные приложения GeoDjango были написаны Дэйном Спрингмейером, Джошем Ливни и Кристофером Шмидтом. |
| [3] | Эта точка — Центр права Университета Хьюстона. |
| [4] | Open Geospatial Consortium, Inc., Спецификация OpenGIS Simple Feature Specification For SQL. |
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.2/ref/contrib/gis/tutorial/