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

Не знаете, где задать вопрос? Задавайте здесь.
akarelin
Новоприбывший
Сообщения: 14
Зарегистрирован: 10 янв 2021, 17:17
Репутация: 4
Откуда: оттуда

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

Сообщение akarelin » 02 апр 2026, 17:45

А еще можно через MapInfo и утилиту пакетного экспорта таблиц в формат MID/MIF и пакетного импорта файлов MID/MIF в таблицы MapInfo.

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

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

Сообщение gamm » 02 апр 2026, 18:03

Елена2026 писал(а):
01 апр 2026, 14:07
Ну вот нет таких специалистов у нас, даже айтишника бесполезно просить о помощи) Во всём сами разбираемся. Впереди маячит перспектива выгрузки 1,5 тыс.объектов отдельными мифками, очень хочется найти какое-то решение для пакетного экспорта...
выложите сюда небольшой пример, сделаю утилиту на R, но нужно R будет поставить (он и portable есть, с флешки работает). Будет с командной строки работать, на входе имя файла, и имя папки, куда MIF писать. И скажите, как имена из атрибутов генерировать.

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

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

Сообщение Елена2026 » 02 апр 2026, 18:22

akarelin писал(а):
02 апр 2026, 17:28
Так же можно через Сохранить векторные объекты. Так же через пакетный процесс. Там можно сохранить dxf или csv.
Спасибо! Подскажите, пожалуйста, где этот пункт меню? Не удалось найти.

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

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

Сообщение Елена2026 » 02 апр 2026, 18:23

Подскажите, пожалуйста, где этот пункт меню "Сохранить векторные объекты"? Не смогла найти.

akarelin
Новоприбывший
Сообщения: 14
Зарегистрирован: 10 янв 2021, 17:17
Репутация: 4
Откуда: оттуда

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

Сообщение akarelin » 03 апр 2026, 09:34

В левом нижнем углу Qgis окошко (строка) с лупой. Пишите туда сохранить и выбираете из выпадающего списка Сохранить векторные объекты в файл.

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

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

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

Спасибо! Попробую!

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

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

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

gamm писал(а):
02 апр 2026, 18:03
Елена2026 писал(а):
01 апр 2026, 14:07
Ну вот нет таких специалистов у нас, даже айтишника бесполезно просить о помощи) Во всём сами разбираемся. Впереди маячит перспектива выгрузки 1,5 тыс.объектов отдельными мифками, очень хочется найти какое-то решение для пакетного экспорта...
выложите сюда небольшой пример, сделаю утилиту на R, но нужно R будет поставить (он и portable есть, с флешки работает). Будет с командной строки работать, на входе имя файла, и имя папки, куда MIF писать. И скажите, как имена из атрибутов генерировать.
Благодарю! А что в качестве примера выложить?

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

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

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

Елена2026 писал(а):
03 апр 2026, 12:42
Благодарю! А что в качестве примера выложить?
небольшой фрагмент файла, несколько полигонов, координаты и значения полей неважны, можете убрать реальные и поставьте любые. Нужны правильные имена, кодировка, проекция, и прочее. И из какого поля брать имя файла.
Можно для начала попробовать сделать скрипт и запустить его в QGIS (см. ниже), писал Железный Мозг, я не пробовал запускать, попробуйте на тестовых данных Под QGIS 3.40
Скрипт
Спойлер

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

import os
import re
from qgis.core import (
    QgsProject,
    QgsVectorLayer,
    QgsFeature,
    QgsVectorFileWriter,
    QgsCoordinateTransformContext
)

# ====== НАСТРОЙКИ ======
layer_name = 'poly'                       # имя слоя в панели Layers
name_field = 'fname'                      # поле с именами файлов
output_dir = r'D:/QGIS_export_mif'        # папка для результата
overwrite = True                          # True = перезаписывать существующие файлы
# =======================

def safe_filename(s):
    s = str(s).strip()
    s = re.sub(r'[<>:"/\\|?*\x00-\x1f]', '_', s)
    s = re.sub(r'\s+', '_', s)
    s = s.strip(' .')
    return s if s else 'noname'

layers = QgsProject.instance().mapLayersByName(layer_name)
if not layers:
    raise Exception(f'Layer "{layer_name}" not found')

layer = layers[0]

if name_field not in [f.name() for f in layer.fields()]:
    raise Exception(f'Field "{name_field}" not found in layer "{layer_name}"')

if not os.path.exists(output_dir):
    os.makedirs(output_dir)

