Como mencionado na parte anterior da série, o console Python é um ponto de entrada para a automação do fluxo de trabalho GIS dentro do QGIS. Lembre-se de que existe um objeto iface representando a instância qgis.gui.QgisInterface dentro do console que lhe dá acesso a toda a GUI do QGIS. Vamos ver o que podemos fazer dentro do console.

1. CARREGANDO A PASTA DE CAMADAS VETORIAIS

import glob
from qgis.core import QgsMapLayerRegistry, QgsVectorLayer

def load_folder(folder):
    VALID_EXTENSIONS = ('.geojson', '.gpkg', '.shp')
    files = [f for f in glob.glob("{}/*".format(folder)) if f.endswith(VALID_EXTENSIONS)]

    for f in files:
        layer = QgsVectorLayer(f, f.split('/')[-1], 'ogr')

        if not layer.isValid():
            iface.messageBar().pushCritical("Failed to load:", f)
            continue

        QgsMapLayerRegistry.instance().addMapLayer(layer)

load_folder("path/to/your/vector/files/folder")
  • QgsMapLayerRegistry representa o painel de camadas presente na GUI do QGIS
  • iface.messageBar() retorna a barra de mensagens do aplicativo principal e permite notificar o usuário sobre o que está acontecendo
  • QgsVectorLayer representa uma camada vetorial com seus conjuntos de dados vetoriais subjacentes

2. EDIÇÃO DA TABELA DE ATRIBUTOS DA CAMADA ATIVA

O código a seguir demonstra a possibilidade de editar a tabela de atributos da camada vetorial por meio do console.

  • Qualquer atributo a ser escrito tem que vir na forma de um qgis.core.QgsField – isso é mais ou menos um encapsulamento de um nome de atributo e seu tipo (PyQt4.QtCore.QVariant)
  • O provedor de dados deve ser capaz de realizar a atribuição ( caps & QgsVectorDataProvider.AddAttributes)
  • QgsVectorLayer.addAttribute – método que retorna um booleano ao invés de lançar uma exceção
from qgis.core import QgsField
from qgis.gui import QgsMessageBar
from PyQt4.QtCore import QVariant


def edit_active_layer(attr_name, attr_type):
    layer = iface.activeLayer()
    caps = layer.dataProvider().capabilities()

    if caps & QgsVectorDataProvider.AddAttributes:
        layer.startEditing()
        if layer.addAttribute(QgsField(attr_name, attr_type)):
            iface.messageBar().pushMessage("Attribute {0} was successfully added to the active layer.".format(attr_name), QgsMessageBar.SUCCESS)
            layer.commitChanges()
        else:
            iface.messageBar().pushMessage("Attribute {0} was not added. Does it already exist?".format(attr_name), QgsMessageBar.CRITICAL)
            layer.rollBack()

edit_active_layer("new_string_attribute", QVariant.String)

3. CRIANDO UMA NOVA CAMADA VETORIAL

É possível criar uma camada vetorial totalmente nova com o console Python. Abaixo, é apresentada uma função muito simples (create_new_layer), mas espero que você possa imaginar as maneiras como ela pode ser ajustada.

from qgis.core import QgsField, QgsFields, QgsVectorLayer, QgsFeature, QgsGeometry, QgsPoint
from PyQt4.QtCore import QVariant

def create_new_layer():
    filename = "/path/to/your/vector/file.gpkg"

    fields = QgsFields()
    fields.append(QgsField("attr1", QVariant.String))
    fields.append(QgsField("attr2", QVariant.Int))

    file = QgsVectorFileWriter(
        filename,
        "UTF8",
        fields,
        QGis.WKBPoint,
        QgsCoordinateReferenceSystem(4326),
        "GPKG"
    )

    layer = QgsVectorLayer(filename, filename.split("/")[-1], "ogr")
    QgsMapLayerRegistry.instance().addMapLayer(layer)

    if not layer.dataProvider().capabilities() & QgsVectorDataProvider.AddAttributes:
        pass

    feature = QgsFeature(layer.pendingFields())
    feature.setGeometry(QgsGeometry().fromPoint(QgsPoint(0, 0)))
    feature.setAttribute("attr1", "attr1")
    feature.setAttribute("attr2", 2)

    layer.startEditing()

    if layer.addFeature(feature, True):
        layer.commitChanges()
    else:
        layer.rollBack()
        iface.messageBar().pushMessage("Feature addition failed.", QgsMessageBar.CRITICAL)

create_new_layer()

Esses foram apenas alguns exemplos do que pode ser feito com a API do QGIS e o console Python. No próximo post, vamos nos concentrar nas associações espaciais dentro do QGIS.