Como utilizar Python no QGIS (PyQGIS) para automatizar processos?

Confira nosso curso online de QGIS

Aprenda a utilizar a linguagem de programação Python dentro do QGIS para agilizar seus trabalhos e eliminar os processos repetitivos.

Quando trabalhamos com Sistemas de Informações Geográficas (SIG), alguns trabalhos são bastante repetitivos, beirando à chatice.

Extrair, cortar, realizar analise, extrair, cortar, realizar analise. Quantas vezes você vai ficar repetindo esse processo? Por que não programar para realizar todo ele de uma vez só?

Já apresentamos como realizar esse tipo de procedimento utilizando o ArcGIS, e caso você queira mais detalhes sobre o que é Python, dê uma olhada na nossa postagem sobre como usar Python e a ferramenta Buffer no ArcGIS.

Nesta postagem, utilizaremos o QGIS 2.18 e Python para extrair o limite do município de Cocal do Sul (e de outros municípios), em seguida, iremos utilizar esse limite para recortar o mapa de solos do Estado de Santa Catarina.

Nos links abaixo, você poderá baixar os shapefiles que usaremos nesta postagem.

Como acessar o Python no QGIS (PyQGIS)?

Antes de adicionarmos qualquer shapefile, vamos abrir o terminal e o editor python do QGIS para escrever e executar nossos comandos.

Vá em Plugins e clique em Python Console (1). Provavelmente somente o Terminal será aberto, mas você pode habilitar o editor clicando em “Show Editor” (2), conforme figura abaixo.

Iniciando o módulo Python no QGIS 2.18.
Iniciando o módulo Python no QGIS 2.18.

Com todas essas janelas abertas, vamos começar a programar na janela que foi aberta quando clicamos em “Show Editor”.

Carregando shapefile usando PyQGIS

Agora, vamos carregar algumas bibliotecas e vamos utilizar a função addVectorLayer() para adicionar nossos dois shapefiles.


#!/usr/bin/env python
#coding: utf-8

# Carregando bibliotecas no Python
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
import processing
import sys

# Adicionando nossos arquivos shapefile
lim_mun = "C:/Users/ferna/Desktop/PyQGIS/42MUE250GC_SIR.shp"
solos_sc = "C:/Users/ferna/Desktop/PyQGIS/Solos_Santa_Catarina_250000_2004.shp"
iface.addVectorLayer(lim_mun, "Limites Municipais", "ogr")
iface.addVectorLayer(solos_sc, "Solos de SC", "ogr")

A função addVectorLayer recebe três parâmetros, são eles (1) o local onde foi salvo o shapefile; (2) nome da camada e (3) o identificador da fonte de dados, normalmente ogr.

Extraindo o limite municipal

Agora, com as camadas carregadas, iremos acessar os dados da camada “Limite Municipal” e por meio da ferramenta Extract by Attribute, iremos separar o limite do município de Cocal do Sul em um novo shapefile.

Iremos utilizar a função “processing” e dentro dela vamos especificar o algoritmo para extração de dado baseando-se em um atributo.


# Rodando algoritmo para extrair limites de Cocal do Sul
limCocal = "C:/Users/ferna/Desktop/PyQGIS/limCocal.shp"
processing.runalg('qgis:extractbyattribute', lim_mun, "NM_MUNICIP", 0, "COCAL DO SUL", limCocal)

Com o limite municipal de Cocal do Sul em mãos, já podemos rodar o nosso código seguinte para recortar os tipos de solos existentes dentro do município.

Cortando a partir de um polígono

Neste procedimento, utilizaremos a função Clip para recortar as classes de solo do município de Cocal do Sul.

Mas antes de executarmos esse código, nossos shapefiles estão em sistemas de projeção diferentes, isso pode ocasionar erros no momento do cruzamento dos mapas. Por isso, antes de rodar o código de recorte, vamos executar o qgis:reprojectlayer, para converter o shapefile do tipo de solo para SIRGAS2000.


# Convertendo os sistemas de coordenadas
Solos_SIRGAS = "C:/Users/ferna/Desktop/PyQGIS/Solos_SIRGAS.shp"
processing.runalg("qgis:reprojectlayer", solos_sc, "epsg:4674", Solos_SIRGAS)

