Estou tentando reprogramar alguns scripts do ArcPy para o QGIS (1.8 ou 2.0) e há algumas funções simples que desejo refazer, mas infelizmente a documentação do QGIS está ausente em determinadas áreas.
Nomeadamente, os três mais importantes para mim são:
Adicionar campo - Adicionar campo
arcpy.AddField_management(Feature, "ID", "SHORT")
Calcular Gerenciamento de Campo - Atualize esse campo
arcpy.CalculateField_management(Feature,"ID","!FID!")
Atualizar / excluir linhas - Atualizar / excluir linhas com base na condição (sem copiar o shapefile)
keep = ["Bob","Janet","John","Mike"]
Counter = 0
rows = arcpy.UpdateCursor(Feature)
for row in rows:
if row.Name in keep:
row.ID = Counter
rows.updateRow(row)
else:
rows.deleteRow(row)
Counter += 1
Agora eu posso percorrer cada recurso do QGIS usando o SEXTANTE e obter sua geometria que eu poderia reescrever em um novo shapefile e, assim, atualizar / excluir uma linha ou campo. Começando com algo como ...
layer = st.getobject(Polygon)
features = st.getfeatures(layer)
for f in features:
f.geometry().asPolygon()
mas não consigo encontrar uma solução simples para as funções mencionadas acima?
Respostas:
Os exemplos a seguir são baseados na API QGIS 2.0 (que será lançada em breve). Isso mudou desde a versão 1.8; portanto, a sintaxe desta versão será diferente em alguns lugares.
O melhor recurso para soluções compatíveis com 1.8 e explicações detalhadas sobre o histórico de parâmetros (também aplicável ao 2.0) são o Cookbook do PyQGIS
Vamos supor que você já tenha uma referência a uma camada vetorial chamada
vl
obtida porTransações
Os exemplos a seguir estão trabalhando em uma transação (armazenada em cache localmente no QGIS). Antes de iniciar a sessão de edição, você deve ligar
e termine com
para escrever suas alterações na fonte de dados. ou
para descartar as alterações
Você também pode trabalhar diretamente
vl.dataProvider()
e esquecer as instruções de controle de transação. (Resultando em comportamento semelhante à confirmação automática)Adicionando um campo
QgsVectorLayer.addAttribute (QgsField)
Isso funciona apenas se o provedor de dados implementar o recurso AddAttributes. Você pode verificar isso com:
Calcular campos
Veja esta resposta:
É possível adicionar programaticamente campos calculados?
O objetivo ainda é o 1.8, então, em vez de
vl.select()
você precisar chamar o equivalente a 2.0vl.getFeatures()
(consulte Alterações na API do QGIS )Atualizar linhas
QgsVectorLayer.updateField (featureId, fieldIndex, value)
Verificação de pré-requisitos (opcional):
Para conhecer o fieldIndex, você pode usar
QgsVectorLayer.pendingFields()
Edit: Veja também o comentário de NathanW, que menciona o
QgsVectorLayer.updateFeature( feature )
método bem legível .Excluir linhas
QgsVectorLayer.deleteFeature (featureId)
Verificação opcional de pré-requisitos:
fonte
feature[5] = 'hello'
elayer.updateFeature(feature)
é melhor, em seguida, utilizando vl.updateField IMOÉ assim que você faria seu código no PyQGIS:
fonte
Confira o livro de receitas PyQGIS e a seção de modificação da camada vetorial, em particular.
fonte