Инструмент импорта данных 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.2/ref/contrib/gis/layermapping/