Spec-Zone.ru › Django 2.2

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

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

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

Примечание

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

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

Источники географических данных, такие как shapefiles, могут быть очень большими. Если вы обнаружите, что 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 Используйте это для ручного указания исходной системы пространственной привязки (например, некоторые shapefiles не поставляются с файлом '.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() также принимает ключевые слова. Эти ключевые слова используются для управления выводом логов, обработкой ошибок и для импорта определённых диапазонов элементов.

Ключевые аргументы сохранения Описание
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/2.2/ref/contrib/gis/layermapping/

Spec-Zone.ru

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