Тестирование моего плагина «Polygons Parallel to Line»

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Elf » 11 мар 2016, 15:23

Что делает плагин?
Плагин поворачивает полигоны параллельно линиям линейного слоя.
Плагин создан по итогам темы: "Требуются идеи для создания несложного модуля QGIS".

Цель: применить навыки программирования на Python, сделать полезный рабочий плагин за минимальное время.

Добавление плагина в QGIS
В меню Модули\Управление модулями\Параметры нужно поставить крестик напротив "Разрешить установку экспериментальных модулей". Затем найти модуль в общем списке и добавить в QGIS.

Диалоговое окно
  • Select line layer - выбрать линейный слой
  • Select polygon layer - выбрать полигональный слой
  • Rotate only selected polygons - вращать только выделенные полигоны
  • Distance from line - расстояние от линии до центроида полигона, в пределах которого будут обрабатываться полигоны
  • Angle value - максимальное значение угла отклонения полигона относительно линии
  • Rotate by longest edge if both angles between polygon edges and line segment <= 'Angle value' - если оба угла между ребрами полигона и отрезком линии <= значения, указанного в 'Angle value', то вращать по длинному ребру
Алгоритм
Плагин создает пространственный индекс для объектов линейного слоя.
В пределах расстояния, указанного в поле "Distance from line", для каждой линии слоя, выбранного в «Select line layer», плагин находит ближайший полигон слоя, выбранного в «Select polygon layer».
К узлу примыкают два ребра полигона. Если угол между ребром и ближайшим отрезком линии не больше значения, указанного в поле «Angle value», то полигон поворачивается относительно центроида так, что ребро становится параллельным отрезку линии.
В случае, если оба угла между ребрами и отрезком линии меньше «Angle value», то для разворота выбирается то ребро, которое образует меньший угол, если в настройках не отмечено Rotate by longest edge if both angles between polygon edges and line segment <= 'Angle value' .

Что в планах?
  • Добавить возможность сохранения полигонального слоя отдельным файлом. Сделано
  • Оптимизировать код. Сделано
  • Пока писал пояснение, понял, что не указал для обработки вариант, когда азимут отрезка линии и\или ребра полигона равен нулю. Нужно добавить. Исправлено
  • Добавить мультиязычность. Как минимум, сделать меню диалогового окна на русском, описание плагина на русском и английском. Сделано
  • Сделать все комментарии кода на английском и добавить новые. Сделано
  • Нарисовать иконку плагина. Сделано


Тестирование
Прошу протестировать плагин и отписаться здесь или на гитхабе: https://github.com/Elfpkck/polygons_par ... ine/issues
Также прошу учесть, что код начал писать спустя 2 недели курсов по Python. До этого навыков программирования не было.
Последний раз редактировалось Elf 19 сен 2017, 16:40, всего редактировалось 5 раз.

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

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Максим Дубинин » 11 мар 2016, 16:50

оргмоменты, код и плагин не смотрел

1. Уберите из названия плагина и репозитория QGIS_Plugin. Выкиньте это также из about в metadata.ini
2. Вы выбрали неправильную лицензию, вы не можете использовать GPL v3
3. Не комитьте на Github *.pyc файлы, на будущее - не кладите их в архив плагина
4. Заведите себе аккаунт на OSGeo, нормальный make файл и положите архив на plugins.qgis.org/plugins, не важно насколько вы уверены в своем плагине, у вас же стоит experimental=true
https://github.com/nextgis/osminfo/blob/master/Makefile
5. Если вы собираетесь делать i18n, то не хватает файла polygons_parallel_to_line.pro
6. В ридми - html ад
пристегивайтесь, турбулентность прямо по курсу

Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Elf » 11 мар 2016, 17:07

Максим, спасибо! Исправлю.
Максим Дубинин писал(а):2. Вы выбрали неправильную лицензию, вы не можете использовать GPL v3
Поясните, пожалуйста, почему. Какую можно выбрать для свободного распространения?
Максим Дубинин писал(а):6. В ридми - html ад
Этот пункт не понял.

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

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Максим Дубинин » 11 мар 2016, 17:22

потому что QGIS - GPL v2, GPL v3 (который вы выбрали) обратно с GPL v2 не совместим, можно и нужно выбрать GPL v2

readme: https://github.com/Elfpkck/QGIS_Plugin_ ... llelToLine

Но возможно последнее - не шибко важно, это то что наделал плагин билдер. Вообще к нему претензия - очень много какого-то ненужного фуфла добавляет, но пока не страшно. На будущее - лучше его не пользовать имхо, просто взять какой-нибудь аккуратный плагин за основу.

Имхо, здорово было бы дописать http://gis-lab.info/qa/qgis-dev-python.html добавив туда кусок кода про i18n и автоматически рендерящиеся формы.
пристегивайтесь, турбулентность прямо по курсу

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

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Александр Мурый » 11 мар 2016, 22:44

При попытке установить модуль появляется сообщение:
Модуль неисправен
Отсутствует файл метаданных
Редактор материалов, модератор форума

Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Elf » 12 мар 2016, 00:07

