LayerMapping
утилита импорта данных ¶
LayerMapping
Класс предоставляет способ отображения содержимого векторных пространственных файлов данных (например , шейп файлов) в модели GeoDjango.
Эта утилита выросла из личных потребностей автора, чтобы исключить повторение кода, которое использовалось для извлечения геометрии и полей из векторного слоя, преобразования в другую систему координат (например, WGS84), а затем вставки в модель GeoDjango.
Примечание
Для использования LayerMapping
требуется GDAL.
Предупреждение
Источники данных ГИС, такие как шейп-файлы, могут быть очень большими. Если вы обнаружите, что LayerMapping
используется слишком много памяти, установите
DEBUG
значение False
в своих настройках. Если DEBUG
установлено значение True
, Django автоматически регистрирует
каждый SQL-запрос, а когда операторы SQL содержат геометрию, это может потреблять больше памяти, чем обычно.
Пример ¶
Вам нужен источник данных, поддерживаемый GDAL, например шейп-файл (здесь мы используем простой шейп-файл многоугольника
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
преобразованы три геометрии из шейп-файла в их исходной системе пространственной привязки (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 (например, шейп-файлу). Также принимает
django.contrib.gis.gdal.DataSource экземпляры. |
mapping |
Словарь: ключи представляют собой строка , соответствующие поля модели, а значения соответствуют именам строкового поля для функции OGR, или если поле модели является географическим , то она должна соответствовать типу геометрии OGR, например, 'POINT' , 'LINESTRING' , 'POLYGON' . |
Аргументы ключевых слов | |
---|---|
layer |
Индекс используемого слоя из источника данных (по умолчанию 0) |
source_srs |
Используйте это, чтобы указать исходную SRS вручную (например, некоторые шейп-файлы не поставляются с '.prj'
файлом). Допускаются целочисленные строки и django.contrib.gis.gdal.SpatialReference
объекты SRID, WKT или PROJ
. |
encoding |
Задает кодировку набора символов строк в источнике данных OGR. Так , например, 'latin-1' ,
'utf-8' и 'cp437' все действительные параметры кодирования. |
transaction_mode |
Может быть 'commit_on_success' (по умолчанию) или
'autocommit' . |
transform |
Установка этого значения в False отключит преобразование координат. Другими словами, геометрия будет вставлена в базу данных без изменений по сравнению с исходным состоянием в источнике данных. |
unique |
Установка этого имени или кортежа имен из данной модели создаст модели, уникальные только для данного имени (имен). Геометрии каждого объекта будут добавлены в коллекцию, связанную с уникальной моделью. Принудительно устанавливает режим транзакции 'autocommit' . |
using |
Устанавливает базу данных для использования при импорте пространственных данных. По умолчанию 'default' . |
Поддержка была добавлена.pathlib.Path
data_source
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 |
Выполнение сопоставления модели прекращается при первой обнаруженной ошибке. По умолчанию value ( 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