Страница 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
Спасибо за совет, но с АркГисом, боюсь, не получится, так как у нас в гос.организации нельзя устанавливать "крякнутые" программы и вообще всё проверяется ((( Ку-Гис, по идее, тоже нельзя использовать, но хоть это пока разрешили. Покупать лицензию точно не станут ради экспорта файлов... Вот проявляем изобретательность, как можем, чтобы имеющимися средствами ускорить работу.