Spec-Zone.ru › Django 6.0

Утилита импорта данных LayerMapping

Класс LayerMapping позволяет сопоставлять содержимое файлов векторных пространственных данных (например, шейп-файлов) моделям GeoDjango.

Эта утилита появилась из личной потребности автора устранить дублирование кода при извлечении геометрий и полей из векторного слоя, преобразовании в другую систему координат (например, WGS84) и последующей вставке в модель GeoDjango.

Примечание

Для использования LayerMapping требуется GDAL.

Предупреждение

Источники данных ГИС, например шейп-файлы, могут быть очень большими. Если вы обнаружите, что LayerMapping использует слишком много памяти, задайте для DEBUG значение False в настройках. Когда для DEBUG задано значение True, Django автоматически регистрирует каждый SQL-запрос, а SQL-операторы с геометриями могут потреблять больше памяти, чем обычно.

Пример

  1. Вам понадобится источник данных, поддерживаемый GDAL, например шейп-файл (здесь мы используем простой шейп-файл полигонов, test_poly.shp, с тремя объектами):
>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource("test_poly.shp")
>>> layer = ds[0]
>>> print(layer.fields)  # Exploring the fields in the layer, we only want the 'str' field.
['float', 'int', 'str']
>>> print(len(layer))  # getting the number of features in the layer (should be 3)
3
>>> print(layer.geom_type)  # Should be 'Polygon'
Polygon
>>> print(layer.srs)  # WGS84 in WKT
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
    UNIT["Degree",0.017453292519943295]]
  1. Теперь определим соответствующую модель Django (не забудьте выполнить migrate):

    from django.contrib.gis.db import models
    
    
    class TestGeo(models.Model):
        name = models.CharField(max_length=25)  # corresponds to the 'str' field
        poly = models.PolygonField(srid=4269)  # we want our model in a different SRID
    
        def __str__(self):
            return "Name: %s" % self.name
    
  2. Используйте LayerMapping, чтобы извлечь все объекты и поместить их в базу данных:
>>> from django.contrib.gis.utils import LayerMapping
>>> from geoapp.models import TestGeo
>>> mapping = {
...     "name": "str",  # The 'name' model field maps to the 'str' layer field.
...     "poly": "POLYGON",  # For geometry fields use OGC name.
... }  # The mapping is a dictionary
>>> lm = LayerMapping(TestGeo, "test_poly.shp", mapping)
>>> lm.save(verbose=True)  # Save the layermap, imports the data.
Saved: Name: 1
Saved: Name: 2
Saved: Name: 3

Здесь LayerMapping преобразовал три геометрии из шейп-файла из исходной системы пространственной привязки (WGS84) в систему пространственной привязки модели GeoDjango (NAD83). Если для слоя не определена система пространственной привязки, используйте ключевое слово source_srs с объектом SpatialReference, чтобы указать её.

API LayerMapping

class LayerMapping(model, data_source, mapping, layer=0, source_srs=None, encoding=None, transaction_mode='commit_on_success', transform=True, unique=True, using='default') [исходный код]

Ниже перечислены аргументы и именованные аргументы, которые можно использовать при создании объектов LayerMapping.

Аргумент

Описание

model

Географическая модель, а не её экземпляр.

data_source

Путь к файлу источника данных, поддерживаемого OGR (например, шейп-файлу). Также принимаются экземпляры django.contrib.gis.gdal.DataSource.

mapping

Словарь: ключи — строки, соответствующие полю модели, а значения — строки с именами полей объекта OGR. Если поле модели является географическим, значению должен соответствовать тип геометрии OGR, например 'POINT', 'LINESTRING', 'POLYGON'.

Именованные аргументы

layer

Индекс слоя в источнике данных (по умолчанию 0)

source_srs

Используйте этот аргумент, чтобы вручную указать исходную систему пространственной привязки (например, некоторые шейп-файлы не содержат файла '.prj'). Допускаются целочисленный SRID, строки WKT или PROJ, а также объекты django.contrib.gis.gdal.SpatialReference.

encoding

Задаёт кодировку строк в источнике данных OGR. Например, 'latin-1', 'utf-8' и 'cp437' — допустимые параметры кодировки.

transaction_mode

Может иметь значение 'commit_on_success' (по умолчанию) или 'autocommit'.

transform

Значение False отключает преобразование координат. Иными словами, геометрии будут вставлены в базу данных без изменений относительно исходного состояния в источнике данных.

unique

Если задать имя или кортеж имён полей указанной модели, будут созданы модели, уникальные только для заданного имени или имён. Геометрии каждого объекта будут добавлены в коллекцию, связанную с уникальной моделью. Принудительно задаёт режим транзакций 'autocommit'.

using

Задаёт базу данных для импорта пространственных данных. По умолчанию используется 'default'.

Именованные аргументы save()

LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False) [исходный код]

Метод save() также принимает именованные аргументы. Они используются для управления журналированием результатов, обработки ошибок и импорта определённых диапазонов объектов.

Именованные аргументы save

Описание

fid_range

Можно задать срез или кортеж (начало, конец) идентификаторов объектов, которые нужно сопоставить с источником данных. Иными словами, этот аргумент позволяет выборочно импортировать подмножество объектов из географического источника данных.

progress

Если задан этот аргумент, выводятся сведения о состоянии: количество обработанных и успешно сохранённых объектов. По умолчанию сведения о ходе выполнения выводятся после обработки каждых 1000 объектов, однако это значение можно изменить, задав для аргумента желаемый интервал в виде целого числа.

silent

По умолчанию уведомления о некритических ошибках выводятся в sys.stdout, но этот аргумент можно задать, чтобы отключить такие уведомления.

step

Если задано целое число, транзакции будут выполняться с указанным интервалом шагов. Например, если step=1000, фиксация изменений произойдёт после 1 000-го объекта, 2 000-го объекта и так далее.

stream

Сведения о состоянии будут записываться в этот файловый объект. По умолчанию используется sys.stdout, но поддерживается любой объект с методом write.

strict

Выполнение сопоставления модели прекратится при первой обнаруженной ошибке. При значении по умолчанию (False) выполняется попытка продолжить работу.

verbose

Если аргумент задан, после каждого сохранения модели в базе данных выводятся сведения.

Устранение неполадок

Нехватка памяти

Как отмечено в предупреждении в начале этого раздела, Django хранит все SQL-запросы, когда задано DEBUG=True. Задайте DEBUG=False в настройках — это должно предотвратить чрезмерное использование памяти при запуске скриптов LayerMapping.

MySQL: ошибка max_allowed_packet

Если при использовании LayerMapping и MySQL вы столкнулись со следующей ошибкой:

OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")

Решение — увеличить значение параметра max_allowed_packet в конфигурации MySQL. Например, значение по умолчанию может быть небольшим — около одного мегабайта. Параметр можно изменить в файле конфигурации MySQL (my.cnf) в разделе [mysqld]:

max_allowed_packet = 10M

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

Spec-Zone.ru

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