Spec-Zone.ru › Django 5.0

Утилита импорта данных 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]]
  1. Теперь определим соответствующую модель 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
    
  2. Используйте 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 строки и объекты 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/5.0/ref/contrib/gis/layermapping/

Spec-Zone.ru

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