Сортировка по нескольким полям одновременно в QGIS?

17

Можно ли сортировать несколько полей одновременно в QGIS?

Например, я хотел бы отсортировать таблицу по названию штата, а затем в каждом штате отсортировать по названию округа.

Это будет то же самое, что опция расширенной сортировки, доступная в ArcMap.

Стю Смит
источник

Ответы:

3

На самом деле есть очень простой трюк. Предположим, вы хотите отсортировать сначала по полю «А», а затем по полю «В» внутри «А». Сначала щелкните левой кнопкой мыши заголовок поля «B» (нажмите один раз для сортировки по возрастанию, второй - для сортировки по убыванию) в таблице атрибутов. Затем щелкните левой кнопкой мыши заголовок поля «A» (один раз для ASC, второй раз для DESC). Это последнее действие будет отсортировано в поле «A», сохраняя сортировку поля «B» в пределах идентичных значений «A». Пробовал с 3-мя полями и тоже работает (потом надоело). Я использую QGIS 3.6.3-Noosa.

Бенуа Сен-Онж
источник
Отлично! Я также проверил его с 3 полями (штат, округ, город), и он работал отлично - по возрастанию или по убыванию. 3.8.3.
Стю Смит
8

Вы можете использовать плагин Sort and Number . Он позволяет сортировать таблицу атрибутов по трем полям, а затем создает дополнительное поле, которое содержит порядок отсортированных объектов.

Отказ от ответственности: я автор плагина.

ArMoraer
источник
надеюсь, это сработает. Я установил его на свой рекордный набор данных 150k, и он все еще будет работать через 10 минут. Это жестко кодирует сортировку в новом столбце, так что вы можете сортировать по этому - есть ли способ, который работает как в Excel или ArcMap, который не добавляет столбец? см. desktop.arcgis.com/en/arcmap/10.3/manage-data/tables/…
GeorgeC
1
Я также надеюсь, что это будет работать, я никогда не проверял это на таких больших наборах данных. Я не думаю, что можно просто изменить порядок отображения, как в ArcMap; API QGIS не предоставляет никакого способа сделать это. Вот почему я решил добавить поле нумерации в качестве обходного пути.
ArMoraer
Это все еще происходит - ArcMap сделал это в 30-х годах. Ну что ж. Спасибо за решение, хотя - я буду держать это открытым в течение 24 часов, чтобы посмотреть, есть ли у кого-нибудь еще предложения.
GeorgeC
Хорошо, спасибо за отзыв. Плагин напрямую зависит от sort()функции Python , интересно, почему он такой медленный? Я постараюсь найти какой-нибудь трюк, чтобы ускорить процесс в следующей версии.
ArMoraer
Хороший инструмент ... спас мне много работы ... высоко ценится
K_Man
7

Если все в порядке, чтобы сохранить результат навсегда, вы можете отсортировать шейп-файл с помощью 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 минут с шейп-файлом, содержащим один миллион полигонов.

user30184
источник
1
спасибо, но я предпочитаю не делать ничего постоянного, так как это сгенерирует несколько наборов данных, а также я надеялся найти выход из самой QGIS.
GeorgeC
2
Тогда я бы, вероятно, преобразовал шейп-файл в Spatialite. С DB Manager вы можете создавать и запускать SQL-запросы. Вы также можете сохранить часто используемые запросы для будущих нужд.
user30184
5

Плагин DB Manager в QGIS теперь имеет узел «Виртуальные слои», который позволяет вам писать команды SQL для шейп-файлов, загруженных в ваш проект QGIS.

Итак, теперь, когда у вас есть такая возможность, логика SQL для сортировки по нескольким полям находится в операторе ORDER BY, используя asc (возрастание), desc (убывание), и вы можете связать их вместе для сортировки по нескольким столбцам:

введите описание изображения здесь

Дополнительный бонус заключается в том, что вы будете больше изучать SQL, поэтому, когда вам надоест шейп-файлы и большинство в PostGIS, скачок не будет таким большим!

DPSSpatial
источник
Спасибо - это отличное решение, однако для этого случая использования я не хочу менять формат данных на что-либо еще.
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))
обходной
2

Что ж, сейчас 2018 год, поэтому я не могу поверить, что на этот вопрос еще нет ответа.

  1. Откройте представление таблицы атрибутов и щелкните правой кнопкой мыши по любому столбцу, затем выберите Сортировка ...

  2. Диалоговое окно Настроить порядок сортировки таблицы атрибутов теперь можно и в редакторе полных выражений

  3. Используйте функцию COALESCE с нужными столбцами, например, это позволит отсортировать таблицу по 3 столбцам (сначала по ID, затем по VERSION, а затем по fid).

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

введите описание изображения здесь

Нажав OK, вы отсортируете таблицу

sys49152
источник
К сожалению, коалесценция у меня не сработала. В тесте с использованием таблицы атрибутов шейп-файла с двумя целочисленными столбцами (оба из которых содержат комбинацию чисел и пустых значений): 1) при не отмеченной кнопке Сортировка по возрастанию первый результат сортировался правильно (по убыванию), а второй столбец сортировался неправильно по возрастанию для каждого значения в первом столбце. 2) с проверенной кнопкой сортировки по возрастанию, результат был случайным и не имел смысла.
Стю Смит
1
Вы можете объединить поля с помощью "||" оператор coalesce вернет первое ненулевое значение, недопустимое для сортировки. Вероятно, вы должны использовать некоторое форматирование, чтобы иметь 1 до 11.
Золтан
1

Вы не можете (по крайней мере, на данный момент). Сожалею!

Смотрите документацию QGIS и прокрутите вниз до самой последней строки.

Неприятным обходным решением было бы перенести DBF Shapefile в Excel. Отсортируйте его там и сохраните результат. Или же импортируйте ваш Shapefile в PostGIS или SpatialLite, где у вас есть более широкие возможности сортировки. По сути, вам придется обойти QGIS для расширенной сортировки.

MappaGnosis
источник
2
+1 за правильное примечание, что в настоящее время это невозможно, но -1 за предложение возиться с DBF в Excel
underdark
Я действительно сказал, что это было "противно" :)
MappaGnosis
Вы упомянули PostGIS и SpatiaLite: не могли бы вы показать пример того, как сделать то, что OP запрашивал из QGIS, также используя плагин db?
steko
0

По предложению @Sylvester Sneekly, если ваши данные загружаются в такие РСУБД, как PosGIS или SpatialLite, вы можете рассмотреть возможность создания представления базы данных в СУБД, которое предварительно сортирует данные в виде таблиц, а затем загрузить предварительно отсортированное представление в QGIS в качестве слоя.

RyanKDalton-OffTheGridMaps
источник