Максим, еще раз спасибо!
Вашу статью видел, но с плагин билдером было легче разобраться. Когда разберусь с вашей статьей, переделаю.
Александр Мурый писал(а):При попытке установить модуль появляется сообщение:
Модуль неисправен
Отсутствует файл метаданных
Попробовал сейчас скачать и поставить на ноут, на котором не было плагина. Такой ошибки нет. К сожалению, не знаю, в чем причина.
Одновременно выяснилась другая проблема: плагин работает не так, как на другом компьютере. Что-то не так с кодом. Либо я залил не ту версию, либо что-то еще. Буду разбираться завтра. Пока что нет смысла тестировать.

Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Elf » 21 мар 2016, 23:44

Теперь модуль доступен через официальный репозиторий QGIS. Отредактировал первое сообщение.
По возможности исправил то, на что указал Максим Дубинин. К сожалению, не все, что хотелось, реализовано, но первая главная цель достигнута - модуль работает. Остальное - со временем. По-прежнему прошу тестировать и отписываться здесь или на гитхабе.

Vladimir_R
Активный участник
Сообщения: 145
Зарегистрирован: 14 апр 2010, 14:11
Репутация: 44
Откуда: Екатеринбург

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Vladimir_R » 24 мар 2016, 14:14

Тестировал плагин на небольшом объеме данных, чуть меньше 500 полигональных объектов - полет нормальный. Результат удовлетворительный, то что нужно. Появляются рассогласование между составными частями зданий. Т.е. изначально дом состоит из нескольких корпусов, которые прилегают друг другу, после обработки (разворота одного из корпусов) целостность нарушается. Это нормальное, ожидаемое поведение. После поворота не очень удобно смотреть изменения, было бы хорошо ввести колонку с признаком обработки.
Попробовал использовать плагин в районе с высокой плотностью застройки, результата не дождался. Плагин повесил QGis, не понятно происходит обработка или он просто молчит. Хорошо бы выводить прогресс бар для уведомления пользователя о процессе выполнения.

Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Elf » 29 мар 2016, 16:27

Для больших объемов данных мой код действительно слабоват. Считает относительно долго.
Сейчас делаю рефакторинг. Обнаружил, что изобрел велосипед (поиск минимального расстояния от точки до отрезка). Хочу использовать пространственный индекс для предварительной сортировки. Затем использовать больше методов QGIS API, а не своих. Мультипоточность еще не знаю как делать, но тоже в планах. В сумме это должно упростить код и, главное, значительно ускорить программу. Прогресс бар уже сделал, признак обработки добавлю.
Последний раз редактировалось Elf 29 мар 2016, 17:25, всего редактировалось 1 раз.

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение dab » 29 мар 2016, 17:14

Elf писал(а):...Мультипоточность еще не знаю как делать, но тоже в планах...
Как вариант

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

thread = QThread(iface.mainWindow())
worker.moveToThread(thread)
https://github.com/mbernasocchi/pyqtExp ... example.py

Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Elf » 04 апр 2016, 09:12

В официальном репозитории доступна версия 0.2

Изменения:
  • Значительно возросла скорость благодаря использованию пространственного индекса и методов PyQGIS. К примеру, объем данных, который в версии 0.2 обрабатывается за 80 секунд, в версии 0.1 не был обработан за 2,5 часа (больше ждать не стал)
  • Добавлен прогрессбар
  • Добавлена возможность вращать только выделенные полигоны
  • К полигональному слою добавляется поле "rotated". Для полигонов, которые были повернуты, добавляется значение "1", чтобы была возможность фильтрации
  • Новая иконка
  • Комментарии в коде только на английском
  • Мультиполигоны игнорируются и не вызывают ошибку
В коде я использовал .closestSegmentWithContext для поиска ближайшего отрезка линии для каждой вершины полигона. Либо я чего-то не понял, либо с помощью данного метода нельзя получить координаты или порядковый номер узлов ближайшего отрезка.
Если я правильно понял, то в Питоне нет смысла использовать многопоточность для ускорения. Пытался использовать мультипроцессорность, но в результате получал ошибку и открытие второго окна QGIS(если 2 процесса).

Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Re: Тестирование моего плагина «Polygons Parallel to Line»

Сообщение Elf » 05 апр 2017, 16:50

Версия 0.3

Изменения:
  • Глобальное: плагин “переехал” в “Инструменты анализа” (Processing).
  • Полный рефакторинг кода.
  • В результате “переезда” появилась возможность сохранять результат во временный или постоянный файлы, а также использовать плагин в пакетном режиме.
  • Возможность повернуть выделенные полигоны и сохранить их отдельно либо со всеми остальными.
  • Возможность вращать или игнорировать мультиполигоны.
  • Замечен и исправлен баг: если ближайшей к полигону оказывалась мультиполилиния, то вращения не происходило. Теперь каждая полилиния в составе мультиполилинии рассматривается отдельно.
  • Если не указывать расстояние от линии (0), то проверяются все полигоны.
  • Снова возросла скорость. Для эксперимента были взяты слои с 310 тыс. полигонов и со 140 тыс. линий. Расстояние не указывалось. Предыдущая версия при меньшем количестве операций (не было поворота относительно мультиполилиний) отработала за 1 час, новая — за 1 мин 42 с.
  • Если поле с именем “_rotated” уже существует, то не создается новое поле с именем типа “_rotated_1” (как раньше), а перезаписывается. Если тип поля integer, то значения дозаписываются.
  • Добавлены переводы на русский и украинский.

Ответить

Вернуться в «QGIS»

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

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