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