• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

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

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

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

Примечание

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

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

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

Пример

  1. You need a GDAL-supported data source, like a shapefile (here we’re using a simple polygon shapefile, test_poly.shp, with three features):

    >>> 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. Use LayerMapping to extract all the features and place them in the database:

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

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.

Аргумент

Описание

модель

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

источник_данных

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

картографирование

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

Аргументы ключевых слов

слой

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

source_srs

Use this to specify the source SRS manually (for example, some shapefiles don’t come with a '.prj' file). An integer SRID, WKT or PROJ.4 strings, and django.contrib.gis.gdal.SpatialReference objects are accepted.

кодирование

Указывает кодировку набора символов для строк в источнике данных OGR. Например, 'latin-1', 'utf-8' и 'cp437' являются допустимыми параметрами кодировки.

режим_транзакции

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

трансформировать

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

unique

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

используя

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

save() Аргументы ключевых слов

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

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

Сохранить аргументы ключевого слова

Описание

fid_range

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

прогресс

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

тихий

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

шаг

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

поток

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

строгий

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

многословный

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

Решение проблем

Недостаточно памяти

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

MySQL: ошибка max_allowed_packet

If you encounter the following error when using LayerMapping and MySQL:

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

Then the solution is to increase the value of the max_allowed_packet setting in your MySQL configuration. For example, the default value may be something low like one megabyte – the setting may be modified in MySQL’s configuration file (my.cnf) in the [mysqld] section:

max_allowed_packet = 10M
Back to Top