# Recortando nossa area de estudo
solosCocal = "C:/Users/ferna/Desktop/PyQGIS/solosCocal.shp"
processing.runalg('qgis:clip', Solos_SIRGAS, limCocal, solosCocal)
iface.addVectorLayer(solosCocal, "Solos de Cocal do Sul", "ogr")

E dessa forma, conseguimos extrair os tipos de solos do município de Cocal do Sul.

Note que as funções Reproject Layer e Clip precisam dos seguintes argumentos:

  • Reproject Layer: (1) Arquivo de Entrada, (2) Sistema de Coordenadas Final, (3) Arquivo de Saída.
  • Clip: (1) Arquivo a ser cortado, (2) Limites do corte, (3) Arquivo de Saída.

Como realizar esse processo para varias cidades?

Para isso, vamos construir uma variável com os nosso municípios alvos (i.e. Ermo, Forquilhinha, Nova Veneza e Garopaba) e em seguida, criaremos um loop do tipo for para rodar todos eles, veja abaixo.


# Extraindo multiplos mapas de solo com um loop
cidades = ["ERMO", "FORQUILHINHA", "NOVA VENEZA", "GAROPABA"]
for n in cidades:
  limite = "C:/Users/ferna/Desktop/PyQGIS/lim" + n +".shp"
  processing.runalg('qgis:extractbyattribute', lim_mun, "NM_MUNICIP", 0, n, limite)
  solos = "C:/Users/ferna/Desktop/PyQGIS/solos" + n + ".shp"
  processing.runalg('qgis:clip', Solos_SIRGAS, limite, solos)
  iface.addVectorLayer(solos, "Solos de " + n , "ogr")

Note que após realizar esse processo, você poderá substituir a variável cidades pelos municípios que você deseja, desde que o nome esteja igual ao nome do município no shapefile com os limites municipais.

Obs.: Estou pesquisando como extrair os municípios que apresentam caracteres especiais em seus nomes (i.e. acentos, cedilhas), pois até agora, não consegui extrair o shape de solos deles. Até onde pesquisei, tem a ver com a codificação dos caracteres (UTF-8). Caso você tenha a resposta, deixe ela nos comentários que estaremos agradecendo e atualizando a postagem.

[Atualização em 18/06/2018]

Corrigindo o problemas de Encoding

Depois de pesquisar um pouco sobre como converter um shapefile para um Encoding diferente, conseguimos realizar o procedimento anterior para municípios com acentos.

O novo código tem uma parte para realizar essa correção, onde carregamos novamente o shapefile (função QgsVectorLayer()) e em seguida salvamos ele num novo formato (função QgsVectorFileWrite().writeAsVectorFormat())

Lembre-se também de colocar um “u” na frente dos textos que contém acentos, como fizemos na variável cidades.

Confira o código completo abaixo.


# -*- coding: utf-8 -*-

# Carregando pacotes no Python
import processing
import sys
import osgeo.ogr as ogr
import osgeo.osr as osr

# Carregando nossos arquivos shapefile
lim_mun = "C:/Users/ferna/Desktop/PyQGIS/42MUE250GC_SIR.shp"
solos_sc = "C:/Users/ferna/Desktop/PyQGIS/Solos_Santa_Catarina_250000_2004.shp"

# Convertendo os sistemas de coordenadas
Solos_SIRGAS = "C:/Users/ferna/Desktop/PyQGIS/Solos_SIRGAS.shp"
processing.runalg("qgis:reprojectlayer", solos_sc, "epsg:4674", Solos_SIRGAS)

# Corrigindo Encoding
Camada = QgsVectorLayer(lim_mun, None, 'ogr')
Camada.setProviderEncoding("utf8")
Camada.dataProvider().setEncoding("utf8")

lim_UTF8 = "C:/Users/ferna/Desktop/PyQGIS/lim_UTF8.shp"
QgsVectorFileWriter.writeAsVectorFormat(Camada, lim_UTF8, "utf_8_encode", Camada.crs(), "ESRI Shapefile")

