Помощь в написании скрипта на PYQGIS

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
Soitanen
Интересующийся
Сообщения: 42
Зарегистрирован: 21 авг 2012, 18:18
Репутация: 0

Помощь в написании скрипта на PYQGIS

Сообщение Soitanen »

Я использую shp файлы, который отдает нам Гис-Лаб для генерации сценария в игру FlightGear. Утилита, которая обрабатывает shp файлы очень плохо переваривает геометрию типа MULTILINESTRING (так мне объяснили сами ее создатели). И действительно, она часто вылетала с моими исходными данными.
Я пробовал ставить в вызов ogr2ogr -nlt LINESTRING, но это не помогло. Для чистоты эксперимента переделал MULTILINESTRING в LINESTRING вручную в QGIS (Vector->Geometry tools->Multipart to single parts) и все заработало.

Нашел, что для автомтатизации процесса (а у меня все этим занимается скрипт на баше) можно использовать QGIS API без запуска самого QGIS, написав скрипт на Питоне.
Начало у меня такое:

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

from qgis.core import *
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

vlayer = QgsVectorLayer("m.shp", "motorway", "ogr")
if not vlayer.isValid():
  print "Layer failed to load!"

QgsApplication.exitQgis()
А вот что делать дальше - никак не пойму. Пытаюсь врубиться в http://qgis.org/api/classQgsGeometry.html, но тоже ничего в голову не лезет.
Может как-то можно посмотреть, какие команды отдаются в QGIS API, когда я работаю с графическим интерфейсом, чтобы на их основе потом написать свой скрипт? Т.е. мне надо загрузить shp, произвести некое действие "Multipart to single parts" и пересохранить файл.
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Помощь в написании скрипта на PYQGIS

Сообщение Александр Мурый »

Не совсем про QGIS, но всё же.
Нашёл питон-скрипт с использованием GDAL/OGR и добавил некоторые удобства.

Пример:

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

ogr_multipart_to_singlepart.py multipart-polygons.shp singlepart-polygons.shp
ogr_multipart_to_singlepart.zip
(712 байт) 381 скачивание
Упс.. Не заметил, что про мультилинии речь :roll:
Редактор материалов, модератор форума
Soitanen
Интересующийся
Сообщения: 42
Зарегистрирован: 21 авг 2012, 18:18
Репутация: 0

Re: Помощь в написании скрипта на PYQGIS

Сообщение Soitanen »

С полигонами тоже иногда глючит, я QGISом вручную одну и ту же операцию и линиям и полигонам проводил. Сейчас пробую Ваш скрипт.
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Помощь в написании скрипта на PYQGIS

Сообщение Максим Дубинин »

можешь приложить пример с MULTILINESTRING? а то под рукой нет попробовать.
пристегивайтесь, турбулентность прямо по курсу
Soitanen
Интересующийся
Сообщения: 42
Зарегистрирован: 21 авг 2012, 18:18
Репутация: 0

Re: Помощь в написании скрипта на PYQGIS

Сообщение Soitanen »

http://yadi.sk/d/sVF0dPrQ2G0Wa - вот на этом всегда валится

Edit: попробовал вышеприведенный скрипт - как-то сильно много в полигонах теряется после его прохождения. Да и файлов стало меньше - отсутствуют *.cpg и *.prj файлы.
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Помощь в написании скрипта на PYQGIS

Сообщение Александр Мурый »

Soitanen писал(а):http://yadi.sk/d/sVF0dPrQ2G0Wa - вот на этом всегда валится
Валится потому, видимо, что там намешано MULTILINESTRING (10 шт.) и просто LINESTRING (177 шт.). Можно попробовать отделить их и обработать отдельно.
Редактор материалов, модератор форума
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Помощь в написании скрипта на PYQGIS

Сообщение Александр Мурый »

