Spec-Zone.ru › Django 1.11

Инструмент импорта данных 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):              # __unicode__ on Python 2
            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/1.11/ref/contrib/gis/layermapping/

Spec-Zone.ru

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