¿Ordenar por múltiples campos al mismo tiempo en QGIS?

17

¿Es posible ordenar múltiples campos al mismo tiempo en QGIS?

Por ejemplo, me gustaría ordenar una tabla por nombre de estado, y luego dentro de cada estado, ordenar por nombre de condado.

Esto sería lo mismo que la opción Clasificación avanzada disponible en ArcMap.

Stu Smith
fuente

Respuestas:

3

En realidad hay un truco muy simple. Supongamos que desea ordenar por campo "A" primero, y luego por campo "B" dentro de "A". Primero haga clic izquierdo en el encabezado del campo "B" (haga clic una vez para ordenar en forma ascendente, una segunda vez para descender) en la tabla de atributos. Luego haga clic izquierdo en el encabezado del campo "A" (una vez para ASC, segunda vez para DESC). Esta última acción habrá ordenado el campo "A", mientras conserva la clasificación del campo "B" dentro de valores idénticos de "A". Lo probé con 3 campos y también funciona (luego me aburrí). Estoy usando QGIS 3.6.3-Noosa.

Benoit St-Onge
fuente
¡Excelente! También lo probé con 3 campos (estado, condado, ciudad) y funcionó perfectamente: ascendente o descendente. 3.8.3.
Stu Smith
8

Puede usar el complemento Ordenar y numerar . Le permite ordenar una tabla de atributos por hasta 3 campos, luego crea un campo adicional que contiene el orden de las características ordenadas.

Descargo de responsabilidad: soy el autor del complemento.

ArMoraer
fuente
Esperemos que funcione. Lo configuré en mi conjunto de datos de registro de 150k y todavía continúa después de 10 minutos. Esto codifica el orden en la nueva columna para que luego pueda ordenar por eso: ¿hay alguna manera que funcione como en Excel o ArcMap que no agregue una columna? ver desktop.arcgis.com/en/arcmap/10.3/manage-data/tables/…
GeorgeC
1
También espero que funcione, nunca lo probé en conjuntos de datos tan grandes. No creo que sea posible simplemente cambiar el orden de visualización, como en ArcMap; QGIS API no proporciona ningún método para hacerlo. Es por eso que elegí agregar un campo de numeración como solución alternativa.
ArMoraer
Todavía está funcionando: ArcMap lo hizo en unos 30 años. Oh bien. Sin embargo, gracias por la solución: mantendré esto abierto durante 24 horas para ver si alguien tiene alguna otra sugerencia.
GeorgeC
Ok, gracias por los comentarios. El complemento se basa directamente en la sort()función de Python , me pregunto por qué es tan lento. Intentaré encontrar algún truco para acelerar el proceso en una versión futura.
ArMoraer
Nice Tool ... me ahorró mucho trabajo ... muy apreciado
K_Man
7

Si está bien guardar el resultado de forma permanente, puede ordenar el archivo de forma con GDAL

ogr2ogr -f "ESRI Shapefile" -dialect sqlite -sql "SELECT *
FROM my_shapefile ORDER BY attr_1, attr_2, attr_3" sorted.shp my_shapefile.shp

Tomó menos de 3 minutos con un archivo de forma que tiene un millón de polígonos.

usuario30184
fuente
1
gracias, pero prefiero no hacer nada permanente, ya que generará múltiples conjuntos de datos y también esperaba una forma desde QGIS.
GeorgeC
2
Entonces probablemente convertiría el shapefile en Spatialite. Con DB Manager, puede compilar y ejecutar consultas SQL. También puede guardar las consultas de uso frecuente para futuras necesidades.
user30184
5

El complemento DB Manager en QGIS ahora tiene un nodo 'Capas virtuales' que le permite escribir comandos SQL contra archivos shape cargados en su proyecto QGIS.

Entonces, ahora que tiene esta capacidad, la lógica SQL para ordenar por múltiples campos está en la instrucción ORDER BY, usando asc (ascendente), desc (Descendente), y puede encadenarlos para ordenarlos por múltiples columnas:

ingrese la descripción de la imagen aquí

