Руководство по GeoDjango

Введение

GeoDjango - это дополнительный модуль Django, который превращает его в большую географическую веб-систему. Цель GeoDjango - максимально упростить создание географических веб-приложений, таких как службы на основе определения местоположения. Его особенности включают:

  • Поля модели Django для данных матрицы rz геометрических объектов OGC .
  • Расширения ORM Django для запросов и манипуляций с пространственными данными.
  • Свободно связанные, высокоуровневые интерфейсы Python для геометрических ГИС и матричных операций, а также манипулирования данными в различных форматах.
  • Редактирование геометрических полей в интерфейсе администрирования.

В этом руководстве предполагается, что вы знакомы с Django; Так что, если вы новичок в Django, сначала прочтите обычное руководство, чтобы познакомиться с Django.

Заметка

GeoDjango требует дополнительных зависимостей от Django, подробности см. В документации по установке .

Это руководство проведет вас через создание географического веб-приложения для визуализации границ мира . [1] Часть кода для этого руководства заимствована из проекта GeoDjango Core Applications или вдохновлена ​​им . [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-файл World Borders содержит набор файлов данных, которые вместе образуют так называемый шейп- файл ESRI , один из наиболее широко используемых форматов геопространственных данных. После декомпрессии набор данных мировых границ содержит файлы со следующими расширениями:

  • .shp : Содержит векторные данные геометрических объектов границ мира.
  • .shx : файл пространственного индекса геометрических объектов, хранящихся в файлах
  • .dbf : файл базы данных, содержащий негеометрические атрибутные данные (например, целочисленные или текстовые поля).
  • .prj : Содержит пространственную справочную информацию для географических данных, хранящихся в шейп-файле.

Использование ogrinfo для изучения пространственных данных

Утилита GDAL ogrinfo позволяет вам исследовать метаданные из шейп-файлов или других источников векторных данных:

$ 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 сообщает нам, что в шейп-файле есть слой, а он содержит данные типа polygon. Чтобы узнать больше, мы указываем имя слоя и используем опцию -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 цифр перед десятичной точкой и 3 после нее.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 для проверки содержимого файла World Borders. GeoDjango также содержит интерфейс Python для мощной библиотеки OGR GDAL, которая способна обрабатывать все источники векторных данных, поддерживаемые OGR.

Сначала запустите оболочку Django:

$ python manage.py shell
...\> py manage.py shell

Если вы скачали данные World Frontiers ранее в руководстве, то вы можете определить его путь с помощью 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 , а не Polygon . Важно использовать в моделях более общий тип поля: поле MultiPolygonField GeoDjango будет принимать объект Polygon , но поле PolygonField не будет принимать геометрический объект типа MultiPolygon . Вот почему WorldBorder определенная выше модель использует поле

Также возможно, что с объектом связана система пространственной привязки 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 '

В этом шейп-файле используется хорошо известная система пространственной привязки 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 , можно дополнительно автоматизировать этот процесс с помощью команды manage 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 добавляет пространственный поиск в ORM Django. Например, вы можете искать страну в таблице WorldBorder , содержащей конкретную точку. Начнем с запуска командной оболочки:

$ python manage.py shell
...\> py manage.py shell

Теперь определите достопримечательность [3] :

>>> pnt_wkt = 'POINT(-95.3385 29.7245)'

Строка pnt_wkt представляет точку на долготе -95,3385 градуса и широте 29,7245 градуса. Геометрический синтаксис представлен в формате, известном как хорошо известный текст (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 чтобы получить единственный экземпляр Сан-Марино вместо набора запросов :

>>> 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 автоматически преобразует геометрические объекты, если они находятся в другой системе координат. В следующем примере координаты будут выражены в SRID EPSG 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 Vector Map Level 0, размещенный на OSGeo ).

Необходимо установить файлы проекции PROJ.4 (подробности см. В инструкции по установке PROJ.4 ).

Если это требование выполняется, замените класс GeoModelAdmin с OSMGeoAdmin в файле admin.py :

admin.site.register(WorldBorder, admin.OSMGeoAdmin)

Сноски

[1]Особая благодарность Бьёрну Сандвику из сайта thematicmapping.org за предоставление и поддержку этого набора данных.
[2]Базовые приложения GeoDjango были написаны Дэйном Спрингмейером, Джошем Ливни и Кристофером Шмидтом.
[3]Эта точка соответствует Юридическому центру Университета Хьюстона .
[4]Open Geospatial Consortium, Inc., Простая спецификация функций OpenGIS для SQL .

Copyright ©2020 All rights reserved