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

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

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

Сообщение old_wolf_09 » 03 мар 2016, 10:27

Есть слой данных с полигонами. Полигоны (строения на местности) должны иметь строго 90 градусов в поворотных точках. Как построить запрос или какими вообще путями можно из 10 000 объектов выбрать только те которые имеют хотя бы один угол больше или меньше 90 градусов?

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

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

Сообщение Elf » 03 мар 2016, 14:39

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

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

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 » 03 мар 2016, 15:25

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

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

Активный слой тот который анализирую.

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

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

Сообщение Александр Мурый » 03 мар 2016, 15:28

У меня в QGIS 2.14 скрипт сработал как надо.
*old_wolf_09
Какая версия QGIS? Как запускаете скрипт?
Редактор материалов, модератор форума

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

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

Сообщение old_wolf_09 » 03 мар 2016, 15:38

qgis 2.8.1

Запускаю через панель "Инструменты анализа"
Вложения
Screen 001.png
Screen 001.png (8.04 КБ) 8338 просмотров

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

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

Сообщение Александр Мурый » 03 мар 2016, 15:42

Рекомендую обновить QGIS (к делу не относится).
Запустите через консоль Питон (там есть встроенный редактор скриптов).
Редактор материалов, модератор форума

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

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

Сообщение old_wolf_09 » 03 мар 2016, 15:54

Все заработало! Отлично огромное спасибо.

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

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

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

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

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

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 » 03 мар 2016, 16:06

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

Пользуясь случаем вопрос. Можно ли написать такой скрипт который анализируя растр может выявлять линии/границы полигонов которые неправильно нарисованы или отходят от допустимых значений?
Например на растре есть дом а скрипт мог бы анализировать и распознавать его тем самым определять полигоны которые не соответствуют растру? Интересует в принципе возможность таких манипуляций.

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

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

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

Будьте добры задавать отдельные вопросы в отдельной теме.
Редактор материалов, модератор форума

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

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

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

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

Ответить

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

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

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