9 votos

¿Cuáles son QGIS Arcpy Funciones Equivalentes para Actualizar/Eliminar Fila o el Campo?

Estoy tratando de reprogramar algunos scripts de arcpy a qgis (1.8 o 2.0) y hay algunas funciones simples que quiero ser capaz de rehacer, pero lamentablemente la documentación en qgis es falta en ciertas áreas.

Es decir, las tres más importantes para mí son

Agregar Campo - Agregar campo

arcpy.AddField_management(Feature, "ID", "SHORT")

Calcular el Campo de la Gestión de Actualización de ese campo

arcpy.CalculateField_management(Feature,"ID","!FID!")

Actualizar/Eliminar Filas - Actualizar/Eliminar filas basado en la condición (sin copiar el archivo 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

Ahora puedo recorrer cada característica en QGIS usando SEXTANTE y obtener su geometría que yo debería ser capaz de volver a escribir en un nuevo shapefile y así actualizar/eliminar una fila o en el campo. Empezando con algo a lo largo de las líneas de...

layer = st.getobject(Polygon)
features = st.getfeatures(layer)
for f in features:
    f.geometry().asPolygon()

pero no puedo encontrar una solución sencilla para aquellos funciones mencionadas anteriormente?

16voto

Michael Puntos 11

Los siguientes ejemplos se basan en la (pronto-a-ser-lanzado) de QGIS 2.0 API. Esto ha cambiado desde 1.8, por lo que la sintaxis para esta versión, que difieren en algunos lugares.

El mejor recurso para el 1.8 compatibles con las soluciones y en profundidad de la explicación de fondo de parámetros (también aplica para 2.0) son los PyQGIS libro de cocina

Vamos a suponer que usted ya tiene una referencia a una capa vectorial llamado vl obtenido por ej.

vl = iface.activeLayer()

Las transacciones

Los siguientes ejemplos están trabajando en una transacción (en caché local en QGIS). Antes de iniciar la sesión de edición, usted tiene que llamar

vl.startEditing()

y al final con

vl.commitChanges()

para escribir los cambios en el origen de datos. o

vl.rollBack()

para descartar los cambios

Usted también podría trabajar directamente en vl.dataProvider() y olvidarse de la transacción de las sentencias de control. (Lo que resulta en autocommit-como el comportamiento)

La adición de un campo

QgsVectorLayer.addAttribute( QgsField )

from PyQt4.QtCore import QVariant
vl.addAttribute( QgsField( 'fieldname', QVariant.String ) )

Esto sólo funciona si el dataprovider implementa la AddAttributes capacidad. Usted puede comprobar esto con:

if vl.dataProvider().capabilities() & QgsVectorDataProvider.ChangeAttributeValues

Calcular los campos

Ver esta respuesta:

Es posible agregar mediante programación campos calculados?

Todavía destinadas a 1.8, así que en lugar de vl.select() usted tiene que llamar a la 2.0 equivalente vl.getFeatures() ( ver QGIS cambios en el API )

Filas de la actualización

QgsVectorLayer.updateField( featureId, fieldIndex, valor )

vl.updateField( 1000, 5, 'hello' )

Preqrequisites de verificación (opcional):

if vl.dataProvider().capabilities() & QgsVectorDataProvider.ChangeAttributeValues

Para saber el fieldIndex, puede utilizar QgsVectorLayer.pendingFields()

Editar: Ver también el comentario por NathanW el que se menciona el bien legible QgsVectorLayer.updateFeature( feature ) método.

Eliminar filas

QgsVectorLayer.deleteFeature( featureId )

vl.deleteFeature( 1000 )

Opcional de comprobación de requisitos previos:

if vl.dataProvider().capabilities() & QgsVectorDataProvider.DeleteFeatures

6voto

Jauder Ho Puntos 3172

Esta es la manera de hacer su código en PyQGIS:

keep = ["Bob","Janet","John","Mike"]

for counter, feature in enumerate(layer.getFeatures()):
    if feature['Name'] in keep:
        feature['ID'] = counter
        layer.updateFeature(feature)
    else:
        layer.deleteFeature(feature.id())

1voto

crstamps2 Puntos 233

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X