จัดเรียงตามหลายฟิลด์ในเวลาเดียวกันใน QGIS?


17

เป็นไปได้ไหมที่จะเรียงลำดับหลาย ๆ ฟิลด์ในเวลาเดียวกันใน QGIS?

ตัวอย่างเช่นฉันต้องการจัดเรียงตารางตามชื่อรัฐแล้วภายในแต่ละรัฐเรียงตามชื่อเขต

นี่จะเหมือนกับตัวเลือก Advanced Sort ที่มีอยู่ใน ArcMap

คำตอบ:


4

จริงๆแล้วมีเคล็ดลับง่าย ๆ สมมติว่าคุณต้องการเรียงลำดับตามฟิลด์ "A" ก่อนแล้วตามด้วยฟิลด์ "B" ภายใน "A" คลิกซ้ายครั้งแรกที่ส่วนหัวของฟิลด์ "B" (คลิกหนึ่งครั้งเพื่อเรียงลำดับจากน้อยไปมากเป็นครั้งที่สองสำหรับการเรียงจากน้อยไปหามาก) ในตารางแอตทริบิวต์ จากนั้นคลิกซ้ายที่ส่วนหัวของฟิลด์ "A" (หนึ่งครั้งสำหรับ ASC, ครั้งที่ 2 สำหรับ DESC) การกระทำล่าสุดนี้จะมีการเรียงลำดับเขตข้อมูล "A" ในขณะที่รักษาการเรียงลำดับของฟิลด์ "B" ภายในค่าที่เหมือนกันของ "A" พยายาม 3 ฟิลด์และใช้งานได้ (จากนั้นก็เบื่อ) ฉันใช้ QGIS 3.6.3-Noosa


ยอดเยี่ยม ฉันยังทดสอบมันด้วย 3 ฟิลด์ (รัฐเคาน์ตีเมือง) และมันทำงานได้อย่างสมบูรณ์แบบ - ขึ้นหรือลง 3.8.3
Stu Smith

8

คุณสามารถใช้ปลั๊กอินเรียงลำดับและหมายเลข ช่วยให้คุณสามารถจัดเรียงตารางแอตทริบิวต์ได้สูงสุด 3 ฟิลด์จากนั้นจะสร้างฟิลด์เพิ่มเติมที่มีคำสั่งของคุณสมบัติที่เรียงลำดับ

คำเตือน: ฉันเป็นผู้เขียนปลั๊กอิน


หวังว่ามันจะทำงาน ฉันวางมันลงบนชุดข้อมูลชุดข้อมูลขนาด 150k ของฉันและมันยังคงดำเนินต่อไปหลังจาก 10 นาที ฮาร์ดโค้ดนี้จัดเรียงในคอลัมน์ใหม่เพื่อให้คุณสามารถเรียงลำดับตามนั้น - มีวิธีที่ทำงานใน excel หรือ ArcMap ที่ไม่เพิ่มคอลัมน์หรือไม่? ดูdesktop.arcgis.com/th/arcmap/10.3/manage-data/tables/…
GeorgeC

1
ฉันหวังว่ามันจะใช้ได้ฉันไม่เคยทดสอบบนชุดข้อมูลขนาดใหญ่เช่นนี้ ฉันไม่คิดว่าเป็นไปได้เพียงแค่เปลี่ยนลำดับการแสดงเช่นใน ArcMap QGIS API ไม่มีวิธีการใด ๆ นั่นเป็นเหตุผลที่ฉันเลือกที่จะเพิ่มเขตข้อมูลตัวเลขเป็นวิธีแก้ปัญหา
ArMoraer

มันยังคงเป็น - อาร์คแมปทำมันในเวลาประมาณ 30 วินาที โอ้ดี ขอบคุณสำหรับการแก้ปัญหาแม้ว่า - ฉันจะเปิดนี้เป็นเวลา 24 ชั่วโมงเพื่อดูว่าใครมีคำแนะนำอื่น ๆ
GeorgeC

ตกลงขอบคุณสำหรับคำติชม ปลั๊กอินอาศัยโดยตรงกับsort()ฟังก์ชั่นของ Python ฉันสงสัยว่าทำไมมันช้ามาก ฉันจะพยายามหาเคล็ดลับที่จะทำให้กระบวนการเร็วขึ้นในรุ่นอนาคต
ArMoraer

