Python завершает работу при работе со слоями памяти в Python GDAL/OGR
Я работаю над программным проектом, который обрабатывает геометрические файлы и объединяет их с кадастровыми данными. Мне удалось найти решения для различных подзадач, необходимых для выполнения основной задачи. Недавно я пытался оптимизировать код и собрать воедино различные фрагменты кода, которые я написал до сих пор. Именно тогда я столкнулся с проблемами с драйвером памяти GDAL/OGR. Код отлично работал с другими драйверами (WFS, DXF и ESRI Shapefile), но не совсем с драйвером памяти.
- Прочитайте файл Shapefile/DXF, передайте слой, полученный из файла, и верните полученный слой как слой памяти. До оператора return все работает нормально. После того, как слой «возвращен», код вскоре завершается без создания исключения. Эту ошибку можно обойти, переместив код из
prepare_layer
функцию к основной функции. Но в любом случае, это не идеально, и я хотел бы понять, почему это происходит.
from osgeo import ogr
def prepare_layer(input_layer):
mem_driver = ogr.GetDriverByName('MEMORY')
mem_ds = mem_driver.CreateDataSource('memData')
mem_open = mem_driver.Open('memData',1)
mem_layer = ogr.DataSource.CreateLayer(mem_ds, 'Layer1')
input_layer_defn = input_layer.GetLayerDefn()
for i in range(input_layer_defn.GetFieldCount()):
field_defn = input_layer_defn.GetFieldDefn(i)
mem_layer.CreateField(field_defn)
mem_defn = mem_layer.GetLayerDefn()
for feature in input_layer:
geom = feature.GetGeometryRef()
geom_type = geom.GetGeometryName()
if geom_type == 'LINESTRING':
geom.Transform(TRANSFORM)
geom = geom.Buffer(2)
out_feature = ogr.Feature(mem_defn)
out_feature.SetGeometry(geom)
for i in range(feature.GetFieldCount()):
field_attr = feature.GetField(i)
out_feature.SetField(i, field_attr)
mem_layer.CreateFeature(out_feature)
out_feature.Destroy()
return mem_layer
input_driver = ogr.GetDriverByName('ESRI Shapefile')
input_open = input_driver.Open(file_path_in, 0)
input_layer = input_open.GetLayer()
output_layer = prepare_layer(input_layer)
- Получить данные WFS, извлечь слой и пересечь слой с обработанным слоем памяти из 1). Результат: Терминал выдает несколько ошибок сервера HTTP 400. Если я закомментирую объявление уровня памяти в разделе «# Результат», данные будут получены без проблем. Таким образом, независимо от сообщения об ошибке, это не проблема сервера. Кроме того, если я вручную вставлю точно такой же HTTP-запрос, который
get_wfs()
производит в моем браузере, я могу загрузить данные без проблем.
Для краткости я опустил код этих функций, так как они нормально работают с другими драйверами:
get_bbox()
: возвращает строку с координатами ограничивающей рамки
get_wfs(feature, box)
: возвращает объект ogr.Driver.Open драйвера WFS.
# Result Layer
res_driver = ogr.GetDriverByName('MEMORY')
res_ds = res_driver.CreateDataSource('result')
res_open = res_driver.Open('result',1)
res_layer = res_ds.CreateLayer('result', target, ogr.wkbPolygon)
# WFS Flurstück
bbox = get_bbox(mem_layer)
FlSt = get_wfs(feature, bbox)
FlSt_layer = FlSt.GetLayer()
# Intersection
ogr.Layer.Intersection(mem_layer, FlSt_layer, res_layer)
Я был бы признателен за любую помощь или указатели в правильном направлении. Надеюсь, это было не слишком запутанно.