crs_authid = layer.crs().authid()
geom_type = layer.wkbType()

count_ok = 0
count_skip = 0
used_names = set()

for feat in layer.getFeatures():
    raw_name = feat[name_field]
    base_name = safe_filename(raw_name)

    if base_name in used_names:
        i = 2
        new_name = f"{base_name}_{i}"
        while new_name in used_names:
            i += 1
            new_name = f"{base_name}_{i}"
        base_name = new_name

    used_names.add(base_name)

    out_path = os.path.join(output_dir, base_name + '.mif')

    if os.path.exists(out_path) and not overwrite:
        print(f'SKIP exists: {out_path}')
        count_skip += 1
        continue

    tmp_layer = QgsVectorLayer(f"{QgsVectorLayer(geom_type).wkbType()}?crs={crs_authid}", base_name, "memory")
    # Надёжнее так:
    geom_str = layer.geometryType()
    geom_map = {0: 'Point', 1: 'LineString', 2: 'Polygon'}
    tmp_layer = QgsVectorLayer(f"{geom_map[geom_str]}?crs={crs_authid}", base_name, "memory")

    provider = tmp_layer.dataProvider()
    provider.addAttributes(layer.fields())
    tmp_layer.updateFields()

    new_feat = QgsFeature(tmp_layer.fields())
    new_feat.setGeometry(feat.geometry())
    new_feat.setAttributes(feat.attributes())
    provider.addFeature(new_feat)

    options = QgsVectorFileWriter.SaveVectorOptions()
    options.driverName = "MapInfo File"
    options.fileEncoding = "UTF-8"
    options.layerName = base_name

    err_code, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(
        tmp_layer,
        out_path,
        QgsCoordinateTransformContext(),
        options
    )

    if err_code == QgsVectorFileWriter.NoError:
        print(f'OK: {out_path}')
        count_ok += 1
    else:
        print(f'ERROR: {out_path} | {err_msg}')
        count_skip += 1

print(f'Done. Exported: {count_ok}, skipped/errors: {count_skip}')
Как запустить
Спойлер
Откройте проект в QGIS и убедитесь, что слой называется именно poly в панели Layers.

Проверьте, что в атрибутивной таблице есть поле fname и в нём заполнены имена файлов.

Создайте на диске папку, например D:\QGIS_export_mif, или укажите свой путь в переменной output_dir.

В QGIS откройте Plugins → Python Console.

В окне Python Console нажмите Show Editor.

Вставьте скрипт в редактор.

При необходимости поменяйте вверху три строки:

layer_name = 'poly'

name_field = 'fname'

output_dir = r'D:/QGIS_export_mif'

Нажмите Run Script.

После выполнения в указанной папке появятся пары файлов .mif и .mid, по одному на каждый полигон. MapInfo MIF/MID создаётся как набор файлов, причём слой можно задавать через имя .mif файла.

Что важно проверить
Значения fname должны быть по возможности уникальными, иначе скрипт добавит суффиксы _2, _3 и так далее.

Недопустимые для Windows символы в имени файла (\ / : * ? " < > |) автоматически заменяются на _.

Если у вас нужна кодировка CP1251, можно заменить строку
options.fileEncoding = "UTF-8"
на
options.fileEncoding = "CP1251"; QGIS/GDAL поддерживают запись MapInfo через параметры writer-а, но фактическая поддержка кодировки также зависит от драйвера GDAL в вашей сборке QGIS.

Если скрипт выдаст ошибку
Чаще всего причины такие:

слой в панели называется не poly, а, например, poly.shp;

поле называется не fname, а FNAME или file_name;

папка output_dir недоступна для записи;

в проекте есть мультгеометрии/неполигональные объекты, а слой ожидается как polygon layer.

Ниже более надёжный вариант с выбором активного слоя, если не хочется зависеть от имени слоя:

python
layer = iface.activeLayer()
name_field = 'fname'
output_dir = r'D:/QGIS_export_mif'
Тогда перед запуском просто выделите слой poly в панели Layers.

olenna
Новоприбывший
Сообщения: 1
Зарегистрирован: Вчера, 11:55
Репутация: 0
Откуда: Москва
Контактная информация:

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

Сообщение olenna » Вчера, 11:58

Елена2026 писал(а):
26 мар 2026, 20:30
Здравствуйте! Не нашла в форуме ответ на интересующий меня вопрос, поэтому задам его здесь.

Q-gis осваивать мы на работе начали недавно, опишу кратко суть проблемы.
Мы ведём комплексные кадастровые работы по кварталам, в Q-gis у нас есть векторные слои, в которых мы создаём полигонами контуры земельных участков, зданий. То есть, вот проект - это квартал кадастровый, в нём отдельный слой - для земли, отдельный слой - для зданий и т.д. В слоях, получается, может быть несколько сотен контуров. Потом нам надо экспортировать каждый контур в mif и присвоить ему название (кадастровый номер). Вручную делать долго, так как сотни объектов у нас, а времени в обрез.

Вопрос такой: можно ли как-то настроить пакетный экспорт из слоя, чтобы каждый контур сохранялся отдельным mif -файлом и к нему притягивался соответствующий атрибут из таблицы (кадастровый номер)?

Заранее благодарю форумчан всех за удалённое внимание и ответы))
Да, в QGIS можно пакетно экспортировать объекты с помощью инструмента «Разделить векторный слой», указав поле с кадастровым номером как уникальный идентификатор. Затем задайте формат вывода MIF/MID, чтобы каждый контур сохранялся отдельным файлом с нужным именем.

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

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

