Spec-Zone.ru › Django 5.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]]
  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') [source]

Ниже приведены аргументы и ключевые слова, которые можно использовать во время создания объектов 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) [source]

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

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

Описание

fid_range

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

progress

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

silent

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

step

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

stream

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

strict

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

Отладка

Использование всей памяти

Как отмечалось в предупреждении в начале этого раздела, 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.2/ref/contrib/gis/layermapping/

Spec-Zone.ru

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