Утилита импорта данных LayerMapping
¶
Класс LayerMapping
предоставляет способ сопоставления содержимого файлов пространственных данных (например, шейп-файлов) с моделями GeoDjango.
Эта утилита была создана для личных нужд ее автора, который чувствовал необходимость исключить повторение кода при извлечении геометрических объектов и полей данных из векторного слоя в преобразовать в другую систему координат (например, WGS84) и вставить их в модель GeoDjango.
Заметка
Для использования LayerMapping
требуется GDAL.
Предупреждение
Источники данных ГИС, такие как шейп-файлы, могут быть очень большими. Если вы обнаружили , что LayerMapping
использование слишком много памяти, установленное DEBUG
на False
в настройках. Когда DEBUG
установлено значение True
, Django автоматически регистрирует каждый SQL-запрос, а когда операторы SQL содержат геометрию, он может потреблять больше памяти, чем обычно.
Пример ¶
Вам понадобится источник данных, поддерживаемый GDAL, например шейп-файл (здесь мы будем использовать простой шейп-файл, состоящий из трех многоугольников):
>>> 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
три геометрических объекта в шейп-файле преобразованы из их исходной системы пространственной привязки (WGS84) в систему пространственной привязки модели GeoDjango (NAD83). Если бы в слое не была определена система пространственной привязки, параметр пришлось бы использовать source_srs
с объектом, SpatialReference
чтобы определить его.
API LayerMapping
¶
-
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 (например, шейп-файлу). Также принимает экземпляры django.contrib.gis.gdal.DataSource . |
mapping |
Словарь: ключи представляют собой строки, соответствующие полям модели, а значения соответствуют именам полей элементов OGR или, в случае, когда поле модели является географическим, геометрическому типу OGR, например 'POINT' , 'LINESTRING' , 'POLYGON' . |
Именованные параметры | |
---|---|
layer |
Индекс слоя для использования в источнике данных (по умолчанию 0). |
source_srs |
Полезно для ручной настройки системы пространственной привязки источника (например, для шейп-файлов без дополнительного файла '.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()
также принимает именованные параметры. Они используются для управления ведением журнала вывода, обработкой ошибок и для импорта подмножеств элементов.
Именованный параметр save |
Описание |
---|---|
fid_range |
Может быть определено с помощью сегментации или кортежа идентификаторов элементов в источнике данных. Другими словами, этот параметр позволяет выборочно импортировать подмножество элементов в географический источник данных.(début, fin) |
progress |
Если этот параметр содержит True , отображается подробная информация, указывающая количество обработанных и сохраненных элементов. По умолчанию информация о ходе выполнения отображается после обработки каждой группы из 1000 элементов. Это поведение можно изменить, присвоив этому параметру целое число, чтобы установить желаемый интервал. |
silent |
По умолчанию уведомления о нефатальных ошибках отображаются включенными sys.stdout , но этот логический параметр можно настроить для отключения этих уведомлений. |
step |
Если он содержит целое число, задает интервал регистрации для каждой транзакции. Например, если step=1000 транзакция совершается после 1000-го элемента, после 2000-го элемента и т. Д. |
stream |
Информация о ходе выполнения записывается в этот файловый поток. По умолчанию это так sys.stdout , но подойдет и любой объект с методом write . |
strict |
Если этот параметр установлен True , импорт элементов в модель прекращается при обнаружении первой ошибки. С поведением по умолчанию ( False ) сценарий пытается продолжить. |
verbose |
Если установлено значение True , информация отображается после каждого сохранения модели в базе данных. |
Устранение неполадок ¶
Чрезмерное потребление памяти ¶
Как отмечено в заявлении об отказе от ответственности в верхней части этого раздела, 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