Estoy tratando de reprogramar algunos scripts de ArcPy a QGIS (1.8 o 2.0) y hay algunas funciones simples que quiero poder rehacer, pero desafortunadamente falta documentación en QGIS en ciertas áreas.
A saber, los tres más importantes para mí son:
Agregar campo - Agregar campo
arcpy.AddField_management(Feature, "ID", "SHORT")
Calcular gestión de campo : actualice ese campo
arcpy.CalculateField_management(Feature,"ID","!FID!")
Actualizar / Eliminar filas - Actualizar / Eliminar filas según la condición (sin copiar el archivo de forma)
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
Ahora puedo iterar a través de cada característica en QGIS usando SEXTANTE y obtener su geometría que debería poder reescribir en un nuevo archivo de forma y así actualizar / eliminar una fila o campo. Comenzando con algo parecido a ...
layer = st.getobject(Polygon)
features = st.getfeatures(layer)
for f in features:
f.geometry().asPolygon()
pero no puedo encontrar una solución simple para esas funciones mencionadas anteriormente?

Respuestas:
Los siguientes ejemplos se basan en la API QGIS 2.0 (próximamente a ser lanzada). Esto ha cambiado desde 1.8, por lo que la sintaxis de esta versión diferirá en algunos lugares.
El mejor recurso para soluciones compatibles con 1.8 y una explicación en profundidad para el fondo de los parámetros (también se aplica para 2.0) son el Libro de cocina PyQGIS
Asumiremos que ya tiene una referencia a una capa vectorial llamada
vlobtenida por ej.Actas
Los siguientes ejemplos están trabajando en una transacción (localmente en caché en QGIS). Antes de comenzar la sesión de edición, debe llamar
y terminar con
para escribir sus cambios en la fuente de datos. o
para descartar los cambios
También puede trabajar directamente
vl.dataProvider()y olvidarse de las declaraciones de control de transacciones. (Resultando en un comportamiento similar a la confirmación automática)Agregar un campo
QgsVectorLayer.addAttribute (QgsField)
Esto solo funciona si el proveedor de datos implementa la capacidad AddAttributes. Puede verificar esto con:
Calcular campos
Ver esta respuesta:
¿Es posible agregar mediante programación campos calculados?
Todavía está dirigido a 1.8, por lo que en lugar de
vl.select()tener que llamar al equivalente 2.0vl.getFeatures()(ver cambios en la API de QGIS )Actualizar filas
QgsVectorLayer.updateField (featureId, fieldIndex, value)
Comprobación de requisitos previos (opcional):
Para conocer el fieldIndex, puede usar
QgsVectorLayer.pendingFields()Editar: Vea también el comentario de NathanW que menciona el
QgsVectorLayer.updateFeature( feature )método legible .Eliminar filas
QgsVectorLayer.deleteFeature (featureId)
Comprobación de requisitos previos opcionales:
fuente
feature[5] = 'hello'ylayer.updateFeature(feature)es mejor que usar vl.updateField IMOAsí es como haría su código en PyQGIS:
fuente
Consulte el libro de cocina PyQGIS y la sección de modificación de la capa vectorial en particular.
fuente