Sortujesz według wielu pól jednocześnie w QGIS?

17

Czy w QGIS można sortować wiele pól jednocześnie?

Na przykład chciałbym posortować tabelę według nazwy stanu, a następnie w ramach każdego stanu posortować według nazwy hrabstwa.

Byłoby to to samo, co opcja Zaawansowane sortowanie dostępna w ArcMap.

Stu Smith
źródło

Odpowiedzi:

4

W rzeczywistości istnieje bardzo prosta sztuczka. Załóżmy, że chcesz najpierw posortować według pola „A”, a następnie według pola „B” w obrębie „A”. Najpierw kliknij lewym przyciskiem myszy nagłówek pola „B” (kliknij raz, aby posortować rosnąco, drugi raz, aby zejść) w tabeli atrybutów. Następnie kliknij lewym przyciskiem myszy nagłówek pola „A” (raz dla ASC, drugi raz dla DESC). Ta ostatnia czynność posortuje pole „A”, zachowując sortowanie pola „B” w obrębie identycznych wartości „A”. Wypróbowałem go z 3 polami, a także działa (potem się nudził). Używam QGIS 3.6.3-Noosa.

Benoit St-Onge
źródło
Doskonały! Przetestowałem go również z 3 polami (stan, okręg, miasto) i działał idealnie - rosnąco lub malejąco. 3.8.3
Stu Smith,
8

Możesz użyć wtyczki Sortuj i Numeruj. Umożliwia sortowanie tabeli atrybutów według maksymalnie 3 pól, a następnie tworzy dodatkowe pole, które zawiera kolejność posortowanych elementów.

Oświadczenie: Jestem autorem wtyczki.

ArMoraer
źródło
mam nadzieję, że zadziała. Ustawiłem go w moim zestawie danych rekordu 150 000 i nadal działa po 10 minutach. To koduje sortowanie w nowej kolumnie, dzięki czemu możesz sortować według tego - czy istnieje sposób, który działa jak w programie Excel lub ArcMap, który nie dodaje kolumny? patrz desktop.arcgis.com/en/arcmap/10.3/manage-data/tables/…
GeorgeC
1
Mam również nadzieję, że to zadziała, nigdy nie testowałem tego na tak dużych zestawach danych. Nie sądzę, że można po prostu zmienić kolejność wyświetlania, jak w ArcMap; QGIS API nie zapewnia żadnej metody, aby to zrobić. Dlatego postanowiłem dodać pole numeracji jako obejście problemu.
ArMoraer,
Nadal działa - firma ArcMap zrobiła to za około 30 lat. No cóż. Dzięki za rozwiązanie. Będę otwarte przez 24 godziny, aby sprawdzić, czy ktoś ma jakieś inne sugestie.
GeorgeC
Ok, dzięki za opinie. Wtyczka opiera się bezpośrednio na sort()funkcji Pythona , zastanawiam się, dlaczego jest taka wolna. Spróbuję znaleźć jakąś sztuczkę, aby przyspieszyć ten proces w przyszłej wersji.
ArMoraer,
Ładne narzędzie ... zaoszczędziło mi dużo pracy ... bardzo doceniam
K_Man
7

Jeśli możesz zapisać wynik na stałe, możesz posortować plik kształtu za pomocą 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

Zajęło mniej niż 3 minuty plikiem kształtu o milionie wielokątów.

użytkownik30184
źródło
1
dzięki, ale wolę nie robić niczego stałego, ponieważ wygeneruje wiele zestawów danych, a także liczyłem na sposób z samego QGIS.
GeorgeC,
2
Wtedy prawdopodobnie przekonwertowałbym plik kształtu do Spatialite. Za pomocą DB Managera możesz budować i uruchamiać zapytania SQL. Możesz również zapisać często używane zapytania do przyszłych potrzeb.
user30184,
5

Wtyczka DB Manager w QGIS ma teraz węzeł „Wirtualne warstwy”, który umożliwia pisanie poleceń SQL przeciwko plikom kształtów załadowanym do twojego projektu QGIS.

Teraz, gdy masz już tę możliwość, logika SQL do sortowania według wielu pól znajduje się w instrukcji ORDER BY, używając asc (rosnąco), desc (malejąco), i możesz je połączyć, aby posortować według wielu kolumn:

wprowadź opis zdjęcia tutaj

Dodatkową korzyścią jest to, że nauczysz się więcej SQL, więc kiedy masz dość plików kształtowych i większość PostGIS, skok nie będzie tak wielki !!!

