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]]
    
  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объектом, чтобы указать его.

LayerMappingAPI

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 Используйте это, чтобы указать исходную SRS вручную (например, некоторые шейп-файлы не поставляются с '.prj' файлом). Допускаются целочисленные строки и django.contrib.gis.gdal.SpatialReference объекты SRID, WKT или PROJ .
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 Выполнение сопоставления модели прекращается при первой обнаруженной ошибке. По умолчанию value ( 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

Copyright ©2021 All rights reserved