Spec-Zone.ru › Django 3.2

Инструмент импорта данных LayerMapping

Класс LayerMapping предоставляет способ сопоставления содержимого файлов векторных пространственных данных (например, shapefile) с моделями GeoDjango.

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

Примечание

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

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

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

Пример

  1. Вам нужен источник данных, поддерживаемый GDAL, например, shapefile (здесь мы используем простой shapefile полигонов, 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]]
    
  2. Теперь мы определяем соответствующую модель 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
    
  3. Используйте 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 преобразовал три геометрии из shapefile в их исходной системе пространственной привязки (WGS84) в систему пространственной привязки модели GeoDjango (NAD83). Если для слоя не определена система пространственной привязки, используйте ключевое слово source_srs с объектом SpatialReference, чтобы указать его.

LayerMapping API

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 (например, shapefile). Также принимает экземпляры django.contrib.gis.gdal.DataSource.
mapping Словарь: ключи — строки, соответствующие полю модели, а значения — имена полей OGR-объекта, или, если поле модели является географическим, то оно должно соответствовать типу геометрии OGR, например, 'POINT', 'LINESTRING', 'POLYGON'.
Ключевые аргументы
layer Индекс слоя для использования из источника данных (по умолчанию 0)
source_srs Используйте это для ручного указания исходной системы координат (например, некоторые shapefile не содержат файла '.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'.
Изменено в Django 3.2:

Была добавлена поддержка pathlib.Path data_source.

save() Ключевые аргументы

LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False)

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

Ключевые аргументы сохранения Описание
fid_range Может быть задан с помощью среза или кортежа (начало, конец) идентификаторов объектов для сопоставления из источника данных. Другими словами, это ключевое слово позволяет пользователю выборочно импортировать поддиапазон объектов в источнике пространственных данных.
progress Когда это ключевое слово задано, будет напечатана информация о состоянии, показывающая количество обработанных и успешно сохраненных объектов. По умолчанию информация о прогрессе будет печататься каждые 1000 обработанных объектов, однако это значение по умолчанию может быть изменено установкой этого ключевого слова с целым числом для желаемого интервала.
silent По умолчанию уведомления об ошибках, не связанных с ошибками, печатаются в sys.stdout, но это ключевое слово может быть установлено для отключения этих уведомлений.
step Если установлено значение с целым числом, транзакции будут происходить каждые интервал шагов. Например, если step=1000, коммит произойдет после 1000-го объекта, 2000-го объекта и т.д.
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/3.2/ref/contrib/gis/layermapping/

Spec-Zone.ru

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