Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
-
akarelin
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 10 янв 2021, 17:17
- Репутация: 4
- Откуда: оттуда
Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
А еще можно через MapInfo и утилиту пакетного экспорта таблиц в формат MID/MIF и пакетного импорта файлов MID/MIF в таблицы MapInfo.
-
gamm
- Гуру
- Сообщения: 4181
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: -445565593
- Ваше звание: программист
- Откуда: Казань
Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
выложите сюда небольшой пример, сделаю утилиту на R, но нужно R будет поставить (он и portable есть, с флешки работает). Будет с командной строки работать, на входе имя файла, и имя папки, куда MIF писать. И скажите, как имена из атрибутов генерировать.
-
Елена2026
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 26 мар 2026, 19:26
- Репутация: 0
- Откуда: Россия
-
Елена2026
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 26 мар 2026, 19:26
- Репутация: 0
- Откуда: Россия
Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
Подскажите, пожалуйста, где этот пункт меню "Сохранить векторные объекты"? Не смогла найти.
-
akarelin
- Новоприбывший
- Сообщения: 14
- Зарегистрирован: 10 янв 2021, 17:17
- Репутация: 4
- Откуда: оттуда
Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
В левом нижнем углу Qgis окошко (строка) с лупой. Пишите туда сохранить и выбираете из выпадающего списка Сохранить векторные объекты в файл.
-
Елена2026
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 26 мар 2026, 19:26
- Репутация: 0
- Откуда: Россия
-
Елена2026
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 26 мар 2026, 19:26
- Репутация: 0
- Откуда: Россия
Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
Благодарю! А что в качестве примера выложить?
-
gamm
- Гуру
- Сообщения: 4181
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: -445565593
- Ваше звание: программист
- Откуда: Казань
Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
небольшой фрагмент файла, несколько полигонов, координаты и значения полей неважны, можете убрать реальные и поставьте любые. Нужны правильные имена, кодировка, проекция, и прочее. И из какого поля брать имя файла.
Можно для начала попробовать сделать скрипт и запустить его в 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.
Проверьте, что в атрибутивной таблице есть поле 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
Да, в QGIS можно пакетно экспортировать объекты с помощью инструмента «Разделить векторный слой», указав поле с кадастровым номером как уникальный идентификатор. Затем задайте формат вывода MIF/MID, чтобы каждый контур сохранялся отдельным файлом с нужным именем.Елена2026 писал(а): ↑26 мар 2026, 20:30Здравствуйте! Не нашла в форуме ответ на интересующий меня вопрос, поэтому задам его здесь.
Q-gis осваивать мы на работе начали недавно, опишу кратко суть проблемы.
Мы ведём комплексные кадастровые работы по кварталам, в Q-gis у нас есть векторные слои, в которых мы создаём полигонами контуры земельных участков, зданий. То есть, вот проект - это квартал кадастровый, в нём отдельный слой - для земли, отдельный слой - для зданий и т.д. В слоях, получается, может быть несколько сотен контуров. Потом нам надо экспортировать каждый контур в mif и присвоить ему название (кадастровый номер). Вручную делать долго, так как сотни объектов у нас, а времени в обрез.
Вопрос такой: можно ли как-то настроить пакетный экспорт из слоя, чтобы каждый контур сохранялся отдельным mif -файлом и к нему притягивался соответствующий атрибут из таблицы (кадастровый номер)?
Заранее благодарю форумчан всех за удалённое внимание и ответы))
-
Елена2026
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 26 мар 2026, 19:26
- Репутация: 0
- Откуда: Россия
Re: Пакетный экспорт отдельных контуров в формате mif из векторного слоя в программе Q-gis
gamm писал(а): ↑04 апр 2026, 05:35небольшой фрагмент файла, несколько полигонов, координаты и значения полей неважны, можете убрать реальные и поставьте любые. Нужны правильные имена, кодировка, проекция, и прочее. И из какого поля брать имя файла.
Можно для начала попробовать сделать скрипт и запустить его в 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
olenna писал(а): ↑Вчера, 11:58Да, в QGIS можно пакетно экспортировать объекты с помощью инструмента «Разделить векторный слой», указав поле с кадастровым номером как уникальный идентификатор. Затем задайте формат вывода MIF/MID, чтобы каждый контур сохранялся отдельным файлом с нужным именем.Елена2026 писал(а): ↑26 мар 2026, 20:30Здравствуйте! Не нашла в форуме ответ на интересующий меня вопрос, поэтому задам его здесь.
Q-gis осваивать мы на работе начали недавно, опишу кратко суть проблемы.
Мы ведём комплексные кадастровые работы по кварталам, в Q-gis у нас есть векторные слои, в которых мы создаём полигонами контуры земельных участков, зданий. То есть, вот проект - это квартал кадастровый, в нём отдельный слой - для земли, отдельный слой - для зданий и т.д. В слоях, получается, может быть несколько сотен контуров. Потом нам надо экспортировать каждый контур в mif и присвоить ему название (кадастровый номер). Вручную делать долго, так как сотни объектов у нас, а времени в обрез.
Вопрос такой: можно ли как-то настроить пакетный экспорт из слоя, чтобы каждый контур сохранялся отдельным mif -файлом и к нему притягивался соответствующий атрибут из таблицы (кадастровый номер)?
Заранее благодарю форумчан всех за удалённое внимание и ответы))
Спасибо за ответ! Но у нас в Q-gis не расширения mif в меню "Разделить векторный слой", только tab, а его опять надо конвертировать в большом объёме.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость