Mengurutkan berdasarkan beberapa bidang sekaligus di QGIS?

17

Apakah mungkin untuk mengurutkan beberapa bidang sekaligus pada QGIS?

Misalnya, saya ingin mengurutkan tabel berdasarkan nama negara, dan kemudian di dalam setiap negara bagian, mengurutkan berdasarkan nama county.

Ini akan sama dengan opsi Penyortiran Tingkat Lanjut yang tersedia di ArcMap.

Stu Smith
sumber

Jawaban:

3

Sebenarnya ada trik yang sangat sederhana. Misalkan Anda ingin mengurutkan berdasarkan bidang "A" terlebih dahulu, lalu menurut bidang "B" di dalam "A". Klik kiri pertama pada tajuk bidang "B" (klik sekali untuk jenis naik, kedua kali untuk turun) di tabel atribut. Kemudian klik kiri pada tajuk bidang "A" (satu kali untuk ASC, kedua kalinya untuk DESC). Tindakan terakhir ini akan mengurutkan bidang "A", sambil mempertahankan pengurutan bidang "B" dalam nilai identik "A". Mencobanya dengan 3 bidang dan juga berfungsi (kemudian bosan). Saya menggunakan QGIS 3.6.3-Noosa.

Benoit St-Onge
sumber
Luar biasa! Saya juga mengujinya dengan 3 bidang (negara bagian, kabupaten, kota) dan itu bekerja dengan sempurna - naik atau turun. 3.8.3.
Stu Smith
8

Anda dapat menggunakan plugin Sort and Number . Ini memungkinkan Anda untuk mengurutkan tabel atribut hingga 3 bidang, lalu membuat bidang tambahan yang berisi urutan fitur yang diurutkan.

Penafian: Saya pembuat plugin.

ArMoraer
sumber
semoga itu berhasil. Saya menetapkannya ke dalam dataset rekaman 150k saya dan masih berjalan setelah 10 menit. Ini mengkodekan pengurutan di kolom baru sehingga Anda kemudian dapat mengurutkannya - apakah ada cara yang berfungsi seperti di excel atau ArcMap yang tidak menambahkan kolom? lihat desktop.arcgis.com/en/arcmap/10.3/manage-data/tables/…
GeorgeC
1
Saya juga berharap ini akan berhasil, saya tidak pernah mengujinya pada dataset yang begitu besar. Saya rasa tidak mungkin mengubah urutan tampilan, seperti di ArcMap; QGIS API tidak menyediakan metode apa pun untuk melakukannya. Itu sebabnya saya memilih untuk menambahkan bidang penomoran sebagai solusinya.
ArMoraer
Masih berjalan -ArcMap melakukannya sekitar 30-an. Baiklah. Terima kasih atas solusinya - Saya akan tetap buka selama 24 jam untuk melihat apakah ada yang punya saran lain.
GeorgeC
Ok, terima kasih atas umpan baliknya. Plugin ini bergantung langsung pada sort()fungsi Python , saya bertanya-tanya mengapa ini sangat lambat. Saya akan mencoba menemukan beberapa trik untuk membuat proses lebih cepat di versi masa depan.
ArMoraer
Alat yang bagus ... menyelamatkan saya banyak pekerjaan ... sangat dihargai
K_Man
7

Jika OK untuk menyimpan hasilnya secara permanen, Anda dapat mengurutkan shapefile dengan 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

Kurang dari 3 menit dengan sebuah shapefile memiliki satu juta poligon.

pengguna30184
sumber
1
terima kasih tapi saya memilih untuk tidak melakukan sesuatu yang permanen karena akan menghasilkan banyak dataset dan saya juga berharap cara dari dalam QGIS itu sendiri.
GeorgeC
2
Maka saya mungkin akan mengubah shapefile menjadi Spatialite. Dengan DB Manager, Anda kemudian dapat membangun dan menjalankan query SQL. Anda juga dapat menyimpan kueri yang sering digunakan untuk kebutuhan di masa mendatang.
user30184
5

Plugin DB Manager di QGIS sekarang memiliki simpul 'Virtual Layers' yang memungkinkan Anda untuk menulis perintah SQL terhadap shapefile yang dimuat ke proyek QGIS Anda.

Jadi sekarang setelah Anda memiliki kemampuan ini, logika SQL untuk mengurutkan berdasarkan beberapa bidang ada dalam pernyataan ORDER BY, menggunakan asc (ascending), desc (Descending), dan Anda dapat merangkai mereka bersama untuk mengurutkan berdasarkan beberapa kolom:

masukkan deskripsi gambar di sini

Bonus tambahan adalah Anda akan belajar lebih banyak SQL sehingga ketika Anda bosan dengan shapefile dan sebagian besar untuk PostGIS lompatannya tidak akan terlalu hebat !!!

