Spec-Zone.ru › Django 4.0

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

Введение

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

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

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

Примечание

GeoDjango имеет дополнительные требования помимо требований к Django — для получения более подробной информации см. документацию по установке.

Это руководство проведет вас через создание географического веб-приложения для просмотра границ стран мира. [1] Часть кода, используемого в этом руководстве, взята из проекта GeoDjango basic apps и/или на его основе. [2]

Примечание

Для пошаговых инструкций следуйте разделам руководства последовательно.

Настройка

Создание пространственной базы данных

Обычно специальная настройка не требуется, поэтому вы можете создать базу данных так же, как и для любого другого проекта. Мы предоставляем некоторые советы для выбранных баз данных:

  • Установка PostGIS
  • Установка SpatiaLite

Создание нового проекта

Используйте стандартную 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 ..\..

Архив world borders zip содержит набор файлов данных, объединённых под общим названием 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, 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" bigserial 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:

>>> 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["WGS 84",
DATUM["WGS_1984",
    SPHEROID["WGS 84",6378137,298.257223563,
        AUTHORITY["EPSG","7030"]],
    AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
    AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
    AUTHORITY["EPSG","9122"]],
AXIS["Latitude",NORTH],
AXIS["Longitude",EAST],
AUTHORITY["EPSG","4326"]]
>>> srs.proj # PROJ representation
'+proj=longlat +datum=WGS84 +no_defs'

Этот shapefile использует популярную пространственную систему координат WGS84 — другими словами, данные используют пары долготы и широты в градусах.

Кроме того, shapefiles также поддерживают атрибутивные поля, которые могут содержать дополнительные данные. Вот поля в слое 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', 'OFTInteger64', '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. Значение — это имя поля shapefile, из которого будут загружаться данные.
  • Ключ mpoly для геометрического поля равен MULTIPOLYGON, типу геометрии, который GeoDjango импортирует поле. Даже простые многоугольники в shapefile автоматически преобразуются в коллекции перед вставкой в базу данных.
  • Путь к shapefile не является абсолютным — другими словами, если вы переместите приложение world (вместе с подкаталогом data) в другое место, скрипт по-прежнему будет работать.
  • Ключевое слово transform установлено в значение False, потому что данные в shapefile не нужно преобразовывать — они уже находятся в системе координат 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 (например, shapefile), и автоматически генерирует определение модели и словарь сопоставлений 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 градусов. Геометрия представлена в формате 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 также предоставляет набор географических аннотаций для вычисления расстояний и нескольких других операций (пересечение, разность и т.д.). Смотрите документацию по Географическим функциям базы данных.

Отображение ваших данных на карте

Географический административный интерфейс

Административный интерфейс Django поддерживает редактирование полей геометрии.

Основы

Административный интерфейс Django позволяет пользователям создавать и изменять геометрии на JavaScript-карте с функцией скроллинга (powered by OpenLayers).

Давайте начнем. Создайте файл с именем admin.py внутри приложения world со следующим кодом:

from django.contrib.gis import admin
from .models import WorldBorder

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

Далее, отредактируйте свой urls.py в папке приложения geodjango следующим образом:

from django.contrib 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 — границы можно редактировать, нажав на многоугольник и перетащив вершины в нужное положение.

GISModelAdmin

С помощью GISModelAdmin, GeoDjango использует слой OpenStreetMap в административном интерфейсе. Это обеспечивает больший контекст (включая улицы и проезды), чем у ModelAdmin (который использует набор данных WMS Vector Map Level 0, размещённый на сайте OSGeo).

Файлы смещения системы координат PROJ должны быть установлены (см. инструкции по установке PROJ для получения более подробной информации).

Если это условие выполняется, используйте класс опции GISModelAdmin в вашем файле admin.py:

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

Примечания

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

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.0/ref/contrib/gis/tutorial/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API