เครื่องมือที่ดี ... ช่วยฉันทำงานได้มาก ... ชื่นชมมาก
K_Man

7

ถ้าตกลงเพื่อบันทึกผลลัพธ์อย่างถาวรคุณสามารถเรียงลำดับ shapefile ด้วย 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

ใช้เวลาน้อยกว่า 3 นาทีด้วยไฟล์รูปร่างที่มีรูปหลายเหลี่ยมหนึ่งล้าน


1
ขอบคุณ แต่ฉันไม่ต้องการทำอะไรถาวรเพราะมันจะสร้างชุดข้อมูลหลายชุดและฉันก็หวังว่าจะได้วิธีการจากภายใน QGIS เอง
GeorgeC

2
จากนั้นฉันอาจจะแปลง shapefile เป็น Spatialite ด้วย DB Manager คุณสามารถสร้างและเรียกใช้แบบสอบถาม SQL นอกจากนี้คุณยังสามารถบันทึกแบบสอบถามที่ใช้บ่อยสำหรับความต้องการในอนาคต
user30184

5

ขณะนี้ปลั๊กอิน DB Manager ใน QGIS มีโหนด 'เลเยอร์เสมือน' ที่ช่วยให้คุณสามารถเขียนคำสั่ง SQL กับรูปร่างของไฟล์ที่โหลดลงในโครงการ QGIS ของคุณ

ดังนั้นเมื่อคุณมีความสามารถนี้แล้วตรรกะ SQL ในการเรียงลำดับตามเขตข้อมูลหลาย ๆ อันอยู่ในคำสั่ง ORDER BY โดยใช้ asc (จากน้อยไปมาก), desc (จากมากไปหาน้อย) และคุณสามารถรวมมันเข้าด้วยกันเพื่อจัดเรียงตามคอลัมน์ต่างๆ

ป้อนคำอธิบายรูปภาพที่นี่

โบนัสที่เพิ่มเข้ามาคือคุณจะได้เรียนรู้ SQL เพิ่มเติมดังนั้นเมื่อคุณเบื่อกับรูปร่างและส่วนใหญ่ของ PostGIS การกระโดดจะไม่ยอดเยี่ยมมาก !!!


ขอบคุณ - นี่เป็นทางออกที่ยอดเยี่ยม แต่สำหรับกรณีการใช้งานนี้ฉันไม่ต้องการเปลี่ยนรูปแบบข้อมูลเป็นอย่างอื่น
GeorgeC

2
คุณสามารถทำงานกับ. HPP สำหรับวิธีนี้ - นี่ไม่เปลี่ยนรูปแบบข้อมูล ลองใช้ ...
DPSSpatial

1
@GeorgeC คุณลองใช้ดูไหม?
DPSSpatial

5

สิ่งนี้สามารถทำได้โดยไม่ต้องใช้ปลั๊กอินหรืองานเฉพาะฐานข้อมูลอย่างน้อยรุ่น 3.2 ขึ้นไป หากต้องการจัดเรียงตามหลายคอลัมน์:

  1. คลิกขวาที่ส่วนหัวของคอลัมน์ตารางแอตทริบิวต์แล้วเลือก "เรียง ... "
  2. เพิ่มฟังก์ชันconcat()พร้อมกับเขตข้อมูลที่คุณต้องการเรียงลำดับตามลำดับที่ถูกต้อง (เช่นconcat("column1", "column2")) ตัวอย่างผลลัพธ์ควรแสดงอยู่ด้านล่างรหัสของคุณ
  3. ทำเครื่องหมายหรือยกเลิกการเลือกช่องทำเครื่องหมาย "เรียงจากน้อยไปหามาก" ที่ด้านล่างเพื่อกำหนดค่าทิศทางการจัดเรียงคอลัมน์
  4. คลิกตกลงและยืนยันการเรียงลำดับ

ฟังก์ชั่นนี้ถูกบันทึกผ่านทางรุ่น # 1137และครอบคลุมในล่าสุด (การพัฒนา) รุ่นของคู่มือการใช้


1
ทดสอบสำเร็จด้วย QGIS 3.6
นาย Che

