0% acharam este documento útil (0 voto)
20 visualizações2 páginas

Diálogo para Seleção de Camadas no QGIS

Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
20 visualizações2 páginas

Diálogo para Seleção de Camadas no QGIS

Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd

# Importe a biblioteca QGIS

from [Link] import *


from [Link] import QgsMapLayerComboBox
from [Link] import iface
from [Link] import QVBoxLayout, QLabel, QDialog, QDialogButtonBox,
QListWidget, QListWidgetItem

# Função para filtrar as camadas do tipo Polígono


def filter_polygons(map_layers):
if hasattr(QgsMapLayerType, 'PolygonLayer'): # Verifica se o atributo
PolygonLayer está disponível
return [layer for layer in map_layers if [Link]() ==
[Link]]
else:
return [layer for layer in map_layers if [Link]() ==
[Link]]

# Classe para criar o diálogo com os campos de seleção


class CamadasDialog(QDialog):
def __init__(self, parent=None):
super(CamadasDialog, self).__init__(parent)

layout = QVBoxLayout(self)
[Link]('Selecione as Camadas')

self.label_camada_entrada = QLabel('Camada de Entrada:')


[Link](self.label_camada_entrada)

self.combo_camada_entrada = QgsMapLayerComboBox(self)
self.combo_camada_entrada.setFilters([Link]) #
Usamos VectorLayer para versões mais antigas
[Link](self.combo_camada_entrada)

self.label_camada_sobreposicao = QLabel('Camadas de Comparação:')


[Link](self.label_camada_sobreposicao)

self.list_camadas_comparacao = QListWidget(self)
self.list_camadas_comparacao.setSelectionMode([Link])
self.list_camadas_comparacao.addItems([[Link]() for layer in
filter_polygons([Link]().layers())])
[Link](self.list_camadas_comparacao)

self.button_box = QDialogButtonBox([Link] |
[Link])
self.button_box.[Link]([Link])
self.button_box.[Link]([Link])
[Link](self.button_box)

# Criar a instância do diálogo e exibir


dialog = CamadasDialog([Link]())
if dialog.exec_():
camada_entrada = dialog.combo_camada_entrada.currentLayer()

# Continuar somente se a camada de entrada foi selecionada


if camada_entrada:
camadas_comparacao = [[Link]().layer([Link]()) for i in
dialog.list_camadas_comparacao.selectedIndexes()]

if not camadas_comparacao:
print('Nenhuma camada de comparação selecionada.')
else:
for camada_sobreposicao in camadas_comparacao:
# Expressão Área Sobreposição com arredondamento para duas casas
decimais
nome_campo_area = f'area_{camada_sobreposicao.name()}'
exp_area_sobreposicao =
QgsExpression(f'round(aggregate(layer:=\'{camada_sobreposicao.name()}\',
aggregate:=\'sum\', expression:=area(intersection($geometry, geometry(@parent))),
filter:=intersects($geometry, geometry(@parent))), 2)')

# Expressão Quant Feições Sobreposição


nome_campo_quant_feicoes =
f'quant_feicoes_{camada_sobreposicao.name()}'
exp_quant_feicoes_sobreposicao =
QgsExpression(f'aggregate(layer:=\'{camada_sobreposicao.name()}\',
aggregate:=\'count\', expression:= $id, filter:=intersects($geometry,
geometry(@parent)))')

# Preparar as expressões
context = QgsExpressionContext()

[Link]([Link](camada_entr
ada))
exp_area_sobreposicao.prepare(context)
exp_quant_feicoes_sobreposicao.prepare(context)

# Criar campos virtuais area_CamadaSobreposicao e


quant_feicoes_CamadaSobreposicao na camada de entrada
if camada_entrada.fields().indexFromName(nome_campo_area) == -1 and
camada_entrada.fields().indexFromName(nome_campo_quant_feicoes) == -1:

camada_entrada.addExpressionField(exp_area_sobreposicao.expression(),
QgsField(nome_campo_area, [Link]))

camada_entrada.addExpressionField(exp_quant_feicoes_sobreposicao.expression(),
QgsField(nome_campo_quant_feicoes, [Link]))
camada_entrada.updateFields()
else:
print(f'Os campos virtuais "{nome_campo_area}" e
"{nome_campo_quant_feicoes}" já existem na camada "{camada_entrada.name()}".')
else:
print('Camada de entrada não selecionada.')

Você também pode gostar