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