Страница 3 из 3

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 09 апр 2026, 09:14
ustreb
Елена2026 писал(а):
09 апр 2026, 08:41
Спасибо за совет, но с АркГисом, боюсь, не получится, так как у нас в гос.организации нельзя устанавливать "крякнутые" программы и вообще всё проверяется ((( Ку-Гис, по идее, тоже нельзя использовать, но хоть это пока разрешили. Покупать лицензию точно не станут ради экспорта файлов... Вот проявляем изобретательность, как можем, чтобы имеющимися средствами ускорить работу.
Если есть свой ноутбук или ПК, то можно) вам шашечки или ехать? :lol:

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 09 апр 2026, 13:32
AlexRomantsov
забавный вариант пришел в голову:
таблица атрибутов, калькулятор выражений, создаем виртуальное поле (txt), подставляем выражение типа:

'Version 2
Delimiter ","
CoordSys NonEarth Units "m" Bounds (-3274.9999, 2524.9995) (2224.99976, -5225.0005)
Columns 1
None Char(5)
DATA

Region 1' ||
'
' ||
num_points( $geometry ) ||
'
' ||
replace(
replace(
replace( geom_to_wkt( $geometry), 'Polygon ((', '')
,',','\n')
,'))','')

Выполняем, появляется поле с содержимым mif файла. Затем экспорт слоя например в csv, и поискать как текстовый файл разделить на множество
Значение атрибута:
mif.JPG
mif.JPG (13.64 КБ) 3321 просмотр

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 09 апр 2026, 15:20
Елена2026
Интересная идея, спасибо! Это почти mif-файл получается))) Однако при разбивке векторного слоя в экспортируемых файлах только по 3 точки от всего полигона почему-то отображается. Однако, если бы хоть координаты выгружались, проще было бы вручную мифки делать копипастом, чем экспортировать с ку-гиса через привычный "экспорт - сохранить выбранные объекты как..."

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 09 апр 2026, 15:37
Елена2026
Сначала подумала, что дело в том, что малое количество символов задала, но нет - пробовала и миллион символов задавать. И что интересно: когда я ввожу выражение, сохраняю, то в столбце с новым атрибутом для каждого объекта появляется весь нужный текст со всеми координатами всех точек полигона. После того, как я делаю разбивку векторного слоя, экспортируются в csv уже урезанные координаты (3-4 точки от полигона). И в таблице атрибутов тоже исчезают все необходимые координаты, остаются урезанные. В чём же тут фокус?

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 09 апр 2026, 16:21
gamm
Елена2026 писал(а):
08 апр 2026, 11:17
Спасибо за помощь, но всё равно не выполняется скрипт, выдает ошибку.
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "Untitled-0", line 82, in <module>
ValueError: too many values to unpack (expected 2)
Последняя попытка ...
Железный Мозг говорит, что строку

Код: Выделить всё

err_code, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(
нужно заменить на

Код: Выделить всё

err_code, _, _, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 10 апр 2026, 05:04
AlexRomantsov
Елена2026 писал(а):
09 апр 2026, 15:37
И в таблице атрибутов тоже исчезают все необходимые координаты, остаются урезанные. В чём же тут фокус?
Если Вы сделали физическое поле для расчета (не виртуальное), его возможная длина зависит от формата слоя, и при сохранении текст обрежет.
Например в shp (dbf) максимум - 254 символа.
Либо надо хранить слой в современных форматах или базах данных (таких как GeoPackage), либо это поле делать виртуальным, вычисляемым (не сохраняемым).
Попробовал, виртуальное поле сохранилось в csv не обрезанным, в т.ч. через Разбить векторный слой

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 10 апр 2026, 05:08
AlexRomantsov
Да, и в примере моя шапка (Version 2 Delimiter "," ...) - с потолка, заменить на свои

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 10 апр 2026, 10:28
Елена2026
AlexRomantsov писал(а):
10 апр 2026, 05:04
Елена2026 писал(а):
09 апр 2026, 15:37
И в таблице атрибутов тоже исчезают все необходимые координаты, остаются урезанные. В чём же тут фокус?
Если Вы сделали физическое поле для расчета (не виртуальное), его возможная длина зависит от формата слоя, и при сохранении текст обрежет.
Например в shp (dbf) максимум - 254 символа.
Либо надо хранить слой в современных форматах или базах данных (таких как GeoPackage), либо это поле делать виртуальным, вычисляемым (не сохраняемым).
Попробовал, виртуальное поле сохранилось в csv не обрезанным, в т.ч. через Разбить векторный слой
Спасибо!! Удалось экспортировать весь слой в csv, открыла с помощью блокнота - начинка как раз как у mif. Надо ещё с шапкой поэкспертиментировать и проверить, примет ли их Технокад. Многоконтурные земельные участки и с дырками вырезанными тоже надо ещё попробовать сделать) Благодарю за помощь!!

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 10 апр 2026, 10:57
Елена2026
[/quote]
Последняя попытка ...
Железный Мозг говорит, что строку

Код: Выделить всё

err_code, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(
нужно заменить на

Код: Выделить всё

err_code, _, _, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(
[/quote]
Благодарю! В этот раз Питон ошибку не выдал, сделал экспорт в назначенную папку. Но! Файлы Кугис выгрузил в форматах .tab, .map, .dat, .id, а mif просто включил в название файла (например, 62_12_0010101_4.mif.map). Не любит Кугис формат mif :roll:

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 10 апр 2026, 10:58
Елена2026
Последняя попытка ...
Железный Мозг говорит, что строку

Код: Выделить всё

err_code, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(
нужно заменить на

Код: Выделить всё

err_code, _, _, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(
Благодарю! В этот раз Питон ошибку не выдал, сделал экспорт в назначенную папку. Но! Файлы Кугис выгрузил в форматах .tab, .map, .dat, .id, а mif просто включил в название файла (например, 62_12_0010101_4.mif.map). Не любит Кугис формат mif :roll:

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 10 апр 2026, 16:15
gamm
Мда ... странно и загадочно.
Железный Мозг говорит, что нужно указать другой драйвер
driverName = "MapInfo MIF" вместо driverName = "MapInfo file"

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 13 апр 2026, 08:05
Игорь Белов
В документации GDAL драйвер называется "MapInfo File"
https://gdal.org/en/stable/drivers/vector/mitab.html

Выбор TAB или MIF/MID решает выбор опции -dsco (Dataset Creation Option) "FORMAT=TAB" либо "FORMAT=MIF"
https://gdal.org/en/stable/drivers/vector/mitab.html#dataset-creation-options

IMHO в код надо добавить строку:

Код: Выделить всё

options.datasourceOptions = ["FORMAT=MIF"]

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 13 апр 2026, 12:58
Елена2026
Игорь Белов писал(а):
13 апр 2026, 08:05
В документации GDAL драйвер называется "MapInfo File"
https://gdal.org/en/stable/drivers/vector/mitab.html

Выбор TAB или MIF/MID решает выбор опции -dsco (Dataset Creation Option) "FORMAT=TAB" либо "FORMAT=MIF"
https://gdal.org/en/stable/drivers/vector/mitab.html#dataset-creation-options

IMHO в код надо добавить строку:

Код: Выделить всё

options.datasourceOptions = ["FORMAT=MIF"]
Благодарю за помощь! А не подскажете, куда эту строку вставить? Я попробовала вставить её после других options
options = QgsVectorFileWriter.SaveVectorOptions()
options.driverName = "MapInfo File"
options.fileEncoding = "UTF-8"
options.layerName = base_name
options.datasourceOptions = ["FORMAT=MIF"]
Отступы сохранила, но при выполнении сценария сохранение не происходит. Консоль показывает список ERROR с моими полигонами и внизу "Done. Exported: 0, skipped/errors: 5"
Квадратные скобки не надо убирать? Я попробовала и убирать :D :? , но тоже ошибка вылезла.

Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis

Добавлено: 04 авг 2026, 01:02
no87xis9
Елена, ваше наблюдение про "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.