Moduł renderujący klaster punktowy QGIS 3.0, czy można kontrolować kolejność renderowania (kolejność Z)?

19

Grałem z nowym rendererem klastra punktów w QGIS 3.0.2 i jest świetny - o wiele łatwiejszy (i szybszy) niż samodzielne tworzenie klastrów.

Aby pokazać, co mam na myśli, oto przykład wypadków drogowych w Edynburgu z wykorzystaniem danych STATS19 i promienia 30 m.

wprowadź opis zdjęcia tutaj

Nie mogę wymyślić, jak skonfigurować kolejność Z, aby największe klastry były rysowane przed mniejszymi klastrami.

Mam świadomość zmiennej @cluster_size - tego właśnie używam do skalowania i pokolorowania symboli. Do tego używam asystentów rozmiaru i koloru. Usunąłem znaczniki czcionek, aby usunąć tekst z każdego klastra.

Rozmiar markerów definiuje się w następujący sposób:

coalesce(scale_exp(@cluster_size, 0, 50, 1, 200, 0.57), 0)

Kolor markerów definiuje się w następujący sposób:

coalesce(ramp_color('custom ramp',scale_linear( @cluster_size, 0, 50, 0, 1), '#000000')

Co próbowałem do tej pory: -

  • Poziomy symboli - brak szczęścia; nie można wybrać nazwy zmiennej.
  • Renderowanie warstw> Kontroluj kolejność renderowania operacji i wybierz sortowanie @cluster_size . Nie wydaje się mieć efektu.
  • Styl stopniowany przy użyciu @cluster_size, ponieważ wyrażenie nie działa.

Czy ktoś wie, czy jest to możliwe, czy jest to ograniczenie w przypadku tego konkretnego mechanizmu renderującego?

Wiem, że jest na to wiele innych sposobów (buforowanie / łączenie przestrzenne, wtyczki), ale nowy moduł renderujący powinien być znacznie szybszy. Czy przeoczyłem coś oczywistego? :)

Steven Kay
źródło
Prawdopodobnie działa, biorąc pod uwagę kolejność w tabeli atrybutów. Być może układasz je w porządku rosnącym, aby największe były renderowane jako najnowsze? Jeśli nie ma funkcji „Sortuj funkcje według atrybutów”, możesz wypróbować wtyczkę MMQGIS (jeśli jest dostępna dla qgis 3)
Revo
dzięki @Revo. Wydaje się, że można go zmienić i posortować według atrybutu (w tym z rendererem Cluster Point), ale działa to tylko w jednej skali. Próbowałem użyć parametru rozmiar_klastra, ponieważ rozmiary klastra zmieniają się dynamicznie podczas powiększania / zmniejszania za pomocą mechanizmu renderowania punktów klastra. Rzucę okiem na MMQGIS (jest dostępny dla QGIS 3)
Steven Kay

Odpowiedzi:

2

Wydaje się, że implementacja klastra punktów nie pozwala na to natywnie.

Rozważ renderer klastrów punktów - zasadniczo analizuje i grupuje dane punktów w czasie renderowania, tworząc nową pseudo warstwę. Ta warstwa nie jest dostępna dla użytkownika. Nie można zapytać o punkt skupiony. Nie można obliczyć pola @cluster_size atrybutu.

Moduł renderujący klaster punktów dziedziczy kolejność renderowania ze źródła za pomocą opcji Sterowanie kolejnością renderowania funkcji ( QgsFeatureRequest :: OrderByClause), pozostawiając otwartą możliwość pewnego sprytnego obejścia przy użyciu atrybutów i wyrażeń, jednak nie można zagwarantować, że pewne schematy porządkowania będą spójne.

Jako przykład rozważ warstwę punktową z renderowaniem uporządkowanym rosnąco według atrybutu „Szerokość geograficzna”. Punkty bardziej na północ są renderowane na szczytach punktów na południe. Moduł renderujący klaster punktów nie ma atrybutu „Współrzędne” dla swoich nowych funkcji, choć odziedziczy pewne pozory tej kolejności od źródła. Mogą wystąpić sytuacje, w których gromada bardziej na południe renderuje się na gromadzie bardziej na północ, z powodu kolejności pierwotnych punktów.

CrystallineEntity
źródło
Dzięki. To bardzo jasne wytłumaczenie, które również odpowiada na moje pytanie, czy możliwe jest obliczenie atrybutu z punktów skupionych, powiedzmy np. Suma populacji związana z każdym pierwotnym punktem. Najwyraźniej nie .... jeszcze? Byłaby to jednak bardzo przydatna funkcja. Masz pomysł, jak można to osiągnąć za pomocą inteligentnego obejścia (które nie wymaga kodowania, ponieważ nie jestem (jeszcze? Znowu) dobry), nawet w sposób statyczny?
Usiłuję
Ogólnie rzecz biorąc, można do tego podejść, replikując to, co robi moduł renderujący klastra w połączeniu z funkcją „Kontroluj kolejność renderowania funkcji”, używając atrybutów. Z grubsza pierwsze przejście może polegać na buforowaniu warstwy punktowej, liczeniu punktów w buforowanych wielokątach jako atrybucie w warstwie punktowej. Kontroluj kolejność renderowania według tego atrybutu rosnąco. Trochę uciążliwe i niekoniecznie będzie działać w różnych skalach.
CrystallineEntity
Zachęcam również do złożenia żądania funkcji, co wystawiłoby metodę @cluster_size na funkcję „Kontroluj kolejność renderowania funkcji”.
CrystallineEntity