Страница 1 из 1

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

Добавлено: 31 янв 2013, 13:21
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" и пересохранить файл.

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 байт) 380 скачиваний
Упс.. Не заметил, что про мультилинии речь :roll:

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

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

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

Добавлено: 31 янв 2013, 14:52
Максим Дубинин
можешь приложить пример с MULTILINESTRING? а то под рукой нет попробовать.

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

Добавлено: 31 янв 2013, 15:09
Soitanen
http://yadi.sk/d/sVF0dPrQ2G0Wa - вот на этом всегда валится

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

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

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

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

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

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

Добавлено: 31 янв 2013, 15:38
Максим Дубинин
пример комстроки для изящного (надеюсь) разделения по типам описан тут

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

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

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

Добавлено: 31 янв 2013, 22:54
Александр Мурый
Вот переделанный под разбиение мультилиний скрипт:
ogr_multiline_to_singleline.zip
(715 байт) 365 скачиваний
В файле "osm_motorway_MULTILINESTRING.shp" 4 мультилинии разбились на 19 отдельных полилиний.
osm_motorway_LINESTRING.zip
(4.35 КБ) 377 скачиваний

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

Добавлено: 02 фев 2013, 21:28
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 и утилита его без проблем переварила.

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

Добавлено: 07 фев 2013, 10:53
Александр Мурый
Нашёлся ещё один способ (он, по идее, и должен был прийти в голову первым) — использовать SEXTANTE. В QGIS версии 1.9-dev работает, проверено.

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

Итак: 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 КБ) 9965 просмотров

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

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

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

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