Soitanen писал(а):попробовал вышеприведенный скрипт - как-то сильно много в полигонах теряется после его прохождения. Да и файлов стало меньше - отсутствуют *.cpg и *.prj файлы.
Естественно, скрипт только честно разбивает мультиполигоны и всё. Атрибуты надо как-то копировать (я пока не знаю как), *.cpg и *.prj файлы переносятся простым копированием под новым именем.
Редактор материалов, модератор форума
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Помощь в написании скрипта на PYQGIS

Сообщение Максим Дубинин »

пример комстроки для изящного (надеюсь) разделения по типам описан тут
пристегивайтесь, турбулентность прямо по курсу
Soitanen
Интересующийся
Сообщения: 42
Зарегистрирован: 21 авг 2012, 18:18
Репутация: 0

Re: Помощь в написании скрипта на PYQGIS

Сообщение Soitanen »

Сделал скрипт с разделением файлов по типам геометрии (как в примере), но все равно моя конвертирующая утилита вешается на MULTILINESTRING. К примеру на этом файле: http://yadi.sk/d/X2EpFcAh2Gf-a
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Помощь в написании скрипта на PYQGIS

Сообщение Александр Мурый »

Вот переделанный под разбиение мультилиний скрипт:
ogr_multiline_to_singleline.zip
(715 байт) 365 скачиваний
В файле "osm_motorway_MULTILINESTRING.shp" 4 мультилинии разбились на 19 отдельных полилиний.
osm_motorway_LINESTRING.zip
(4.35 КБ) 378 скачиваний
Редактор материалов, модератор форума
Soitanen
Интересующийся
Сообщения: 42
Зарегистрирован: 21 авг 2012, 18:18
Репутация: 0

Re: Помощь в написании скрипта на PYQGIS

Сообщение Soitanen »

Только сейчас добрался до компьютера. Обработанный этим скриптом вариант тоже валится -

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

Sat Feb 2 22:25:02 MSK 2013 Decoding osm_motorway
ogr-decode version 2.1.0

Processing datasource /home/michael/test/osm2fg/data/shapefiles/osm_motorway
Floating point exception (core dumped)
Обидно...
Для чистоты эксперимента загрузил уже обработанный скриптом файл в QGIS, сделал ему Multipart to single parts и утилита его без проблем переварила.
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Помощь в написании скрипта на PYQGIS

Сообщение Александр Мурый »

Нашёлся ещё один способ (он, по идее, и должен был прийти в голову первым) — использовать SEXTANTE. В QGIS версии 1.9-dev работает, проверено.

qgis-sextante-1.png
qgis-sextante-1.png (32.83 КБ) 9986 просмотров

Итак: Analysis --> SEXTANTE toolbox --> QGIS Geoalgorithms --> Vector geometry tools --> Multipart to singleparts --> ПКМ --> Execute as batch process --> щёлкаем в графе "Input layer" на первую кнопку и выделяем все *.shp в каталоге --> в графе "Output layer" пишем что-то типа префикса для выходных файлов (например, "out"), далее делаем, как на скриншоте ниже.
qgis-sextante-2.png
qgis-sextante-2.png (17.66 КБ) 9986 просмотров
Редактор материалов, модератор форума
Soitanen
Интересующийся
Сообщения: 42
Зарегистрирован: 21 авг 2012, 18:18
Репутация: 0

Re: Помощь в написании скрипта на PYQGIS

Сообщение Soitanen »

Пишу с работы, глазами еще не посмотрел, но судя по скринам, получается что все равно часть процесса выполняется руками? А у меня еще и автоматизировать это надо, чтобы из командной строки вызывалось...
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Помощь в написании скрипта на PYQGIS

Сообщение Александр Мурый »

Soitanen писал(а):у меня еще и автоматизировать это надо, чтобы из командной строки вызывалось...
У меня автоматизировать получилось только пока из питон-консоли QGIS. Но, как я понимаю, можно сделать автономный питон-скрипт с исп-ем SEXTANTE.
Редактор материалов, модератор форума
Ответить

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

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

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