ฉันได้เชื่อมสตริงและจำนวนเต็มที่ไม่มีความยาวคงที่แล้วดังนั้นฉันจึงใช้การวนรอบเพื่อเติมจำนวนเต็มลงในสตริงความยาวคงที่:concat("col1", right( ('000' || tostring( "col2" )), 4))
NettaB

2

ตอนนี้เป็นปี 2018 ดังนั้นฉันไม่อยากจะเชื่อเลยว่ายังไม่ได้รับคำตอบ

  1. เปิดมุมมองตารางแอตทริบิวต์และคลิกขวาที่คอลัมน์ใด ๆ จากนั้นเลือก เรียงลำดับ ...

  2. หน้าต่างไดอะล็อกกำหนดค่าการเรียงลำดับตารางแอ็ตทริบิวต์เปิดตอนนี้ด้วยตัวแก้ไขนิพจน์แบบเต็มเช่นกัน

  3. ใช้ฟังก์ชัน COALESCE กับคอลัมน์ที่ต้องการเช่นนี้จะเรียงลำดับตารางตาม 3 คอลัมน์ (อันดับแรกตาม ID จากนั้นเป็นรุ่น VERSION และ fid)

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

ป้อนคำอธิบายรูปภาพที่นี่

การคลิกตกลงจะเป็นการจัดเรียงตาราง


น่าเสียดายที่การรวมกันไม่ได้ผลสำหรับฉัน ในการทดสอบโดยใช้ตารางแอ็ตทริบิวต์ shapefile ที่มีคอลัมน์จำนวนเต็มสองคอลัมน์ (ทั้งสองมีการรวมกันของตัวเลขและค่าว่าง): 1) โดยไม่เลือกปุ่มการเรียงจากน้อยไปมากผลการเรียงลำดับคอลัมน์แรกที่ถูกต้อง น้อยไปหามากสำหรับแต่ละค่าภายในคอลัมน์แรก 2) เมื่อกดปุ่มเรียงจากน้อยไปมากแล้วผลลัพธ์จะเป็นผลลัพธ์แบบสุ่มที่ไม่สมเหตุสมผล
Stu Smith

1
คุณสามารถต่อฟิลด์ได้โดย "||" ตัวดำเนินการรวมกันจะส่งกลับค่าที่ไม่ใช่ค่า NULL แรกซึ่งไม่ถูกต้องสำหรับการเรียงลำดับ อาจเป็นไปได้ว่าคุณควรใช้การจัดรูปแบบบางอย่างเพื่อให้มี 1 ก่อนวันที่ 11
Zoltan

1

คุณทำไม่ได้ (อย่างน้อยก็ในตอนนี้) ขออภัย!

ดูเอกสารประกอบของ QGISและเลื่อนลงไปที่บรรทัดสุดท้าย

การแก้ไขที่น่ารังเกียจคือการดึง DBF ของ Shapefile ลงใน Excel เรียงมันและบันทึกผลลัพธ์ อีกทางเลือกหนึ่งนำเข้า Shapefile ของคุณลงใน PostGIS หรือ SpatialLite ซึ่งคุณมีฟังก์ชันการเรียงลำดับที่ดีกว่า โดยทั่วไปคุณจะต้องผ่าน QGIS สำหรับการเรียงลำดับขั้นสูง


2
+1 สำหรับบันทึกย่อที่ถูกต้องซึ่งปัจจุบันไม่สามารถทำได้ แต่ -1 สำหรับการแนะนำการล้อเล่นกับ DBF ใน Excel
underdark

ฉันบอกว่ามันเป็น 'น่ารังเกียจ' :)
MappaGnosis

คุณพูดถึง PostGIS และ SpatiaLite: คุณสามารถแสดงตัวอย่างของวิธีการที่ OP ร้องขอจากภายใน QGIS ด้วยการใช้ db-plugin ได้หรือไม่?
steko

0

ตามที่แนะนำโดย @Sylvester Sneekly หากข้อมูลของคุณถูกโหลดลงใน RDBMS เช่น PosGIS หรือ SpatialLite คุณสามารถพิจารณาสร้างมุมมองฐานข้อมูลใน RDBMS ที่ตั้งค่าข้อมูลแบบตารางจากนั้นโหลดมุมมองที่ถูกเรียงไว้ล่วงหน้าเป็นเลเยอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.