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

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

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

Заметка

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

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

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

Пример

  1. Вам понадобится источник данных, поддерживаемый GDAL, например шейп-файл (здесь мы будем использовать простой шейп-файл, состоящий из трех многоугольников):

    >>> 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 три геометрических объекта в шейп-файле преобразованы из их исходной системы пространственной привязки (WGS84) в систему пространственной привязки модели GeoDjango (NAD83). Если бы в слое не была определена система пространственной привязки, параметр пришлось бы использовать source_srs с объектом, SpatialReference чтобы определить его.

API LayerMapping

classLayerMapping ( 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.4 или объект 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 Может быть определено с помощью сегментации или кортежа идентификаторов элементов в источнике данных. Другими словами, этот параметр позволяет выборочно импортировать подмножество элементов в географический источник данных.(début, fin)
progress Если этот параметр содержит True , отображается подробная информация, указывающая количество обработанных и сохраненных элементов. По умолчанию информация о ходе выполнения отображается после обработки каждой группы из 1000 элементов. Это поведение можно изменить, присвоив этому параметру целое число, чтобы установить желаемый интервал.
silent По умолчанию уведомления о нефатальных ошибках отображаются включенными sys.stdout , но этот логический параметр можно настроить для отключения этих уведомлений.
step Если он содержит целое число, задает интервал регистрации для каждой транзакции. Например, если step=1000 транзакция совершается после 1000-го элемента, после 2000-го элемента и т. Д.
stream Информация о ходе выполнения записывается в этот файловый поток. По умолчанию это так sys.stdout , но подойдет и любой объект с методом write .
strict Если этот параметр установлен True , импорт элементов в модель прекращается при обнаружении первой ошибки. С поведением по умолчанию ( False ) сценарий пытается продолжить.
verbose Если установлено значение True , информация отображается после каждого сохранения модели в базе данных.

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

Чрезмерное потребление памяти

Как отмечено в заявлении об отказе от ответственности в верхней части этого раздела, 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

Copyright ©2020 All rights reserved