19 votos

Asignación de número de fila para tabla ordenada por columna en QGIS

En QGIS 3, la calculadora de campo tiene una gran función llamada @row_number (en QGIS 2 era $rownum ) que devuelve (asigna) el número de la fila actual.

¿Hay alguna forma de hacer que funcione junto con la clasificación?

Digamos que quiero ordenar la tabla por columnas "length" y obtener el orden (secuencia) de las líneas por longitud de la más corta a la más larga.

Sé que puedo utilizar algún software de hoja de cálculo de oficina fácilmente para esto para ordenar por columna y rellenar nueva columna con el orden (secuencia). Pero preferiría hacer todo el trabajo en QGIS.

Como solución también existe Cambio del orden de las características en el shapefile - utilizando el plugin MMQGIS y la función modificar/clasificar y después utilizar @row_number ( $rownum ) en el nuevo archivo guardado.

32voto

ArMoraer Puntos 338

He codificado un plugin ( Ordenar y numerar ) para resolver su problema. Le permite seleccionar hasta 3 campos y ordenar su tabla de atributos según estos campos. A continuación, numera la tabla de atributos en un nuevo campo (denominado "orden" por defecto), empezando por 1.

enter image description here

10voto

aliyah Puntos 1

No estoy seguro de que pueda con calculadora de campo, pero puede utilizar un "Capa virtual" a través de Layer > Add Layer > Add/Edit Virtual Layer... con una consulta como :

SELECT * ,
      (SELECT count(*)
       FROM "your_layer" AS b
       WHERE a.length >= b.length) AS length_position
FROM "your_layer" AS a 
ORDER BY a.length

8voto

she_weeds Puntos 126

Para una ordenación simple (por una columna) puede utilizar expresiones QGIS en la Calculadora de campos.

En QGIS 3.8 las funciones de agregación han permitido utilizar un campo de orden (que puede ser diferente del campo agregado).

Esto significa que puede utilizar algo como la siguiente expresión para:

  1. array_agg todos los $id en una matriz, ordenados por ORDER_FIELD
  2. Busca la posición, en esta nueva matriz ordenada, de la característica actual $id (empieza por 0 - añada un +1 al final para que empiece desde 1)
  3. Envía la nueva numeración a otra columna para ordenarla.

Expresión:

array_find(
           array_agg($id,
                     order_by:="ORDER_FIELD"),
           $id)
        +1

Ejemplo: enter image description here


Otras notas:

  • $id es siempre único y secuencial y se recalcula incluso después de añadir/eliminar características, por lo que no es necesario depender de una columna ID única separada.

  • Si ORDER_FIELD tiene números en una columna de texto o una combinación alfanumérica (p. ej. '1', '2', '3', '3A', '4' ) puede utilizar la conversión sobre la marcha (mediante to_int("ORDER_FIELD") ) o el relleno cero (por ejemplo lpad("ORDER_FIELD",3,'0') ) para asegurarse de que se clasifica en el orden correcto.

  • Para invertir el orden utilice array_reverse() entre array_find() y array_agg()

  • Para ordenar por varios campos, puede concatenarlos en el campo order_by (por ejemplo "textfield"||"ORDER_FIELD" ) - sólo asegúrese de poner a cero cualquier campo numérico para que ordene por A01,A02....A11,B1, no A1,A11,A12...A2,B1

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