# Extraindo vários itens com acentos
cidades = [u"CRICIÚMA", u"MORRO DA FUMAÇA"]
for n in cidades:
  limite = "C:/Users/ferna/Desktop/PyQGIS/lim" + n +".shp"
  processing.runalg('qgis:extractbyattribute', lim_UTF8, "NM_MUNICIP", 0, n, limite)
  solos = "C:/Users/ferna/Desktop/PyQGIS/solos" + n + ".shp"
  processing.runalg('qgis:clip', Solos_SIRGAS, limite, solos)
  iface.addVectorLayer(solos, "Solos de " + n , "ogr")

Caso tenha ficado com alguma dúvida, deixe ela nos comentários que estaremos respondendo assim que possível.



Clique na figura abaixo e assine nossa lista de emails para receber nosso ebook "Como criar mapas de localização com ArcGIS 10.x".

Apostila Mapa de Localização Banner

Author: Fernando BS

Engenheiro Ambiental e de Segurança do Trabalho. Atua nas áreas de geoprocessamento, mineração e hidrologia. Busca soluções utilizando softwares como QGIS, R e Python.

53 thoughts on “Como utilizar Python no QGIS (PyQGIS) para automatizar processos?”

  1. Boa tarde, Fernando!
    Acabei de conhecer o site de vocês já agradeço pela iniciativa de compartilhar o conhecimento.

    Sou geógrafo e tenho me aventurado bastante pela área do PyQGIS e do WebGIS com o Geoserver+Leaflet.
    Apesar de achar alguns cookbooks na internet, quando se trata de pyqgis as aplicações e grupos de discussão são escassos.

    Respondo muitos processos sobre zoneamento de plano diretor e zoneamento de risco e quero automatizar essa tarefa. Para tal, estou tentando criar um plugin por meio do Qt Designer, mas minha limitação está no código. Talvez você possa me ajudar.

    A lógica do plugin é a seguinte: 1º Inserção de coordenadas UTM de um ou mais pontos;
    2º Seleção de checkbox ( Zoneamento do Plano Diretor ou Zoneamento de Risco Geológico);
    3° Rodar >>>Gerar um mapa em pdf com as informações;

    Preciso de auxílio para codificar a criação de um ponto a partir das coordenadas UTM, para condicionar (“for”) a resposta (informação) a partir da localização do ponto gerado sobre as shapefiles, para que isso gere um layout de impressão padronizado ( escalas, zoom, legenda, norte, campo de texto sempre no mesmo espaço, número do processo etc) e gerar o pdf ou jpeg.

    1. Boa noite Leonardo,

      Que bom que você gostou do nosso conteúdo. Também estou aprendendo a programar em Python e postando os resultados aqui no Blog.

      Com relação à dificuldade na parte de programação, você pode conferir alguns cursos online de Python (ex. http://excript.com/curso-de-python.html) ou de PyQGIS (pesquisei na Udemy.com e há três opções de curso em inglês).

      Estarei buscando como realizar esse procedimento que você apresentou, assim que eu obtiver resultados, estarei postando aqui no blog.

  2. Parabéns pelo blog, é uma excelente iniciativa diante da qualidade duvidosa dos inúmeros sites sobre QGIS, em português.
    O tutorial sobre como criar um plugin no QGIS usando python ficou muito didático e claro. E a compreensão das linhas de comando, que eu também senti falta, esse curso gratuito que você indicou é excelente http://excript.com/curso-de-python.html
    Obrigado por compartilhar seu conhecimento!

    1. Hola Eddison,

      El archivo 42MUE250GC_SIR.shp se puede descargar aquí: ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2015/UFs/SC/sc_municipios.zip

      Y el otro archivo (Solos_Santa_Catarina…) es este aquí: http://ciram.epagri.sc.gov.br/ciram_arquivos/arquivos/iff/zip/solos_santa_catarina_250000_2004.zip

      Gracias por tu comentario y si necesitas alguna ayuda, es sólo comentar por aquí.

      1. Muchas gracias!! muy amable de su parte por su tiempo al responder, soy neofito en PYQGIS pero deseo aprender, antes de iniciar esos procesos funcionan en la version QGIS 3.x? Saludos, Eddison

        1. El código es diferente para el QGIS 3, porque han cambiado algunos elementos de la función “Processing” (ahora recibe como argumento un diccionario) y en el ejemplo siguiente, no puedo reproducir con caracteres especiales.

          # -*- coding: utf-8 -*-

          # Carregando pacotes no Python
          import processing
          import sys
          import osgeo.ogr as ogr
          import osgeo.osr as osr

          # Carregando nossos arquivos shapefile
          lim_mun = “C:/Users/ferna/Desktop/PyQGIS/42MUE250GC_SIR.shp”
          solos_sc = “C:/Users/ferna/Desktop/PyQGIS/Solos_Santa_Catarina_250000_2004.shp”

          # Convertendo os sistemas de coordenadas
          Solos_SIRGAS = “C:/Users/ferna/Desktop/PyQGIS/Solos_SIRGAS.shp”
          param_Reproj = {‘INPUT’: solos_sc, ‘TARGET_CRS’: “epsg:4674”, ‘OUTPUT’: Solos_SIRGAS}
          processing.run(“qgis:reprojectlayer”, param_Reproj)

          # Corrigindo Encoding
          Camada = QgsVectorLayer(lim_mun, None, ‘ogr’)
          Camada.setProviderEncoding(“utf8”)
          Camada.dataProvider().setEncoding(“utf8”)

          lim_UTF8 = “C:/Users/ferna/Desktop/PyQGIS/lim_UTF8.shp”
          QgsVectorFileWriter.writeAsVectorFormat(Camada, lim_UTF8, “utf_8_encode”, Camada.crs(), “ESRI Shapefile”)

          # Extraindo vários itens com acentos
          cidades = [“TREVISO”, “VIDEIRA”, “MAFRA”]
          for n in cidades:
          limite = “C:/Users/ferna/Desktop/PyQGIS/lim” + n +”.shp”
          param_ExtAtt = {‘INPUT’: lim_UTF8, ‘FIELD’: “NM_MUNICIP”, ‘OPERATOR’: 0, ‘VALUE’: n, ‘OUTPUT’: limite}
          processing.run(‘qgis:extractbyattribute’, param_ExtAtt)
          solos = “C:/Users/ferna/Desktop/PyQGIS/solos” + n + “.shp”
          param_Clip = {‘INPUT’: Solos_SIRGAS, ‘OVERLAY’: limite, ‘OUTPUT’: solos}
          processing.run(‘qgis:clip’, param_Clip)
          iface.addVectorLayer(solos, “Solos de ” + n , “ogr”)

          1. Hola gracias! pero entonces varias preguntas:

            1: Para seleccionar el limite limCocal el comando siguiente queda igual en QGIS 3.x?

            # Rodando algoritmo para extrair limites de Cocal do Sul
            limCocal = “C:/Users/ferna/Desktop/PyQGIS/limCocal.shp”
            processing.runalg(‘qgis:extractbyattribute’, lim_mun, “NM_MUNICIP”, 0, “COCAL DO SUL”, limCocal)

            2: (ok veo que este comando si es diferente para QGIS 3.x)

            # Convertendo os sistemas de coordenadas
            Solos_SIRGAS = “C:/Users/ferna/Desktop/PyQGIS/Solos_SIRGAS.shp”
            param_Reproj = {‘INPUT’: solos_sc, ‘TARGET_CRS’: “epsg:4674”, ‘OUTPUT’: Solos_SIRGAS}
            processing.run(“qgis:reprojectlayer”, param_Reproj)

            3:
            Y si deseo cortar (clip) solo un elementos como limCocal, el siguiente comando queda igual?

            # Recortando nossa area de estudo
            solosCocal = “C:/Users/ferna/Desktop/PyQGIS/solosCocal.shp”
            processing.runalg(‘qgis:clip’, Solos_SIRGAS, limCocal, solosCocal)
            iface.addVectorLayer(solosCocal, “Solos de Cocal do Sul”, “ogr”)

            Muchas Gracias

            Eddison

  3. Hola Eddison,

    Respondiendo sus preguntas:
    1. No, el comando processing.runalg() cambió en QGIS 3, el correcto sería processing.run (‘qgis: extractbyattribute’, param_ExtAtt) – Donde param_ExtAtt son los parámetros de qgis: extractbyattribute (y el resto queda igual).
    2. Eso mismo.
    3. La misma cosa que la primera pregunta. El correcto sería: processing.run (‘qgis: clip’, param_Clip)

    1. Oi Fernando,

      Mesmo estes comandos que você indicou não funcionam no Qgis 3.4, você tem alguma sugestão ou exemplo que poderia passar.

      E parabéns pelos exemplos, muito bom.

      1. Bom dia Thiago, obrigado pelo comentário.

        Estranho não estarem funcionando, li que o comando havia mudado para este que passei no outro comentário. Você pode consultar outros exemplos, inclusive de onde eu peguei a informação da mudança, nos seguintes links:

        Documentação do QGIS 3.4: https://docs.qgis.org/3.4/en/docs/user_manual/processing/console.html
        Exemplos de PyQGIS: https://anitagraser.com/pyqgis-101-introduction-to-qgis-python-programming-for-non-programmers/

  4. Hola! trato de aprender y entusiasmado con este blog!
    Intento realizar un merge usando esta funcion:

    import processing

    nom_layer_carret = r’C:/CURSO_PYQGIS/CAPAS/carreteras.shp’
    nom_layer_rios = r’C:/CURSO_PYQGIS/CAPAS/rios.shp’
    nom_resultado = r’C:/CURSO_PYQGIS/CAPAS_PROCESADAS/elementos_lineales.shp’

    parameters ={‘LAYERS’:[nom_layer_carret,nom_layer_rios],’CRS’:’EPSG:4326′,’OUTPUT’:nom_resultado}
    feedback = QgsProcessingFeedback()
    processing.runAndLoadResults(‘native:mergevectorlayers’,parameters,feedback=feedback)

    Hice una carpeta en C que le llamé CURSO_PYQGIS, adjunto datos:

    https://www.dropbox.com/sh/rx812mu7vj9trd1/AACtFtsOyKEFuN6D1SKUhACna?dl=0
    y el script utilizado:

    https://www.dropbox.com/s/uqbn0kkilsqdtpu/merge.py?dl=0

    Cuando ejecuto me da error y no lo puedo unir usando el comando, creo que el problema está en una columna llamada ScaleRank, que en un mapa es double y en el otro es intero.

    Yo deseo correr todo usando un script y quiero hacerlo con native:mergevectorlayers, donde en el mapa final que he llamado nom_resultado (elementos_lineales.shp) estén todas las columnas y filas de ambos mapas!

    Gracias!
    Eddison

    Traceback (most recent call last):
    File “C:\PROGRA~1\QGIS3~1.4\apps\Python37\lib\code.py”, line 90, in runcode
    exec(code, self.locals)
    File “”, line 1, in
    File “”, line 10, in
    File “C:/PROGRA~1/QGIS3~1.4/apps/qgis/./python/plugins\processing\tools\general.py”, line 121, in runAndLoadResults
    return Processing.runAlgorithm(alg, parameters=parameters, onFinish=handleAlgorithmResults, feedback=feedback, context=context)
    File “C:/PROGRA~1/QGIS3~1.4/apps/qgis/./python/plugins\processing\core\Processing.py”, line 183, in runAlgorithm
    raise QgsProcessingException(msg)
    _core.QgsProcessingException: Hubo errores al ejecutar el algoritmo.

    1. Buenos días Eddison,

      Algunas sugerencias para probar en su código:

      1) Colocar en la parte superior del código: “import qgis.core” y luego cambiar “feedback = QgsProcessingFeedback()” por “feedback = qgis.core.QgsProcessingFeedback()” (https://gis.stackexchange.com/questions/286137/how-to-set-the-layers-parameter-of-the-qgis-3-algorithm-nativemergevectorlay).

      2) Cambiar “processing.runAndLoadResults(‘native:mergevectorlayers’,parameters,feedback=feedback)” por “processing.run(‘native:mergevectorlayers’,parameters,feedback=feedback)” y cargar el resultado con otro código (e.g. iface.addVectorLayer(nom_resultado, “Resultado”, “ogr”))

  5. Hola un gusto saludarle, por medio de este comando paso a mi TOC de QGIS un mapa de puntos de un GPS:

    uri= “C:\CURSO_PYQGIS\CAPAS\puntos.gpx?type=waypoint”

    gpx_layer=QgsVectorLayer(uri, “capa de gps3″,”gpx”)

    QgsProject.instance().addMapLayer(gpx_layer)

    Pero si ahora quiero pasar mi capa gpx a formato shapefile desde la consola de python de QGIS, como se puede hacer?

    El dato se llama puntos.gpx y está aquí: https://www.dropbox.com/sh/rx812mu7vj9trd1/AACtFtsOyKEFuN6D1SKUhACna?dl=0

    El archivo se llama puntos.gpx y quiero convertirlo a shapefile

    Gracias

    Eddison

    1. Hola, ya pude, usé esto:

      QgsVectorFileWriter.writeAsVectorFormat(gpx_layer,r”C:\CURSO_PYQGIS\CAPAS_PROCESADAS\gps.shp”,”UTF-8″,QgsCoordinateReferenceSystem(4326),”ESRI Shapefile”)

      Tomé el ejemplo del Blog con otro mapa y me ha funcionado, muchas gracias!

  6. Hola, disculpen si la pregunta es muy básica, pero si tengo en una variable la capa activa:

    clayer=iface.mapCanvas().currentLayer()

    Como puedo por medio de un print que me aparezca el nombre de la capa en la consola?

    Gracias

    Eddison

    1. Es que si uso esto:
      clayer=qgis.utils.iface.mapCanvas().currentLayer()

      print (clayer.id())

      Me aparece esto:
      ciudades20140210133917934

      Yo quiero que solo diga ciudades en la consola! y no lo logro hacer.

      Gracias
      Eddison

        1. Hola Eddison,

          Voy a tratar de responder a todos sus comentarios aquí. Veamos el primero, cómo convertir GPX a Shapefile usando PyQGIS. También puede utilizar el algoritmo “gdalogr: convertformat”, como se indica a continuación:

          processing.runalg (‘gdalogr: convertformat’, “Capa de entrada”, 0, ”, “Capa de salida”)

          Otros formatos de conversión se pueden ver aquí:
          https://docs.qgis.org/2.8/en/docs/user_manual/processing_algs/gdalogr/ogr_conversion.html

          Con respecto a los nombres de las capas, puede intentar uno de los códigos que aparecen en los vínculos de StackExchange.

          Obtener lista de nombres de capas con PyQGIS: https://gis.stackexchange.com/questions/118862/get-a-list-of-layer-names-using-pyqgis
          Obtener capa por nombre con PyQGIS: https://gis.stackexchange.com/questions/136861/getting-layer-by-name-in-pyqgis

          1. Hola, para conocer los nombres he revisado los links que me has enviado, pero esto:
            for layer in QgsMapLayerRegistry.instance().mapLayers().values():
            print layer.name()

            No funciona en QGIS 3, se me ocurrió poner esto:

            for layer in QgsProject.instance().mapLayers().values():
            print layer.name()

            Y de esa manera si ha funcionado, gracias,Eddison

  7. Es que localicé esto:
    addProject
    virtual bool QgisInterface::addProject ( const QString & project )

    Pero no comprendo como se escribe en la linea de comandos para luego leerlo y que aparezca el proyecto:

    addProject(r” D:\PRUEBA\mapas.qgs”), pero hago cosas mal y no puedo agregarlo, entonces en resumen:

    1. Como agregar el proyecto mapas.qgs que tengo en D:\PRUEBA
    2. Como salvar el proyecto de nuevo
    3. Como salvar el proyecto con un nombre nuevo

    Muchas gracias

    Eddison

    1. Buenas noches Eddison,

      A continuación se muestra el código con los comentarios para ayudar a responder a sus preguntas (probado en QGIS 3):

      from qgis.core import QgsProject

      # Crea una variable para almacenar proyecto vacío
      projeto = QgsProject.instance()

      # Cargar / agregar proyecto
      projeto.read(‘C:/Users/ferna/Desktop/teste.qgz’)

      # Salvar proyecto
      projeto.write(‘C:/Users/ferna/Desktop/teste2019.qgz’)

      # Nuevo nombre para el proyecto (concatenar)
      nomeNovo = ‘umNovoProjeto’
      projeto.write(‘C:/Users/ferna/Desktop/’ + nomeNovo + ‘.qgz’)

      # Muestra el nombre y la ruta del proyecto en el indicador
      print(projeto.fileName())

  8. Oi Fernando!
    Interessante sua dúvida.
    Comecei a estudar o Python na ânsia de desenvolver uma rotina que elaborasse mapas de diagnóstico urbano de forma automática mas assim como você acabei esbarrando na limitação do código.
    Espero que tenha conseguido resolver seu problema.

    Abraço!

    1. Boa tarde Jhonne,

      A parte de encoding volta e meia incomoda, mas ao poucos vamos aprendemos melhor a linguagem de programação e superamos esses obstáculos.

  9. Bom dia Fernando,

    Estou tentanto instalar o plugin CKANBrowser no QGIS e está dando o seguinte erro:
    “ImportError: PyQt4 classes cannot be imported in QGIS 3.x. Use PyQt5.QtCore or the version independent qgis.PyQt.QtCore import instead. ”

    Tem ideia de como posso resolver isto?

    Cordialmente,

    1. Boa tarde Danilo,

      Qual versão você esta usando do QGIS? Pela mensagem de erro, parece que o plugin não é compatível com o QGIS 3.x.

      O que você pode tentar é instalar uma versão mais antiga (ex. 2.18) e rodar o plugin.

  10. Olá Fernado, ótima postagem, sou iniciante no Python no Qgis, e publicações assim é satisfatório, pois salva a gente um bocadão viuu. Estou tentando fazer uma ferramenta que automatize um processo sendo pra fins acadêmicos.
    Eu preciso pegar informações de uma camada(ou de outra camada) que contém uma coluna_telefone (ex: 011 2222-0000) e armazena-las em outras duas colunas separando, uma armazena o DDD e o outro o Numero, na calculadora de campos é simples utilizando o LEFT(ex: 011) e RIGHT(ex:2222-0000), mas no PyQgis até agora não encontrei, assim também, para identificar a coordenada do vértice de um Lote que esteja mais a esquerda e ao norte, para que nele possa ser adicionados informações.
    Muito Obrigada, Deus continue abençoando.

    1. Boa noite Charlene,

      Obrigado pelo comentário. Com relação à seleção de caracteres específicos (caso da coluna_telefone), você pode usar os caracteres usando colchetes após a sua variável que contem os números (exemplo, coluna_telefone[0:2] vai extrair o DDD). Dê uma olhada em “Operador de Indexação” nesta página: https://panda.ime.usp.br/pensepy/static/pensepy/08-Strings/strings.html

      Pelo o que entendi da sua segunda pergunta, você quer adicionar a informação anterior (telefone) ao vértice mais próximo, acredito que essa resposta do GIS StackExchange poderá te ajudar (tem até um código que você pode testar): https://gis.stackexchange.com/questions/59173/finding-nearest-line-to-point-in-qgis

      1. Fernando boa noite, muito obrigada, com sua dica na primeira consegui solucionar, valeu mesmooo, mas na minha segunda pergunta, estou tendo bastante dificuldades, eu tentei programar fazendo que o algoritmo identifique o Lote(imóvel) da quadra mais ao noroeste afim de que ele consiga ler no sentido horário todas testadas das casas extraindo e armazenando os comprimento de cada frente do Lote, até ao ultimo lote da quadra, como não consegui to tentando agora por clique do mouse, eu indicando onde deve começar a leitura.
        Agradeço muito pela ajuda, o senhor tem alguma dica?
        De qualquer forma agradeço.

        1. Bom dia Charlene,

          Essa parte de selecionar feições próximas usando código é complicada mesmo, já vi algumas expressões no QGIS (usando a função Aggregate) mas não tive bons resultados. Algumas sugestões de site (não consegui encontrar o tutorial que eu tinha seguido, mas acho que esses links podem te dar uma auxílio):

          http://www.qgistutorials.com/pt_BR/docs/find_neighbor_polygons.html
          https://anitagraser.com/2017/06/08/aggregate-all-the-things-qgis-expression-edition/
          https://spatialthoughts.com/2019/04/12/summary-aggregation-qgis/

  11. Legal ! Tenho uma dúvida: estou fazendo vários CAR e qual seria a lógica de programação em python sendo que já tenho as classes de uso do solo do Mapbiomas (raster) e, gostaria de automatizar ao inserir um polígono nessas classes resultaria na criação de novos shapes de polígono com as áreas separadas em : pastagem, reserva legal, app ?
    Grato.

    Geraldo.

    1. Boa noite Geraldo,

      Você pode tentar algo usando Estatística Zonal, talvez você tenha que converter as classes para número (para ela funcionar). Ou ainda tentar cortar o raster com a área do CAR e converter o raster para shapefile.

      Alguns códigos referentes à estatística zonal: https://gis.stackexchange.com/questions/270091/automating-zonal-statistics-in-qgis?rq=1 (ou) http://2engenheiros.com/2019/07/25/estatistica-zonal-qgis-e-arcgis/
      A ferramenta Clip tem a nossa postagem como exemplo.

  12. Hey. If i want do use docx from python, to read and writte on a file how i do that in the console of my qgis ? can you help ? thank you

  13. Não encontrei o Mapa Pedológico de Santa catarina, os mapas que encontrei la estao em flash. o Navegador nem abre.

  14. Olá Fernando,
    O que estou precisando fazer é o seguinte, veja se pode me dar alguma direção?
    Em um raster ou polígono com pixel de temperatura, gostaria de saber se tem um algoritmo para me ajudar a prever qual será a temperatura deste pixel no próximo mês por exemplo. Seria uma grande ajuda.
    Grato, Davi

    1. Boa tarde Davi,
      Desconheço algorítmo, mas tem aproximações por meio de funções senoidais para estimar os valores do Ciclo da Temperatura Anual (Annual Temperature Cycle – ATC). Ligo algo neste artigo: https://www.sciencedirect.com/science/article/abs/pii/S0034425714000479

      Eles citam esse artigo: Bechtel, B. (2012). Robustness of annual cycle parameters to characterize the urban thermal landscapes. IEEE Geoscience and Remote Sensing Letters, 9(5), 876–880.

  15. Olá Fernando. Parabéns pela competência, experiência e material que vocês compartilham com a comunidade interessada em aprender mais sobre este universo. Sou engenheiro, mas não da área, e estou começando a me aventurar no mundo profissional do GIS. Tenho uma demanda de selecionar várias feições que tem um determinado atributo repetido e mesclar, tornando várias linhas da tabela em uma única com várias linhas (feições). O problema é que tenho muitos casos, logo pensei em automatizar. Imagino que seja possível. Já tive lendo vários link que você postou, mas se tivesse algo mais que eu pudesse estudar ou buscar exemplos de códigos prontos, agradeceria.
    Abraço.
    Nelson Muylaert

    1. Boa tarde Nelson, obrigado pelo comentário.
      Com relação à sua dúvida, acredito que você pode montar um filtro na tabela de atributos para selecionar somente a classe do atributo desejado (algo como “ESTADO” = “SP” na parte inferior da tabela de atributos, lá tem filtro de campo ou filtro de expressão), em seguida, editando a feição, tem uma ferramenta que possibilita mesclar as feições selecionadas – https://gis.stackexchange.com/questions/283926/merge-multiple-polygon-shapefile-to-a-single-polygon-shapefile/283978.

  16. Show de bola, consegui fazer “na mão” conforme orientado. Será o PyQgis teria (acredito que sim) algum comando para permitir a automatização, com inclusive a escolha de qual linha manter os dados (opções disponíveis na ferramenta)? Obrigado novamente.

Deixe um comentário para Eddison Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *