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

Не знаете, где задать вопрос? Задавайте здесь.
ustreb
Интересующийся
Сообщения: 44
Зарегистрирован: 06 июл 2023, 04:41
Репутация: 3
Откуда: календарь

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

Сообщение ustreb » 09 апр 2026, 09:14

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

AlexRomantsov
Завсегдатай
Сообщения: 449
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 168
Ваше звание: хм, сам не знал
Откуда: Томск

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

Сообщение AlexRomantsov » 09 апр 2026, 13:32

забавный вариант пришел в голову:
таблица атрибутов, калькулятор выражений, создаем виртуальное поле (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 КБ) 3311 просмотров

Елена2026
Интересующийся
Сообщения: 21
Зарегистрирован: 26 мар 2026, 19:26
Репутация: 0
Откуда: Россия

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

Сообщение Елена2026 » 09 апр 2026, 15:20

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

Елена2026
Интересующийся
Сообщения: 21
Зарегистрирован: 26 мар 2026, 19:26
Репутация: 0
Откуда: Россия

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

Сообщение Елена2026 » 09 апр 2026, 15:37

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

gamm
Гуру
Сообщения: 4187
Зарегистрирован: 15 окт 2010, 08:33
Репутация: -445565592
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 09 апр 2026, 16:21

Елена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(

AlexRomantsov
Завсегдатай
Сообщения: 449
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 168
Ваше звание: хм, сам не знал
Откуда: Томск

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

Сообщение AlexRomantsov » 10 апр 2026, 05:04

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

AlexRomantsov
Завсегдатай
Сообщения: 449
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 168
Ваше звание: хм, сам не знал
Откуда: Томск

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

Сообщение AlexRomantsov » 10 апр 2026, 05:08

Да, и в примере моя шапка (Version 2 Delimiter "," ...) - с потолка, заменить на свои

Елена2026
Интересующийся
Сообщения: 21
Зарегистрирован: 26 мар 2026, 19:26
Репутация: 0
Откуда: Россия

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

Сообщение Елена2026 » 10 апр 2026, 10:28

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

Елена2026
Интересующийся
Сообщения: 21
Зарегистрирован: 26 мар 2026, 19:26
Репутация: 0
Откуда: Россия

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

Сообщение Елена2026 » 10 апр 2026, 10:57

[/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:

Елена2026
Интересующийся
Сообщения: 21
Зарегистрирован: 26 мар 2026, 19:26
Репутация: 0
Откуда: Россия

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

Сообщение Елена2026 » 10 апр 2026, 10:58

Последняя попытка ...
Железный Мозг говорит, что строку

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

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:

gamm
Гуру
Сообщения: 4187
Зарегистрирован: 15 окт 2010, 08:33
Репутация: -445565592
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 10 апр 2026, 16:15

Мда ... странно и загадочно.
Железный Мозг говорит, что нужно указать другой драйвер
driverName = "MapInfo MIF" вместо driverName = "MapInfo file"

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2243
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1514
Откуда: Казань

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"]
The purpose of computing is insight, not numbers

Елена2026
Интересующийся
Сообщения: 21
Зарегистрирован: 26 мар 2026, 19:26
Репутация: 0
Откуда: Россия

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

Сообщение Елена2026 » 13 апр 2026, 12:58

Игорь Белов писал(а):
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 :? , но тоже ошибка вылезла.

no87xis9
Новоприбывший
Сообщения: 1
Зарегистрирован: 30 июл 2026, 16:17
Репутация: 0
Откуда: Брест

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

Сообщение no87xis9 » 04 авг 2026, 01:02

Елена, ваше наблюдение про "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.

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей