在QGIS中同时按多个字段排序?


17

是否可以在QGIS中同时对多个字段进行排序?

例如,我想按州名对表格排序,然后在每个州内,按县名排序。

这与ArcMap中可用的“高级排序”选项相同。

Answers:


4

实际上有一个非常简单的技巧。假设您要先按字段“ A”排序,然后再按“ A”中的字段“ B”排序。首先在属性表中单击字段“ B”的标题(单击一次以升序排序,第二次单击降序)。然后,在字段“ A”的标题上单击鼠标左键(一次用于ASC,第二次用于DESC)。最后一个动作将对字段“ A”进行排序,同时在“ A”的相同值内保留字段“ B”的排序。尝试了3个字段,它也可以工作(然后很无聊)。我正在使用QGIS 3.6.3-Noosa。


优秀!我还用3个字段(州,县,市)对其进行了测试,并且效果很好-升序或降序。3.8.3。
Stu Smith,

8

您可以使用“ 排序和数字”插件。它允许您按最多3个字段对属性表进行排序,然后创建一个包含已排序要素顺序的附加字段。

免责声明:我是插件的作者。


希望它会工作。我将其设置到我的150k记录数据集上,并且仍然需要10分钟。这会在新列中对排序进行硬编码,因此您可以按此进行排序-是否有一种类似于excel或ArcMap的工作方式而不添加列?请参阅desktop.arcgis.com/en/arcmap/10.3/manage-data/tables/…–
GeorgeC

1
我也希望它能够工作,我从未在如此大的数据集上进行过测试。我认为不可能像ArcMap那样简单地更改显示顺序。QGIS API没有提供任何方法。这就是为什么我选择添加编号字段作为解决方法的原因。
ArMoraer

它仍在继续-ArcMap在30秒钟内完成了它。那好吧。不过,感谢您的解决方案-我将开放24小时,看看是否还有其他建议。
GeorgeC

好的,谢谢您的反馈。该插件直接依赖于Python的sort()功能,我想知道为什么它这么慢。我将尝试找到一些技巧,以在以后的版本中加快该过程。
ArMoraer '16

好的工具...为我节省了很多工作...非常感谢
K_Man

7

如果可以永久保存结果,则可以使用GDAL对shapefile进行排序

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

包含一百万个多边形的shapefile用了不到3分钟的时间。


1
谢谢,但是我不想做任何永久的事情,因为它会生成多个数据集,而且我也希望从QGIS本身中找到一种方法。
GeorgeC

2
然后,我可能会将shapefile转换为Spatialite。然后,使用DB Manager可以构建和运行SQL查询。您还可以保存经常使用的查询,以备将来使用。
user30184 '16

5

QGIS中的DB Manager插件现在具有“虚拟层”节点,该节点使您可以针对加载到QGIS项目中的shapefile编写SQL命令。

因此,既然您已经具备了这种能力,则可以使用asc(升序),desc(降序)在ORDER BY语句中进行按多个字段排序的SQL逻辑,并且可以将它们串在一起以按多个列进行排序:

在此处输入图片说明

另外一个好处是,您将学到更多的SQL,因此,当您厌倦了shapefile时,大多数人都对PostGIS而言,飞跃不会那么大!!!


谢谢-这是一个很好的解决方案,但是对于这种用例,我也不想将数据格式更改为其他任何格式。
GeorgeC

2
您可以使用.SHP解决方案-这不会更改数据格式。试试看...
DPSSpatial

1
@GeorgeC您尝试过吗?
DPSSpatial

5

至少对于3.2+版本,现在无需任何插件或特定于数据库的工作即可完成此操作。要按多列排序:

  1. 右键单击属性表列标题,然后选择“排序...”
  2. 添加功能 concat()以正确的顺序(例如concat("column1", "column2"))以及要排序的字段。输出预览应显示在代码下方。
  3. 选中或取消选中底部的“升序排列”复选框,以配置列的排序方向。
  4. 单击确定,然后确认排序。

此功能是通过问题#1137添加的,并在用户手册最新(开发)版本中进行了介绍


1
已通过QGIS 3.6成功测试。
车先生

我已将字符串和一个没有固定长度的整数连接在一起,所以我使用了一种变通方法将整数零填充为固定长度的字符串: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)选中“升序排序”按钮,结果是一个没有意义的随机结果。
斯图史密斯

1
您可以通过“ ||”连接字段 运算符,coalcece将返回无效的第一个非NULL值。可能您应该使用某种格式来在11之前设置
1。– Zoltan

1

您不能(至少目前没有)。抱歉!

请参阅QGIS文档并向下滚动到最后一行。

讨厌的解决方法是将Shapefile的DBF导入Excel。在那里排序并保存结果。或者,将您的Shapefile导入PostGIS或SpatialLite中,这些地方具有更好的排序功能。基本上,您将必须绕过QGIS进行高级排序。


2
+1正确的注意,它目前不是可能的,但-1与在Excel中DBF提示搞乱
幽暗地域

我确实说过“很讨厌” :)
MappaGnosis

您提到了PostGIS和SpatiaLite:您能否展示一个示例,说明如何使用db-plugin来执行OP在QGIS中要求的操作?
steko

0

正如@Sylvester Sneekly所建议的那样,如果将数据加载到PosGIS或SpatialLite之类的RDBMS中,则可以考虑在RDBMS中创建对表格式数据进行预排序的数据库视图,然后将预排序的视图作为图层加载到QGIS中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.