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
vl
obtenida 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