Инструмент импорта данных 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 objects = models.GeoManager() def __str__(self): # __unicode__ on Python 2 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.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.8/ref/contrib/gis/layermapping/