DPSSpatial
sumber
Terima kasih -ini adalah solusi yang hebat namun untuk kasus penggunaan ini saya tidak ingin mengubah format data menjadi hal lain juga.
GeorgeC
2
Anda dapat bekerja dengan .SHP untuk solusi ini - ini tidak mengubah format data. Cobalah ...
DPSSpatial
1
@ GeorgeC apakah Anda mencobanya?
DPSSpatial
5

Ini sekarang dapat dilakukan tanpa plugin atau pekerjaan khusus basis data, setidaknya untuk versi 3.2+. Untuk mengurutkan berdasarkan beberapa kolom:

  1. Klik kanan pada tajuk kolom tabel atribut dan pilih "Sort ..."
  2. Tambahkan fungsi concat()bersama dengan bidang yang ingin Anda urutkan berdasarkan, dalam urutan yang tepat (mis. concat("column1", "column2")). Pratinjau keluaran harus ditampilkan di bawah kode Anda.
  3. Centang atau hapus centang pada kotak centang "Sort Ascending" di bagian bawah untuk mengonfigurasi arah pengurutan kolom.
  4. Klik OK, dan konfirmasikan pengurutannya.

Fungsionalitas ini ditambahkan melalui edisi # 1137 , dan tercakup dalam versi terbaru (pengembangan) dari manual pengguna .

Eron Lloyd
sumber
1
Berhasil diuji dengan QGIS 3.6.
Tuan Che
Saya telah menggabungkan string dan integer yang tidak memiliki panjang tetap, jadi saya menggunakan work-around untuk mengisi nol integer ke string panjang tetap:concat("col1", right( ('000' || tostring( "col2" )), 4))
NettaB
2

Ya, sekarang tahun 2018 jadi saya tidak percaya ini belum dijawab.

  1. Buka tampilan tabel atribut dan klik kanan pada kolom apa pun, lalu pilih Sort ...

  2. Jendela dialog Konfigurasikan urutan sortir tabel atribut terbuka sekarang juga dengan editor ekspresi penuh

  3. Gunakan fungsi COALESCE dengan kolom yang diinginkan, misalnya, ini akan mengurutkan tabel dengan 3 kolom (pertama dengan ID lalu VERSION dan kemudian fid)

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

masukkan deskripsi gambar di sini

Mengklik OK akan mengurutkan tabel

sys49152
sumber
Sayangnya, penggabungan tidak berhasil untuk saya. Dalam pengujian menggunakan tabel atribut shapefile dengan dua kolom bilangan bulat (keduanya berisi campuran angka dan nilai kosong): 1) dengan tombol Sort naik tidak dicentang, hasilnya mengurutkan kolom pertama benar (turun) tetapi kolom kedua salah diurutkan naik untuk setiap nilai dalam kolom pertama. 2) dengan mengurutkan tombol Urutkan, hasilnya adalah hasil acak yang tidak masuk akal.
Stu Smith
1
Anda dapat menggabungkan bidang dengan "||" operator, coalesce akan mengembalikan nilai NULL non pertama yang tidak valid untuk penyortiran. Mungkin Anda harus menggunakan beberapa format untuk memiliki 1 sebelum 11.
Zoltan
1

Anda tidak dapat (setidaknya tidak saat ini). Maaf!

Lihat dokumentasi QGIS dan gulir ke bawah ke baris terakhir.

Pekerjaan buruk adalah menarik DBF Shapefile ke Excel. Sortir di sana dan simpan hasilnya. Atau impor Shapefile Anda ke PostGIS atau SpatialLite di mana Anda memiliki fungsi penyortiran yang lebih besar. Pada dasarnya, Anda harus memotong QGIS untuk penyortiran tingkat lanjut.

MappaGnosis
sumber
2
+1 untuk catatan yang benar bahwa saat ini tidak mungkin tetapi -1 untuk menyarankan mengacaukan DBF di Excel
underdark
Saya memang mengatakan itu 'jahat' :)
MappaGnosis
Anda menyebutkan PostGIS dan SpatiaLite: dapatkah Anda menunjukkan contoh bagaimana melakukan apa yang diminta OP dari dalam QGIS, juga menggunakan db-plugin?
steko
0

Seperti yang disarankan oleh @Sylvester Sneekly, jika data Anda dimuat ke RDBMS seperti PosGIS atau SpatialLite, Anda bisa mempertimbangkan membuat tampilan basis data dalam RDBMS yang mengatur data tabular, dan kemudian memuat tampilan yang dipilih ke dalam QGIS sebagai layer.

RyanKDalton-OffTheGridMaps
sumber