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.