Руководство по 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)FIPSLON: 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

С помощью OSMGeoAdminGeoDjango использует слой 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 .
  • 3.1
  • Версия документации: 3.2

Copyright ©2021 All rights reserved