Você está aqui: QGIS ::: PyQGIS API ::: Ações do QGIS + PyQGIS |
Como criar sua primeira ação no QGIS e disparar um código PyQGIS ao acioná-laQuantidade de visualizações: 22 vezes |
Nesta dica eu mostrarei o básico das ações no QGIS. Uma ação em uma camada do QGIS é algo que acontece quando você clica em um recurso, e pode adicionar muitas funcionalidades extras ao seu mapa, permitindo que você recupere informações adicionais sobre um objeto, por exemplo. Atribuir ações pode adicionar uma nova dimensão ao seu mapa. Então, vamos criar nossa ação. Siga os passos a seguir atentamente: a) Clique com o botão direito na camada desejada e escolha Propriedades. b) Na janela Layer Properties, escolha a guia Ações. c) Clique o botão Adicionar Nova Ação. d) Selecione Python como o tipo e defina "Mensagem Python" na descrição. Deixe os escopos da ação como padrão. e) No campo Texto da ação, digite o seguinte código Python: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- # importamos a classe QMessageBox do Qt from qgis.PyQt.QtWidgets import QMessageBox # e mostramos uma mensagem QMessageBox.information(None, "Aviso", "A ação está funcionando corretamente!") f) Clique o botão OK. Agora que nossa ação está criada, vamos executá-la. Localize o botão de ações na barra de atributos do QGIS e escolha a ação Mensagem Python. Após acioná-la, clique em qualquer uma das feições da camada e você verá uma mensagem QMessageBox.information com o texto: A ação está funcionando corretamente! |
Link para compartilhar na Internet ou com seus amigos: |
QGIS ::: PyQGIS API ::: Shapefiles, Camadas Vetoriais, Dados Vetoriais |
Como saber o sistema de coordenadas de um shapefile no QGIS usando a função crs() do objeto QgsVectorLayer da PyQGIS APIQuantidade de visualizações: 218 vezes |
Em algumas situações nós gostaríamos de saber o sistema de coordenadas usado em um shapefile que carregamos ou pretendemos carregar para os nossos projetos no QGIS. Para isso podemos usar a função crs() do objeto QgsVectorLayer da PyQGIS API. Esta função retorna um objeto da classe QgsCoordinateReferenceSystem, que possui uma função chamada description(), que retorna a descrição do sistema de coordenadas usado no shapefile. Veja o código PyQGIS completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- # vamos criar um novo objeto QgsVectorLayer com o local do nosso shapefile camada = QgsVectorLayer("C:\\GO_Municipios_2022\\GO_Municipios_2022.shp", "Municípios Estado de Goiás", "ogr") # vamos testar se a camada é válida if not camada.isValid(): print("Não foi possível carregar a camada %s" % camada.name()) else: # vamos adicionar a camada à relação de camadas QgsProject.instance().addMapLayer(camada) # vamos exibir o sistema de coordenadas da camada sistema_coordenadas = camada.crs() print(sistema_coordenadas.description()) Ao rodar esse código PyQGIS no QGIS nós teremos o seguinte resultado: EPSG 4674 / SIRGAS 2000 |
QGIS ::: PyQGIS API ::: Aplicações com código fonte completo |
Como listar os 5 municípios goianos com maior área em uma camada do QGIS usando PyQGIS - Código Python completoQuantidade de visualizações: 235 vezes |
Este código completo mostra uma aplicação QGIS na qual usei PyQGIS para resolver um desafio muito interessante, e complexo. Acredito que servirá de base para muitos códigos interessantes envolvendo QGIS, Python e PyQGIS. Comecei fazendo o download do shapefile do Estado de Goiás, contendo seus 246 municípios no site do IBGE. Em seguida carreguei o shapefile no QGIS usando um objeto QgsVectorLayer. Note que criei uma classe Municipio para guardar cada um dos municípios encontrados no shapefile. E, para agrupar os objetos da classe Municipio eu criei uma lista chamada municipios. Para acessar cada um dos municipios, ou seja, cada uma das 246 feições da camada, eu usei a função getFeatures() da classe QgsVectorLayer. Então, ao percorrer cada uma dessas feições, eu obtive seus atributos, por meio da função attributes(), e os usei para criar os objetos da classe Municipio. Uma vez obtida a lista de municípios, o passo seguinte foi classificar a lista por ordem crescente de área (a área dos municípios). Um laço for me permitiu listar apenas os 5 municípios com maiores áreas e, além de registrar o somatório de seus áreas, obter os seus códigos para selecioná-los na camada, usando a função selectByExpression(). O desafio final foi mostrar as labels, ou seja, os rótulos de cada um dos municípios no mapa do QGIS, porém, eu queria mostrar os rótulos apenas dos 5 municípios com as maiores áreas. Para resolver o desafio, lancei mão da função setFilterExpression(). Veja o código completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- # uma classe para guardar cada um dos municípios # do Estado de Goiás class Municipio: # método construtor def __init__(self, codigo, nome, estado, area): self.codigo = codigo self.nome = nome self.estado = estado self.area = area # para guardar os municípios municipios = [] # vamos criar um novo objeto QgsVectorLayer com o local # do nosso shapefile camada = QgsVectorLayer("C:\\GOIAS\\GO_Municipios_2022.shp", "Municípios do Estado de Goiás", "ogr") # vamos testar se a camada é válida if not camada.isValid(): print("Não foi possível carregar a camada %s" % camada.name()) else: # vamos percorrer todas as feições da camada # e obter os seus atributos feicoes = camada.getFeatures() for f in feicoes: # vamos obter os atributos desta feição atributos = f.attributes() # e criamos um novo objeto da classe Municipio municipio = Municipio(atributos[0], atributos[1], atributos[2], atributos[3]) # adicionamos este município na lista municipios.append(municipio) # agora vamos ordenar a lista por área da maior para # a menor municipios = sorted(municipios, key=lambda municipio:municipio.area, reverse=True) # vamos adicionar a camada à relação de camadas QgsProject.instance().addMapLayer(camada) # vamos calcular a área ocupada pelos 5 maiores municípios # do Estado de Goiás area_5_maiores = 0 for i in range(5): area_5_maiores = area_5_maiores + municipios[i].area # agora vamos selecionar os 5 maiores municípios na # camada do QGIS codigos = "" for i in range(5): codigos = codigos + municipios[i].codigo + ", " codigos = codigos[0:len(codigos) - 2] camada.selectByExpression('"CD_MUN" IN (' + codigos + ')') # e mostramos os resultados print("Os 5 maiores municípios do Estado de Goiás são:\n") for i in range(5): print("{0}) {1} - Área: {2} km2".format(i + 1, municipios[i].nome, municipios[i].area)) print("\nÁrea ocupada pelos 5 maiores municípios: {0} km2".format( area_5_maiores)) # finalmente vamos exibir os nomes dos municípios. Essa foi # a parte mais desafiadora do código, pois eu queria mostrar # somente os rótulos dos cinco maiores municípios settings = QgsPalLayerSettings() settings.isExpression = True settings.placement = QgsPalLayerSettings.Line settings.placement = QgsPalLayerSettings.Horizontal # mostra o nome do município settings.fieldName = "NM_MUN" format = QgsTextFormat() format.setColor(QColor('Black')) settings.setFormat(format) settings.enabled = True # cria e adiciona uma nova regra root = QgsRuleBasedLabeling.Rule(QgsPalLayerSettings()) rule = QgsRuleBasedLabeling.Rule(settings) rule.setDescription("5 Maiores Municípios do Estado de Goiás") # define o campo que será usado no filtro. Note que somente # serão listados os rótulos dos municípios com área maior ou # igual ao quinto elemento da lista municípios campo_area = "AREA_KM2" rule.setFilterExpression(f"\"{campo_area}\" >= {municipios[4].area}") root.appendChild(rule) # define as configurações do rótulo camada.setLabelsEnabled(True) rules = QgsRuleBasedLabeling(root) camada.setLabeling(rules) # redesenha a camada no canvas do QGIS camada.triggerRepaint() Ao executar este código QGIS, Python e PyQGIS nós teremos o seguinte resultado: Os 5 maiores municípios do Estado de Goiás são: 1) Niquelândia - Área: 9846.293 km2 2) Mineiros - Área: 9042.844 km2 3) Caiapônia - Área: 8627.961 km2 4) Rio Verde - Área: 8374.255 km2 5) Nova Crixás - Área: 7308.681 km2 Área ocupada pelos 5 maiores municípios: 43200.03399999999 km2 Para fins de compatibilidade este código foi escrito e testado no QGIS 3.34.5-Prizren. |
QGIS ::: PyQGIS API ::: Shapefiles, Camadas Vetoriais, Dados Vetoriais |
Como carregar um shapefile no QGIS usando o objeto QgsVectorLayer da PyQGIS APIQuantidade de visualizações: 157 vezes |
Nesta dica mostrarei como podemos usar o objeto QgsVectorLayer da PyQGIS API para carregar um arquivo shapefile no QGIS e adicioná-lo como uma nova camada. O primeiro passo é fornecer a localização do arquivo shapefile (.shp), o nome para a nova camada e um data provider, que nesse caso é ogr. Depois de obtido o objeto QgsVector nós efetuamos uma chamada à função isValid() para verificar se a camada é válida. Esse procedimento deve ser sempre usado, pois assegura que os dados são válidos antes de continuar com a execução do código. Para finalizar nós usamos a função addMapLayer() do objeto QgsProject para adicionar a nova camada à coleção de camadas e a exibimos no mapa. Veja o código PyQGIS completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- # vamos criar um novo objeto QgsVectorLayer com o local # do nosso shapefile camada = QgsVectorLayer("C:\\dados\\GO_Municipios_2022.shp", "Municípios Estado de Goiás", "ogr") # vamos testar se a camada é válida if not camada.isValid(): print("Não foi possível carregar a camada %s" % camada.name()) else: # vamos adicionar a camada à relação de camadas QgsProject.instance().addMapLayer(camada) Ao executarmos esse código PyQGIS no QGIS nós temos como resultado um mapa do Estado de Goiás com os seus 246 municípios. |
Vamos testar seus conhecimentos em Fenômeno de Transportes e Hidráulica |
Bombas hidráulicas As bombas hidráulicas são um grupo de máquinas hidráulicas muito comum em sistemas de abastecimento e distribuição de água de uma cidade. Resumidamente, as bombas captam água bruta e a transportam para uma estação de tratamento para que ela seja adequada aos parâmetros de potabilidade antes do fornecimento para os usuários. Sobre as bombas hidráulicas, o que é correto afirmar? A) As bombas hidráulicas podem ser dividas em: centrífugas, rotativas, de êmbolo e do tipo de poços profundos. B) As bombas hidráulicas podem ser dividas em: centrípetas, rotacionais, de pistão e do tipo poços largos-rasos. C) As bombas hidráulicas podem ser divididas em bombas de deslocamento positivo e bombas centrífugas. D) As bombas hidráulicas podem ser agrupadas junto com as turbinas hidráulicas no grupo de máquinas fixas. E) As bombas centrífugas não são muito utilizadas, apesar de sua aplicação em baixas pressões e altas vazões. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em JavaScript |
Qual é a sintáxe correta do laço FOR em JavaScript? A) for (var i = 0; i <= 5) {} B) for var i = 1 to 5 {} C) for (var i <= 5; i++) {} D) for (var i = 0; i <= 5; i++) {} Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Engenharia Civil - Construção Civil |
Locação da obra Para a fase de locação da obra, é indispensável o emprego da(o) ______________. Assinale a alternativa que completa a frase. A) Concreto. B) Instalação elétrica provisória. C) Topografia. D) Canteiro mobilizado. E) Entrada de água provisória. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Ética e Legislação Profissional |
Responsabilidade civil dos prepostos e preponentes Considera-se ___________ a entrega de papéis, bens ou valores ao ____________, encarregado pelo __________, se os recebeu sem ______________, salvo nos casos em que haja prazo para reclamação. Qual opção abaixo preenche corretamente as lacunas? A) Perfeita - preponente - preposto - protesto. B) Inválida - preponente - preposto - protesto. C) Inválida - preposto - preponente - protocolo. D) Perfeita - preposto - preponente - protocolo. E) Perfeita - preposto - preponente - protesto. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Topografia |
Rumo e azimute Prova de Engenharia Civil Prefeitura de Jarú O azimute correspondente ao rumo 32º 20' 30'' é: A) 212º 20' 30'' B) 147º 39' 30'' C) 327º 39' 30'' D) 302º 20' 30'' E) 58º 40' 30'' Verificar Resposta Estudar Cards Todas as Questões |
Veja mais Dicas e truques de QGIS |
Dicas e truques de outras linguagens |
Códigos Fonte |
Software de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |