Ответы:
На самом деле есть очень простой трюк. Предположим, вы хотите отсортировать сначала по полю «А», а затем по полю «В» внутри «А». Сначала щелкните левой кнопкой мыши заголовок поля «B» (нажмите один раз для сортировки по возрастанию, второй - для сортировки по убыванию) в таблице атрибутов. Затем щелкните левой кнопкой мыши заголовок поля «A» (один раз для ASC, второй раз для DESC). Это последнее действие будет отсортировано в поле «A», сохраняя сортировку поля «B» в пределах идентичных значений «A». Пробовал с 3-мя полями и тоже работает (потом надоело). Я использую QGIS 3.6.3-Noosa.
Вы можете использовать плагин Sort and Number . Он позволяет сортировать таблицу атрибутов по трем полям, а затем создает дополнительное поле, которое содержит порядок отсортированных объектов.
Отказ от ответственности: я автор плагина.
sort()
функции Python , интересно, почему он такой медленный? Я постараюсь найти какой-нибудь трюк, чтобы ускорить процесс в следующей версии.
Если все в порядке, чтобы сохранить результат навсегда, вы можете отсортировать шейп-файл с помощью 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 минут с шейп-файлом, содержащим один миллион полигонов.
Плагин DB Manager в QGIS теперь имеет узел «Виртуальные слои», который позволяет вам писать команды SQL для шейп-файлов, загруженных в ваш проект QGIS.
Итак, теперь, когда у вас есть такая возможность, логика SQL для сортировки по нескольким полям находится в операторе ORDER BY, используя asc (возрастание), desc (убывание), и вы можете связать их вместе для сортировки по нескольким столбцам:
Дополнительный бонус заключается в том, что вы будете больше изучать SQL, поэтому, когда вам надоест шейп-файлы и большинство в PostGIS, скачок не будет таким большим!
Теперь это можно сделать без каких-либо плагинов или работы с базой данных, по крайней мере для версии 3.2+. Сортировка по нескольким столбцам:
concat()
вместе с полями, по которым вы хотите отсортировать, в правильном порядке (например, concat("column1", "column2")
). Предварительный просмотр вывода должен быть показан под вашим кодом.Эта функциональность была добавлена в выпуске № 1137 и описана в последней (разрабатываемой) версии руководства пользователя .
concat("col1", right( ('000' || tostring( "col2" )), 4))
Что ж, сейчас 2018 год, поэтому я не могу поверить, что на этот вопрос еще нет ответа.
Откройте представление таблицы атрибутов и щелкните правой кнопкой мыши по любому столбцу, затем выберите Сортировка ...
Диалоговое окно Настроить порядок сортировки таблицы атрибутов теперь можно и в редакторе полных выражений
Используйте функцию COALESCE с нужными столбцами, например, это позволит отсортировать таблицу по 3 столбцам (сначала по ID, затем по VERSION, а затем по fid).
coalesce("ID","VERSION","fid" )
Нажав OK, вы отсортируете таблицу
Вы не можете (по крайней мере, на данный момент). Сожалею!
Смотрите документацию QGIS и прокрутите вниз до самой последней строки.
Неприятным обходным решением было бы перенести DBF Shapefile в Excel. Отсортируйте его там и сохраните результат. Или же импортируйте ваш Shapefile в PostGIS или SpatialLite, где у вас есть более широкие возможности сортировки. По сути, вам придется обойти QGIS для расширенной сортировки.
По предложению @Sylvester Sneekly, если ваши данные загружаются в такие РСУБД, как PosGIS или SpatialLite, вы можете рассмотреть возможность создания представления базы данных в СУБД, которое предварительно сортирует данные в виде таблиц, а затем загрузить предварительно отсортированное представление в QGIS в качестве слоя.