Сообщение Елена2026 » Вчера, 17:01

gamm писал(а):
04 апр 2026, 05:35
Елена2026 писал(а):
03 апр 2026, 12:42
Благодарю! А что в качестве примера выложить?
небольшой фрагмент файла, несколько полигонов, координаты и значения полей неважны, можете убрать реальные и поставьте любые. Нужны правильные имена, кодировка, проекция, и прочее. И из какого поля брать имя файла.
Можно для начала попробовать сделать скрипт и запустить его в QGIS (см. ниже), писал Железный Мозг, я не пробовал запускать, попробуйте на тестовых данных Под QGIS 3.40
Скрипт
Спойлер

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

import os
import re
from qgis.core import (
    QgsProject,
    QgsVectorLayer,
    QgsFeature,
    QgsVectorFileWriter,
    QgsCoordinateTransformContext
)

# ====== НАСТРОЙКИ ======
layer_name = 'poly'                       # имя слоя в панели Layers
name_field = 'fname'                      # поле с именами файлов
output_dir = r'D:/QGIS_export_mif'        # папка для результата
overwrite = True                          # True = перезаписывать существующие файлы
# =======================

def safe_filename(s):
    s = str(s).strip()
    s = re.sub(r'[<>:"/\\|?*\x00-\x1f]', '_', s)
    s = re.sub(r'\s+', '_', s)
    s = s.strip(' .')
    return s if s else 'noname'

layers = QgsProject.instance().mapLayersByName(layer_name)
if not layers:
    raise Exception(f'Layer "{layer_name}" not found')

layer = layers[0]

if name_field not in [f.name() for f in layer.fields()]:
    raise Exception(f'Field "{name_field}" not found in layer "{layer_name}"')

if not os.path.exists(output_dir):
    os.makedirs(output_dir)

crs_authid = layer.crs().authid()
geom_type = layer.wkbType()

count_ok = 0
count_skip = 0
used_names = set()

for feat in layer.getFeatures():
    raw_name = feat[name_field]
    base_name = safe_filename(raw_name)

    if base_name in used_names:
        i = 2
        new_name = f"{base_name}_{i}"
        while new_name in used_names:
            i += 1
            new_name = f"{base_name}_{i}"
        base_name = new_name

    used_names.add(base_name)

    out_path = os.path.join(output_dir, base_name + '.mif')

    if os.path.exists(out_path) and not overwrite:
        print(f'SKIP exists: {out_path}')
        count_skip += 1
        continue

    tmp_layer = QgsVectorLayer(f"{QgsVectorLayer(geom_type).wkbType()}?crs={crs_authid}", base_name, "memory")
    # Надёжнее так:
    geom_str = layer.geometryType()
    geom_map = {0: 'Point', 1: 'LineString', 2: 'Polygon'}
    tmp_layer = QgsVectorLayer(f"{geom_map[geom_str]}?crs={crs_authid}", base_name, "memory")

    provider = tmp_layer.dataProvider()
    provider.addAttributes(layer.fields())
    tmp_layer.updateFields()

    new_feat = QgsFeature(tmp_layer.fields())
    new_feat.setGeometry(feat.geometry())
    new_feat.setAttributes(feat.attributes())
    provider.addFeature(new_feat)

    options = QgsVectorFileWriter.SaveVectorOptions()
    options.driverName = "MapInfo File"
    options.fileEncoding = "UTF-8"
    options.layerName = base_name

    err_code, err_msg = QgsVectorFileWriter.writeAsVectorFormatV3(
        tmp_layer,
        out_path,
        QgsCoordinateTransformContext(),
        options
    )

    if err_code == QgsVectorFileWriter.NoError:
        print(f'OK: {out_path}')
        count_ok += 1
    else:
        print(f'ERROR: {out_path} | {err_msg}')
        count_skip += 1

