# 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.')