Поиск полигонов с заданным углом

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
old_wolf_09
Активный участник
Сообщения: 105
Зарегистрирован: 18 мар 2013, 22:59
Репутация: 1
Откуда: Казахстан

Поиск полигонов с заданным углом

Сообщение old_wolf_09 »

Есть слой данных с полигонами. Полигоны (строения на местности) должны иметь строго 90 градусов в поворотных точках. Как построить запрос или какими вообще путями можно из 10 000 объектов выбрать только те которые имеют хотя бы один угол больше или меньше 90 градусов?
Elf
Участник
Сообщения: 51
Зарегистрирован: 01 июл 2015, 17:46
Репутация: 37
Откуда: Черкассы
Контактная информация:

Re: Поиск полигонов с заданным углом

Сообщение Elf »

Написал такой скрипт. Попробуйте запустить.

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

layer = iface.activeLayer()
dict = {}
for polygon in layer.getFeatures():
c = []
z = []
a = []
for node in polygon.geometry().asPolygon()[0]:
a.append(node)
line = QgsGeometry.fromPolyline(a)

x = 0
while x < len(line.asPolyline()) - 1:
line_start = QgsPoint(line.asPolyline()[x])
line_end = QgsPoint(line.asPolyline()[x+1])
c.append(line_start.azimuth(line_end))
x += 1

x = 0
while x < len(c) - 1:
z.append(round(abs(c[x] - c[x+1])))
if x == len(c) - 2:
z.append(round(abs(c[x+1] - c[0])))
x += 1
d = {polygon.id(): z}
dict.update(d)

sel = []
for key in dict:
for i in dict.get(key):
if (int(i) % 90) != 0:
sel.append(key)

layer.select(sel)
old_wolf_09
Активный участник
Сообщения: 105
Зарегистрирован: 18 мар 2013, 22:59
Репутация: 1
Откуда: Казахстан

Re: Поиск полигонов с заданным углом

Сообщение old_wolf_09 »

Запустил и в ответ получил

"Запуск алгоритма code 140499...
name 'iface' is not defined See log for more details"

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

Re: Поиск полигонов с заданным углом

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

У меня в QGIS 2.14 скрипт сработал как надо.
*old_wolf_09
Какая версия QGIS? Как запускаете скрипт?
Редактор материалов, модератор форума
old_wolf_09
Активный участник
Сообщения: 105
Зарегистрирован: 18 мар 2013, 22:59
Репутация: 1
Откуда: Казахстан

Re: Поиск полигонов с заданным углом

Сообщение old_wolf_09 »

qgis 2.8.1

Запускаю через панель "Инструменты анализа"
Вложения
Screen 001.png
Screen 001.png (8.04 КБ) 8602 просмотра
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Поиск полигонов с заданным углом

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

Рекомендую обновить QGIS (к делу не относится).
Запустите через консоль Питон (там есть встроенный редактор скриптов).
Редактор материалов, модератор форума
old_wolf_09
Активный участник
Сообщения: 105
Зарегистрирован: 18 мар 2013, 22:59
Репутация: 1
Откуда: Казахстан

Re: Поиск полигонов с заданным углом

Сообщение old_wolf_09 »

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

Re: Поиск полигонов с заданным углом

Сообщение Elf »

Я тоже запускал через консоль, поэтому скрипт работал.
Для запуска через инструменты анализа нужно подправить код, добавив в начало:

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

from qgis.core import *
from qgis.utils import *


Код целиком:

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

'''
Скрипт выделяет все полигоны данного слоя, углы при вершинах которых
не прямые
'''
from qgis.core import *
from qgis.utils import *
layer = iface.activeLayer()
dict = {}
for polygon in layer.getFeatures():
c = []
z = []
a = []
for node in polygon.geometry().asPolygon()[0]:
a.append(node)
line = QgsGeometry.fromPolyline(a)

x = 0
while x < len(line.asPolyline()) - 1:
line_start = QgsPoint(line.asPolyline()[x])
line_end = QgsPoint(line.asPolyline()[x+1])
c.append(line_start.azimuth(line_end))
x += 1

x = 0
while x < len(c) - 1:
z.append(round(abs(c[x] - c[x+1])))
if x == len(c) - 2:
z.append(round(abs(c[x+1] - c[0])))
x += 1
d = {polygon.id(): z}
dict.update(d)

sel = []
for key in dict:
for i in dict.get(key):
if (int(i) % 90) != 0:
sel.append(key)

layer.select(sel)
old_wolf_09
Активный участник
Сообщения: 105
Зарегистрирован: 18 мар 2013, 22:59
Репутация: 1
Откуда: Казахстан

Re: Поиск полигонов с заданным углом

Сообщение old_wolf_09 »

Удивительно! Просто превосходно. Огромное спасибо! Работает как надо.

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

Re: Поиск полигонов с заданным углом

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

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

Re: Поиск полигонов с заданным углом

Сообщение Elf »

Спасибо! Рад, что все работает! Это мой первый рабочий скрипт для QGIS (не считая разрабатываемого модуля).
Ответить

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

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

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