print(f'Done. Exported: {count_ok}, skipped/errors: {count_skip}')
Как запустить
Спойлер
Откройте проект в QGIS и убедитесь, что слой называется именно poly в панели Layers.

Проверьте, что в атрибутивной таблице есть поле fname и в нём заполнены имена файлов.

Создайте на диске папку, например D:\QGIS_export_mif, или укажите свой путь в переменной output_dir.

В QGIS откройте Plugins → Python Console.

В окне Python Console нажмите Show Editor.

Вставьте скрипт в редактор.

При необходимости поменяйте вверху три строки:

layer_name = 'poly'

name_field = 'fname'

output_dir = r'D:/QGIS_export_mif'

Нажмите Run Script.

После выполнения в указанной папке появятся пары файлов .mif и .mid, по одному на каждый полигон. MapInfo MIF/MID создаётся как набор файлов, причём слой можно задавать через имя .mif файла.

Что важно проверить
Значения fname должны быть по возможности уникальными, иначе скрипт добавит суффиксы _2, _3 и так далее.

Недопустимые для Windows символы в имени файла (\ / : * ? " < > |) автоматически заменяются на _.

Если у вас нужна кодировка CP1251, можно заменить строку
options.fileEncoding = "UTF-8"
на
options.fileEncoding = "CP1251"; QGIS/GDAL поддерживают запись MapInfo через параметры writer-а, но фактическая поддержка кодировки также зависит от драйвера GDAL в вашей сборке QGIS.

Если скрипт выдаст ошибку
Чаще всего причины такие:

слой в панели называется не poly, а, например, poly.shp;

поле называется не fname, а FNAME или file_name;

папка output_dir недоступна для записи;

в проекте есть мультгеометрии/неполигональные объекты, а слой ожидается как polygon layer.

Ниже более надёжный вариант с выбором активного слоя, если не хочется зависеть от имени слоя:

python
layer = iface.activeLayer()
name_field = 'fname'
output_dir = r'D:/QGIS_export_mif'
Тогда перед запуском просто выделите слой poly в панели Layers.


Спасибо, попробовала) Моя познания в программировании, к сожалению, на начальном уровне... Вроде бы всё сделала по инструкции, слои создала и атрибуты задала с нужными именами, заменила путь в выходную папку, но ошибку выдаёт Питон.

Traceback (most recent call last):
File "<input>", line 1, in <module>
File "Untitled-0", line 65, in <module>
TypeError: QgsVectorLayer(): argument 1 has unexpected type 'WkbType'

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

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

Сообщение Елена2026 » Вчера, 17:29

olenna писал(а):
Вчера, 11:58
Елена2026 писал(а):
26 мар 2026, 20:30
Здравствуйте! Не нашла в форуме ответ на интересующий меня вопрос, поэтому задам его здесь.

Q-gis осваивать мы на работе начали недавно, опишу кратко суть проблемы.
Мы ведём комплексные кадастровые работы по кварталам, в Q-gis у нас есть векторные слои, в которых мы создаём полигонами контуры земельных участков, зданий. То есть, вот проект - это квартал кадастровый, в нём отдельный слой - для земли, отдельный слой - для зданий и т.д. В слоях, получается, может быть несколько сотен контуров. Потом нам надо экспортировать каждый контур в mif и присвоить ему название (кадастровый номер). Вручную делать долго, так как сотни объектов у нас, а времени в обрез.

Вопрос такой: можно ли как-то настроить пакетный экспорт из слоя, чтобы каждый контур сохранялся отдельным mif -файлом и к нему притягивался соответствующий атрибут из таблицы (кадастровый номер)?

Заранее благодарю форумчан всех за удалённое внимание и ответы))
Да, в QGIS можно пакетно экспортировать объекты с помощью инструмента «Разделить векторный слой», указав поле с кадастровым номером как уникальный идентификатор. Затем задайте формат вывода MIF/MID, чтобы каждый контур сохранялся отдельным файлом с нужным именем.

Спасибо за ответ! Но у нас в Q-gis не расширения mif в меню "Разделить векторный слой", только tab, а его опять надо конвертировать в большом объёме.

Ответить

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

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

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