6 votos

Cómo seleccionar y cambiar sólo ciertos (mismos) valores en attributetable en QGIS

Tengo una tabla de atributos. En ella hay números dispersos como -99999997. Quiero sustituirlos por cero (0). Hay muchas columnas en las que hay estos números. He utilizado la expresión (un ejemplo con una columna P-Ant_ARU)

case when   "P_ANT_ARU"  is  -99999997  then '0' else    "P_ANT_ARU"  end

para cada característica en la columna, pero me pregunto si hay una manera más rápida de utilizar en la calculadora de campo para deshacerse de todos los -99999997 en uno o tal vez dos pasos, porque hay un montón de columnas :-)

También he probado toint(0) pero eso no funciona porque hay que elegir un campo, y yo quiero un valor que hay que cambiar. El mismo problema ocurre con el plugin QuickMultiAttributeEdit.

Entonces, ¿cómo puedo seleccionar todos esos números en toda la tabla y hacerlos cero?

attributetable

4voto

Mue Puntos 2469

A continuación se presentan un par de métodos que podría utilizar en el Consola Python que sustituye todos los valores del Tabla de atributos de -99999997 con 0 . Como están dentro de una función, no debería haber nada impreso en la consola (por si esto congela de alguna manera a QGIS). Después de una prueba limitada, encontré que cambiar los atributos columna por columna era un poco más rápido.

  • Fila por fila:

    def by_row():
        layer = qgis.utils.iface.activeLayer()  
        layer.startEditing()   
        for feat in layer.getFeatures():
            f = feat.fields()
            num = f.count()
            for i in range(num):
                if feat[i] == '-99999997':
                    feat[i] = '0'
                    layer.updateFeature(feat)
        layer.commitChanges()
    
    by_row()
  • Columna por columna:

    def by_column():
        layer = qgis.utils.iface.activeLayer()  
        layer.startEditing()   
        for field in layer.dataProvider().attributeIndexes():
            for feature in layer.getFeatures():
                attrs = feature.attributes()
                if attrs[field] == '-99999997':
                    feature[field] = '0'
                    layer.updateFeature(feature)
        layer.commitChanges()
    
    by_column()

0 votos

Layer = qgis.utils.iface.activeLayer() File "<input>", line 1 layer = qgis.utils.iface.activeLayer() ^ IndentationError: unexpected indent layer.startEditing() False for feat in layer. getFeatures(): f = feat.fields() num = f.count() for i in range(num): if feat[i] == '-99999997': feat[i] = '0' File "<input>", line 6 feat[i] = '0' ^ IndentationError: expected an indented block. Es lo que obtengo de vuelta.....

0 votos

@Willem - Disculpas amigo, se me olvidó poner la sangría después del if declaración. Ahora debería funcionar =)

1 votos

Gracias lo solucioné yo mismo aunque no soy un usuario de Python, pero sé un poco de javascript y PHP + internet. Se está ejecutando ahora y toma un tiempo y ver un montón de verdadero :-)

2voto

Zoltan Puntos 284

Hacer una selección de atributos en la tabla de atributos, por ejemplo

P_MAROKKO = -99999997

A continuación, utilice la calculadora de campo, compruebe Sólo las características seleccionadas y el campo existente y asignar el valor.

0 votos

Eso es lo que hice/hago ya con 'case when "P_ANT_ARU" is -99999997 then '0' else "P_ANT_ARU" end' lo que sugieres es la 'misma' manera y no lo que pedí :-) Voy a probar el código de Python.

1voto

KHAN Puntos 6

Después de intentar usar el script de Python, que no funcionó, pasé a la siguiente solución mencionada anteriormente: abrir el .dbf en Open Office Calc y con buscar/reemplazar. Fue cuestión de segundos que los resultados estuvieran listos. No hay ningún problema con el shapefile, así que eso es lo que voy a utilizar. Mis primeros temores pienso en usar un programa externo para hacer el trabajo donde basado en el uso de Excel , Calc hizo la cosa para mí. Para cantidades menores de datos en una columna usaré lo de _case when "P_ANT_ARU" is -99999997 then '0' else "P_ANT_ARU" end_. Sin embargo, aprendí sobre Python...

1voto

ArMoraer Puntos 338

Abrir el .dbf de su shapefile con Excel, LibreOffice Calc o algo equivalente. A continuación, un simple "Buscar y reemplazar" debe hacer el trabajo.

Cuidado con el formato de codificación al abrir y guardar el .dbf Sin embargo, el archivo.

EDITAR: Nota importante (siguiendo el comentario de iant): haga una copia de seguridad de su shapefile antes de editar manualmente el .dbf ya que esta operación podría romper su archivo shape.

0 votos

Se puede resolver en QGIS.

1 votos

Según tengo entendido, el autor de la pregunta tiene muchos atributos en su shapefile y quiere editarlos todos al mismo tiempo. Por lo que sé, esto no se puede hacer fácilmente en QGIS. Por eso sugerí una herramienta externa. EDIT: comentario movido a la sección correcta.

0 votos

Es muy fácil romper su shapefile haciendo esto si el orden de las filas cambia

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