Una ventaja adicional es que aprenderá más SQL, así que cuando se canse de los archivos de forma y la mayoría en PostGIS, ¡el salto no será tan bueno!

DPSSpacial
fuente
Gracias, esta es una gran solución, sin embargo, para este caso de uso, tampoco quiero cambiar el formato de datos a otra cosa.
GeorgeC
2
Puede trabajar con .SHP para esta solución; esto no cambia el formato de datos. Pruébelo ...
DPSSpatial
1
@GeorgeC, ¿probaste esto?
DPSEspacial
5

Esto ahora se puede hacer sin ningún complemento o trabajo específico de la base de datos, al menos para la versión 3.2+. Para ordenar por múltiples columnas:

  1. Haga clic derecho en el encabezado de columna de la tabla de atributos y elija "Ordenar ..."
  2. Agregue la función concat()junto con los campos por los que desea ordenar, en el orden correcto (ej. concat("column1", "column2")). Se debe mostrar una vista previa de salida debajo de su código.
  3. Marque o desmarque la casilla de verificación "Ordenar ascendente" en la parte inferior para configurar las direcciones de clasificación de columnas.
  4. Haga clic en Aceptar y confirme el orden.

Esta funcionalidad se agregó a través del número 1137 y se cubrió en la última versión (desarrollo) del manual del usuario .

Eron Lloyd
fuente
1
Probado con éxito con QGIS 3.6.
Sr. Che el
He concatenado una cadena y un número entero que no tiene una longitud fija, por lo que utilicé una concat("col1", right( ('000' || tostring( "col2" )), 4))
solución alternativa
2

Bueno, ahora es 2018, así que no puedo creer que aún no se haya respondido.

  1. Abra la vista de la tabla de atributos y haga clic derecho en cualquier columna, luego elija Ordenar ...

  2. La ventana de diálogo Configurar el orden de clasificación de la tabla de atributos está abierta ahora con el editor de expresiones completas también

  3. Use la función COALESCE con las columnas deseadas, por ejemplo, esto ordenará una tabla por 3 columnas (primero por ID, luego VERSIÓN y luego fid)

coalesce("ID","VERSION","fid" )

ingrese la descripción de la imagen aquí

Al hacer clic en Aceptar se ordenará la tabla.

sys49152
fuente
Desafortunadamente, la fusión no funcionó para mí. En una prueba que usa una tabla de atributos shapefile con dos columnas enteras (ambas que contienen una combinación de números y valores en blanco): 1) con el botón Ordenar ascendente sin marcar, el resultado ordenó la primera columna correcta (descendente) pero la segunda columna se ordenó incorrectamente ascendente para cada valor dentro de la primera columna. 2) con el botón Ordenar ascendente marcado, el resultado fue un resultado aleatorio que no tenía sentido.
Stu Smith
1
Puede concatenar campos con "||" operador, coalesce devolverá el primer valor no NULL que no es válido para la ordenación. Probablemente debería usar algún formato para tener 1 antes de 11.
Zoltan
1

No puedes (al menos no por el momento). ¡Lo siento!

Consulte la documentación de QGIS y desplácese hasta la última línea.

Una solución desagradable sería extraer el DBF del Shapefile en Excel. Ordénelo allí y guarde el resultado. Alternativamente, importe su Shapefile a PostGIS o SpatialLite donde tenga una mayor funcionalidad de clasificación. Básicamente, tendrá que pasar por alto QGIS para una clasificación avanzada.

MappaGnosis
fuente
2
+1 para la nota correcta de que actualmente no es posible pero -1 para sugerir jugar con el DBF en Excel
underdark
Dije que era 'desagradable' :)
MappaGnosis 03 de
Usted menciona PostGIS y SpatiaLite: ¿podría mostrar un ejemplo de cómo hacer lo que el OP solicitó desde QGIS, también usando un complemento db?
steko
0

Como lo sugiere @Sylvester Sneekly, si sus datos se cargan en un RDBMS como PosGIS o SpatialLite, podría considerar crear una vista de base de datos en el RDBMS que clasifique los datos tabulares y luego cargue la vista preseleccionada en QGIS como una capa.

RyanKDalton-OffTheGridMaps
fuente