Елена, ваше наблюдение про "62_12_0010101_4.mif.map" — это и есть разгадка, и дело не в отступах и не в квадратных скобках. Я проверил варианты на QGIS 3.40.15 с GDAL 3.8.4, вот что происходит на самом деле.
Для драйвера "MapInfo File" QGIS не считает .mif своим расширением: он берёт ваше имя целиком и дописывает к нему .tab. Поэтому и получается "...mif.tab" рядом с .map/.dat/.id — то есть обычный TAB, у которого буквы "mif" оказались просто частью имени. Технокад такое, конечно, не примет.
А если к этому драйверу добавить строку options.datasourceOptions = ["FORMAT=MIF"], выходит ещё хуже: имя всё равно становится "...mif.tab", и GDAL его отвергает — "Open() failed ... invalid filename extension". Запись падает на каждом объекте, и вы видите ровно свои "Exported: 0, skipped/errors: 5". Эту строку нужно убрать совсем.
Верной оказалась самая первая подсказка про другой драйвер: в QGIS "MapInfo MIF" — это ОТДЕЛЬНЫЙ драйвер (в списке есть оба, и "MapInfo File", и "MapInfo MIF"). С ним всё пишется правильно, и никакие datasourceOptions не нужны:
Код: Выделить всё
from qgis.core import (QgsVectorFileWriter, QgsCoordinateTransformContext,
QgsFeatureRequest)
import os, re
layer = iface.activeLayer() # выделите нужный слой в легенде
out_dir = r'C:\export_mif' # папка для результата
os.makedirs(out_dir, exist_ok=True)
ctx = QgsCoordinateTransformContext()
ok = bad = 0
for f in layer.getFeatures():
name = re.sub(r'[:\\/*?"<>|]', '_', str(f['cad_number']))
one = layer.materialize(QgsFeatureRequest().setFilterFids([f.id()]))
opts = QgsVectorFileWriter.SaveVectorOptions()
opts.driverName = 'MapInfo MIF'
res = QgsVectorFileWriter.writeAsVectorFormatV3(
one, os.path.join(out_dir, name + '.mif'), ctx, opts)
if res[0] == QgsVectorFileWriter.NoError:
ok += 1
else:
bad += 1
print(name, res[0], res[1])
print('gotovo: %d, oshibok: %d' % (ok, bad))
Поменяйте cad_number на реальное имя поля с кадастровым номером и путь к папке. Обратите внимание: writeAsVectorFormatV3 возвращает четыре значения, поэтому я не распаковываю их в две переменные, а беру res[0] и res[1] — той ошибки "too many values to unpack" тут не будет.
Как проверить, что получилось именно то: рядом с каждым .mif должен лежать парный .mid, а первая строка внутри .mif — Version 300. Если снова появились .dat/.map/.id — значит опять записался TAB.
Если скриптов не хочется, ровно то же делает ogr2ogr из комплекта QGIS (OSGeo4W Shell) — там расширение .mif распознаётся само:
Код: Выделить всё
ogr2ogr -f "MapInfo File" uchastok.mif sloi.gpkg
Оба варианта я прогнал на тестовом слое в МСК-зоне — получилась нормальная пара .mif/.mid.