DPSSpatial
źródło
Dzięki - to świetne rozwiązanie, jednak w tym przypadku nie chcę zmieniać formatu danych na nic innego.
GeorgeC
2
Możesz pracować z .SHP dla tego rozwiązania - to nie zmienia formatu danych. Wypróbuj ...
DPSSpatial
1
@GeorgeC próbowałeś tego?
DPSSpatial
5

Można to teraz zrobić bez żadnych wtyczek lub pracy specyficznej dla bazy danych, przynajmniej dla wersji 3.2+. Aby posortować według wielu kolumn:

  1. Kliknij prawym przyciskiem myszy nagłówek kolumny tabeli atrybutów i wybierz „Sortuj ...”
  2. Dodaj funkcję concat()wraz z polami, według których chcesz sortować, w odpowiedniej kolejności (np. concat("column1", "column2")). Podgląd wyjściowy powinien być pokazany poniżej kodu.
  3. Zaznacz lub odznacz pole „Sortuj rosnąco” u dołu, aby skonfigurować kierunki sortowania według kolumn.
  4. Kliknij OK i potwierdź sortowanie.

Ta funkcjonalność została dodana poprzez wydanie nr 1137 i opisana w najnowszej (rozwojowej) wersji instrukcji obsługi .

Eron Lloyd
źródło
1
Pomyślnie przetestowany z QGIS 3.6.
Mr. Che
Połączyłem łańcuch i liczbę całkowitą, która nie ma ustalonej długości, więc użyłem obejścia, aby zero wypełnić liczbę całkowitą do łańcucha o stałej długości:concat("col1", right( ('000' || tostring( "col2" )), 4))
NettaB
2

Cóż, teraz jest 2018, więc nie mogę uwierzyć, że na to jeszcze nie ma odpowiedzi.

  1. Otwórz widok tabeli atrybutów i kliknij prawym przyciskiem myszy dowolną kolumnę, a następnie wybierz Sortuj ...

  2. Okno dialogowe Konfiguruj kolejność sortowania tabeli atrybutów jest teraz otwarta z pełnym edytorem wyrażeń

  3. Użyj funkcji KOPALNOŚĆ z żądanymi kolumnami, na przykład posortuje tabelę według 3 kolumn (najpierw według ID, następnie WERSJA, a następnie fid)

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

wprowadź opis zdjęcia tutaj

Kliknięcie OK posortuje tabelę

sys49152
źródło
Niestety koalescencja nie działała dla mnie. W teście z użyciem tabeli atrybutów shapefile z dwiema liczbami całkowitymi (obie zawierające kombinację liczb i pustych wartości): 1) z niezaznaczonym przyciskiem Sortuj rosnąco, wynik posortował pierwszą kolumnę poprawnie (malejąco), ale druga kolumna została niepoprawnie posortowana rosnąco dla każdej wartości w pierwszej kolumnie. 2) przy zaznaczonym przycisku Sortuj rosnąco, wynik był losowy, co nie miało sensu.
Stu Smith,
1
Możesz łączyć pola przez „||” operator, coalesce zwróci pierwszą wartość inną niż NULL, która nie jest ważna do sortowania. Prawdopodobnie powinieneś użyć formatowania, aby mieć 1 przed 11.
Zoltan
1

Nie możesz (przynajmniej nie w tej chwili). Przepraszam!

Zobacz dokumentację QGIS i przewiń w dół do ostatniej linii.

Paskudnym obejściem byłoby wciągnięcie DBF Shapefile do Excela. Posortuj to i zapisz wynik. Możesz też zaimportować plik Shapefile do PostGIS lub SpatialLite, gdzie masz większą funkcjonalność sortowania. Zasadniczo będziesz musiał ominąć QGIS w celu zaawansowanego sortowania.

MappaGnosis
źródło
2
+1 za poprawną notatkę, że obecnie nie jest to możliwe, ale -1 za sugerowanie bałaganu w DBF w Excelu
podmrok
Powiedziałem, że to „paskudne” :)
MappaGnosis,
Wspominasz o PostGIS i SpatiaLite: czy możesz pokazać przykład, w jaki sposób zrobić to, o co OP poprosił w QGIS, również używając wtyczki db?
steko
0

Jak sugeruje @Sylvester Sneekly, jeśli twoje dane są ładowane do RDBMS, takiego jak PosGIS lub SpatialLite, możesz rozważyć utworzenie widoku bazy danych w RDBMS, który przesyła dane tabelaryczne, a następnie załadować wstępnie zapisany widok do QGIS jako warstwę.

RyanKDalton
źródło