Поиск полигонов с заданным углом
-
- Активный участник
- Сообщения: 105
- Зарегистрирован: 18 мар 2013, 22:59
- Репутация: 1
- Откуда: Казахстан
Поиск полигонов с заданным углом
Есть слой данных с полигонами. Полигоны (строения на местности) должны иметь строго 90 градусов в поворотных точках. Как построить запрос или какими вообще путями можно из 10 000 объектов выбрать только те которые имеют хотя бы один угол больше или меньше 90 градусов?
-
- Участник
- Сообщения: 51
- Зарегистрирован: 01 июл 2015, 17:46
- Репутация: 37
- Откуда: Черкассы
- Контактная информация:
Re: Поиск полигонов с заданным углом
Написал такой скрипт. Попробуйте запустить.
Код: Выделить всё
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)
-
- Активный участник
- Сообщения: 105
- Зарегистрирован: 18 мар 2013, 22:59
- Репутация: 1
- Откуда: Казахстан
Re: Поиск полигонов с заданным углом
Запустил и в ответ получил
"Запуск алгоритма code 140499...
name 'iface' is not defined See log for more details"
Активный слой тот который анализирую.
"Запуск алгоритма 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
Какая версия QGIS? Как запускаете скрипт?
Редактор материалов, модератор форума
-
- Активный участник
- Сообщения: 105
- Зарегистрирован: 18 мар 2013, 22:59
- Репутация: 1
- Откуда: Казахстан
Re: Поиск полигонов с заданным углом
qgis 2.8.1
Запускаю через панель "Инструменты анализа"
Запускаю через панель "Инструменты анализа"
- Вложения
-
- Screen 001.png (8.04 КБ) 8341 просмотр
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Поиск полигонов с заданным углом
Рекомендую обновить QGIS (к делу не относится).
Запустите через консоль Питон (там есть встроенный редактор скриптов).
Запустите через консоль Питон (там есть встроенный редактор скриптов).
Редактор материалов, модератор форума
-
- Активный участник
- Сообщения: 105
- Зарегистрирован: 18 мар 2013, 22:59
- Репутация: 1
- Откуда: Казахстан
Re: Поиск полигонов с заданным углом
Все заработало! Отлично огромное спасибо.
-
- Участник
- Сообщения: 51
- Зарегистрирован: 01 июл 2015, 17:46
- Репутация: 37
- Откуда: Черкассы
- Контактная информация:
Re: Поиск полигонов с заданным углом
Я тоже запускал через консоль, поэтому скрипт работал.
Для запуска через инструменты анализа нужно подправить код, добавив в начало:
Код целиком:
Для запуска через инструменты анализа нужно подправить код, добавив в начало:
Код: Выделить всё
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)
-
- Активный участник
- Сообщения: 105
- Зарегистрирован: 18 мар 2013, 22:59
- Репутация: 1
- Откуда: Казахстан
Re: Поиск полигонов с заданным углом
Удивительно! Просто превосходно. Огромное спасибо! Работает как надо.
Пользуясь случаем вопрос. Можно ли написать такой скрипт который анализируя растр может выявлять линии/границы полигонов которые неправильно нарисованы или отходят от допустимых значений?
Например на растре есть дом а скрипт мог бы анализировать и распознавать его тем самым определять полигоны которые не соответствуют растру? Интересует в принципе возможность таких манипуляций.
Пользуясь случаем вопрос. Можно ли написать такой скрипт который анализируя растр может выявлять линии/границы полигонов которые неправильно нарисованы или отходят от допустимых значений?
Например на растре есть дом а скрипт мог бы анализировать и распознавать его тем самым определять полигоны которые не соответствуют растру? Интересует в принципе возможность таких манипуляций.
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Поиск полигонов с заданным углом
Будьте добры задавать отдельные вопросы в отдельной теме.
Редактор материалов, модератор форума
-
- Участник
- Сообщения: 51
- Зарегистрирован: 01 июл 2015, 17:46
- Репутация: 37
- Откуда: Черкассы
- Контактная информация:
Re: Поиск полигонов с заданным углом
Спасибо! Рад, что все работает! Это мой первый рабочий скрипт для QGIS (не считая разрабатываемого модуля).
Кто сейчас на конференции
Сейчас этот форум просматривают: Bing [Bot] и 2 гостя