Страница 1 из 1
Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 10:27
old_wolf_09
Есть слой данных с полигонами. Полигоны (строения на местности) должны иметь строго 90 градусов в поворотных точках. Как построить запрос или какими вообще путями можно из 10 000 объектов выбрать только те которые имеют хотя бы один угол больше или меньше 90 градусов?
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 14:39
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)
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 15:25
old_wolf_09
Запустил и в ответ получил
"Запуск алгоритма code 140499...
name 'iface' is not defined See log for more details"
Активный слой тот который анализирую.
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 15:28
Александр Мурый
У меня в QGIS 2.14 скрипт сработал как надо.
*old_wolf_09
Какая версия QGIS? Как запускаете скрипт?
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 15:38
old_wolf_09
qgis 2.8.1
Запускаю через панель "Инструменты анализа"
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 15:42
Александр Мурый
Рекомендую обновить QGIS (к делу не относится).
Запустите через консоль Питон (там есть встроенный редактор скриптов).
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 15:54
old_wolf_09
Все заработало! Отлично огромное спасибо.
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 15:55
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)
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 16:06
old_wolf_09
Удивительно! Просто превосходно. Огромное спасибо! Работает как надо.
Пользуясь случаем вопрос. Можно ли написать такой скрипт который анализируя растр может выявлять линии/границы полигонов которые неправильно нарисованы или отходят от допустимых значений?
Например на растре есть дом а скрипт мог бы анализировать и распознавать его тем самым определять полигоны которые не соответствуют растру? Интересует в принципе возможность таких манипуляций.
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 16:11
Александр Мурый
Будьте добры задавать отдельные вопросы в отдельной теме.
Re: Поиск полигонов с заданным углом
Добавлено: 03 мар 2016, 16:17
Elf
Спасибо! Рад, что все работает! Это мой первый рабочий скрипт для QGIS (не считая разрабатываемого модуля).