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.