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

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

Добавлено: 02 апр 2026, 17:45
akarelin
А еще можно через MapInfo и утилиту пакетного экспорта таблиц в формат MID/MIF и пакетного импорта файлов MID/MIF в таблицы MapInfo.

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

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

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

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

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

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

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

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

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

Добавлено: 03 апр 2026, 09:57
Елена2026
Спасибо! Попробую!

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

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

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

Добавлено: 04 апр 2026, 05:35
gamm
Елена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.

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

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

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

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

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

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

Добавлено: 07 апр 2026, 17:01
Елена2026
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'

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

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

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

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

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

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

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

Добавлено: 08 апр 2026, 06:14
gamm
Елена2026 писал(а):
07 апр 2026, 17:01
Спасибо, попробовала) Моя познания в программировании, к сожалению, на начальном уровне... Вроде бы всё сделала по инструкции, слои создала и атрибуты задала с нужными именами, заменила путь в выходную папку, но ошибку выдаёт Питон.

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'
я в qgis-ном питоне не силен, а железный мозг перемудрил, похоже, и сам себя поправил, но мудреж убрать забыл. Попробуйте заменить строки

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

    
    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")
на такие (у вас же заранее известно, что полигоны), сохраняя тот же отступ текста (в питоне это важно)

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

 
    geom_map = {0: 'Point', 1: 'LineString', 2: 'Polygon'}
    tmp_layer = QgsVectorLayer(f"{geom_map[2]}?crs={crs_authid}", base_name, "memory")

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

Добавлено: 08 апр 2026, 11:17
Елена2026
Спасибо за помощь, но всё равно не выполняется скрипт, выдает ошибку.
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)

Хотелось бы поизучать Python, разобраться во всём, если бы в сутках было хотя бы 27 часов))

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

Добавлено: 09 апр 2026, 07:05
ustreb
Приветствую, попробуйте инструментом Quick Export в программе Arc GIS (ESRI). Возьмите ломанную версию для получения всех возможностей инструментов (spacial analyst, 3D analyst...)

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

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