Linie łączące etykiety z obiektami w QGIS

Z problemem etykiet, które nie chcą się zmieścić użytkownicy QGIS spotykają się dość często. Występuje on zwykle przy opracowaniu map, dla których skala i zawartość nie mogą zostać zmienione. Wykorzystanie jednej z metod automatycznego rozmieszczenia etykiet w obszarach o dużym zagęszczeniu obiektów może być niewystarczające.

Znacie takie obrazki? Część etykiet nie została wyświetlona.

Możemy oczywiście wymusić wyświetlanie wszystkich etykiet wraz z nachodzącymi na siebie ale wówczas (przynajmniej w tym wypadku) przekaz będzie jeszcze mniej czytelny.

Włączenie wyświetlania etykiet nachodzących na siebie pogorszyło czytelność

W takich sytuacjach można zastosować ręczne rozmieszczenie etykiet, tak żeby się nie pokrywały, obecnie bardzo łatwo to zrobić narzędziem „Przesuń etykiety” z paska narzędzi „Etykiety”. Jednak przy dużej liczbie etykiet trudno jest w jednoznaczny sposób przyporządkować odbiorcy etykietę do obiektu.

Wszystkie etykiet są wyświetlone jednak czytelność nadal pozostawia wiele do życzenia.

Aby poprawić czytelność można wykorzystać Generator geometrii do rysowania linii łączących obiekty z etykietami. Żeby uniknąć przecinania etykiet powstałymi liniami należy zróżnicować punkt przyłączenia (z prawej lub lewej strony, można też dodać różnicowanie z góry i z dołu) w zależności od kierunku etykiety. Do wskazania punktu położenia etykiety służą funkcje (albo raczej ukryte wirtualne kolumny) „auxiliary_storage_labeling_positionx” i „auxiliary_storage_labeling_positiony”.

CASE WHEN 
degrees( azimuth( make_point($x, $y),
make_point ("auxiliary_storage_labeling_positionx" , "auxiliary_storage_labeling_positiony") ) ) < 185 THEN
make_line(
  make_point($x, $y),
  make_point("auxiliary_storage_labeling_positionx" ,"auxiliary_storage_labeling_positiony" )
)

 WHEN 
degrees( azimuth( make_point($x, $y),
make_point ("auxiliary_storage_labeling_positionx" , "auxiliary_storage_labeling_positiony") ) ) < 337.5 THEN
make_line(
  make_point($x, $y),
  make_point("auxiliary_storage_labeling_positionx"+(length ("name")/1.5),"auxiliary_storage_labeling_positiony")
)
 WHEN 
degrees( azimuth( make_point($x, $y),
make_point ("auxiliary_storage_labeling_positionx" , "auxiliary_storage_labeling_positiony") ) ) > 337.5 THEN
make_line(
  make_point($x, $y),
  make_point("auxiliary_storage_labeling_positionx" ,"auxiliary_storage_labeling_positiony")
)
END
Linie poprawiają czytelność etykiet

Dodam jeszcze belkę podkreślającą i będzie w „stylu CAD”. Znów przyda się Generator geometrii, który posłuży do utworzenia stosownej linii. Tym razem linia zostanie narysowana pod etykietą, między dwoma punktami, pierwszym będzie punkt położenia etykiety, drugi dobieramy w zależności od długości etykiety.

make_line(
    make_point("auxiliary_storage_labeling_positionx" ,"auxiliary_storage_labeling_positiony" ),
	make_point("auxiliary_storage_labeling_positionx" + (length ("name")/1.5)	,"auxiliary_storage_labeling_positiony" ))
Tak wygląda końcowy efekt.

Tworzenie warstwy poligonowej z „dziur” innej warstwy w QGIS

Sprawa jest prosta i możliwa do zrealizowania na kilka sposobów, oto jeden z nich w zaledwie dwóch krokach.

  1. Z algorytmów geoprocesingu wybieramy narzędzie Usuń pierścienie wewnętrzne (Delete holes).
  2. Kolejnym potrzebnym algorytmem jest najzwyklejsza Różnica (Difference), w którym jako warstwę źródłową ustawiamy wynik działania poprzedniego algorytmu a warstwę początkową wybieramy jako nakładkę.

Jeszcze prościej? Na GitHub wrzuciłem model, który zrobi to za jednym zamachem.

I już, tak to wygląda na obrazkach:

1
2
Gotowe

Wartość unikalna a Mapa wartości w legendzie

Przy wyświetlaniu w tabeli atrybutów wartości wczytanych z innej warstwy te wartości nie wczytują się automatycznie w przypadku użycia stylizacji opartej o klasyfikację.

Żeby wyświetlić wartości wczytane z innej tabeli wystarczy w polu kolumny zamiast wskazywać na konkretną kolumnę, użyć formuły:

represent_value(„Nazwa_Kolumny”)