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

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

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

Сообщение Soitanen » 31 янв 2013, 13:21

Я использую 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

Сообщение Александр Мурый » 31 янв 2013, 14:26

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

Пример:

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

ogr_multipart_to_singlepart.py multipart-polygons.shp singlepart-polygons.shp
ogr_multipart_to_singlepart.zip
(712 байт) 379 скачиваний
Упс.. Не заметил, что про мультилинии речь :roll:
Редактор материалов, модератор форума

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

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

Сообщение Soitanen » 31 янв 2013, 14:46

С полигонами тоже иногда глючит, я QGISом вручную одну и ту же операцию и линиям и полигонам проводил. Сейчас пробую Ваш скрипт.

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

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

Сообщение Максим Дубинин » 31 янв 2013, 14:52

можешь приложить пример с MULTILINESTRING? а то под рукой нет попробовать.
пристегивайтесь, турбулентность прямо по курсу

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

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

Сообщение Soitanen » 31 янв 2013, 15:09

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

Edit: попробовал вышеприведенный скрипт - как-то сильно много в полигонах теряется после его прохождения. Да и файлов стало меньше - отсутствуют *.cpg и *.prj файлы.

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

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

Сообщение Александр Мурый » 31 янв 2013, 15:18

Soitanen писал(а):http://yadi.sk/d/sVF0dPrQ2G0Wa - вот на этом всегда валится
Валится потому, видимо, что там намешано MULTILINESTRING (10 шт.) и просто LINESTRING (177 шт.). Можно попробовать отделить их и обработать отдельно.
Редактор материалов, модератор форума

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

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

Сообщение Александр Мурый » 31 янв 2013, 15:25

Soitanen писал(а):попробовал вышеприведенный скрипт - как-то сильно много в полигонах теряется после его прохождения. Да и файлов стало меньше - отсутствуют *.cpg и *.prj файлы.
Естественно, скрипт только честно разбивает мультиполигоны и всё. Атрибуты надо как-то копировать (я пока не знаю как), *.cpg и *.prj файлы переносятся простым копированием под новым именем.
Редактор материалов, модератор форума

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

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

Сообщение Максим Дубинин » 31 янв 2013, 15:38

пример комстроки для изящного (надеюсь) разделения по типам описан тут
пристегивайтесь, турбулентность прямо по курсу

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

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

Сообщение Soitanen » 31 янв 2013, 21:56

Сделал скрипт с разделением файлов по типам геометрии (как в примере), но все равно моя конвертирующая утилита вешается на MULTILINESTRING. К примеру на этом файле: http://yadi.sk/d/X2EpFcAh2Gf-a

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

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

Сообщение Александр Мурый » 31 янв 2013, 22:54

Вот переделанный под разбиение мультилиний скрипт:
ogr_multiline_to_singleline.zip
(715 байт) 364 скачивания
В файле "osm_motorway_MULTILINESTRING.shp" 4 мультилинии разбились на 19 отдельных полилиний.
osm_motorway_LINESTRING.zip
(4.35 КБ) 376 скачиваний
Редактор материалов, модератор форума

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

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

Сообщение Soitanen » 02 фев 2013, 21:28

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

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

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

Сообщение Александр Мурый » 07 фев 2013, 10:53

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

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

Итак: 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 КБ) 9942 просмотра
Редактор материалов, модератор форума

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

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

Сообщение Soitanen » 07 фев 2013, 18:55

Пишу с работы, глазами еще не посмотрел, но судя по скринам, получается что все равно часть процесса выполняется руками? А у меня еще и автоматизировать это надо, чтобы из командной строки вызывалось...

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

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

Сообщение Александр Мурый » 07 фев 2013, 20:38

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

Ответить

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

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

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