Инструмент импорта данных LayerMapping
Класс LayerMapping предоставляет способ сопоставления содержимого файлов векторных пространственных данных (например, shapefiles) с моделями GeoDjango.
Этот инструмент возник из личных потребностей автора в устранении повторения кода, связанного с извлечением геометрий и полей из векторного слоя, преобразованием в другую систему координат (например, WGS84) и последующей вставкой в модель GeoDjango.
Примечание
Использование LayerMapping требует GDAL.
Предупреждение
Источники пространственных данных, такие как shapefiles, могут быть очень большими. Если вы обнаружите, что LayerMapping использует слишком много памяти, установите значение DEBUG на False в ваших настройках. Когда DEBUG установлено на True, Django автоматически регистрирует каждый SQL-запрос – а при SQL-выражениях, содержащих геометрии, это может потреблять больше памяти, чем обычно.
Пример
-
Вам нужен поддерживаемый 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]] -
Теперь мы определяем соответствующую модель 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 -
Используйте
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/4.1/ref/contrib/gis/layermapping/