Att placera etiketter snyggt i polygoner är en utmaning! Är det inte så många polygoner så kan man justera dem manuellt med etikettverktygen (från QGIS 3.0), men om de är många eller om man vill placera etiketterna lite dynamiskt, så kan det bli svårt.
I detta inlägg tittar jag på alternativen, och med hjälp av kod tar jag mig lite närmare det jag är ute efter.
Jag använder Natural Earth ”Geography Regions Polys” från 10m datasamlingen.
Normalt placeras etiketter vid en ”exakt position från centroiden”, men jag vill att etiketterna skall följa formen på polygonen lite bättre. Så om jag väljer ”Fritt” i stället så borde detta lösa sig…
Det blev bättre! Men frågan är om det kan bli ännu bättre?
Det går inte att använda geometrigeneratorn för att skapa en ny geometri som vi kan placera etiketter efter. Etiketter följer den underliggande geometrin, inte det som genereras med en geometrigenerator.
Det enda sättet att använda uttryck för att justera etiketter är att exempelvis beräkna polygonens generella orientering och använda detta för att justera rotationen.
Skillnaden mot ”Fritt” är att det här faktiskt ritar ut etiketterna lite snabbare, med ett till synes snarlikt resultat. Men det löser inte det underliggande problemet, nämligen att texten inte följer polygonernas form annat än till en generell orientering.
Det finns en annan möjlighet, nämligen att göra om polygonerna till linjer och använda dessa för placeringen, då det finns ”kurvföljningsplacering” av linjer.
Det finns ett arbete gjort med ett Python-bibliotek som gör just detta, men man måste skriva lite kod själv. Är du sugen att testa så finns koden på https://github.com/ungarj/label_centerlines.
Jag tycker inte om den här metoden, men just nu är det nog det bästa som går att åstadkomma. Problemet i mitt tycke är att jag skapar nya data som inte borde behövas. Är det som här ett begränsat lager vars enda syfte är att skapa etiketter, då kan det vara motiverat att byta ut det mot ett nytt. Men om det är ett betydligt mer omfattande lager, som inte heller kan ersättas då det exempelvis används för symbolsättning, då är det lite mera onödigt och resurskrävande. Det är heller inte alltid centerlinjen är det bästa alternativet när man kombinerar med flera andra, kanske överlappande, polygoner.
Jag hade väldigt gärna sett ett placeringsalternativ typ ”Naturlig Placering” i QGIS som gjorde motsvarande det som görs i Pythonskriptet ovan, men dynamiskt eller ”live” för de data som skall textsättas.
En ”Naturlig” textsättning skulle kunna vara polygonernas motsvarighet till ”böjt” för linjer. Det vill säga inte bara ”fritt”, utan även med hänsyn till polygonens form, och i bästa fall även till övriga polygoner.
Ett annat alternativ skulle kunna vara att låta etiketter följa geometrigeneratorns geometrier. Då kan man generera centerlinjer med en pythonfunktion dynamiskt enligt ovan, och sedan låta denna styra etikettplaceringen. Men då är vi tillbaka till överlappningsproblematiken.
När jag ändå är inne på dynamiska renderingar ”live” så passar jag på att nämna ännu en stil jag skulle vilja se. Egentligen är det bara ett renderingsalternativ till befintliga stilar. Tänk om renderingen av stil kunde ta hänsyn till närliggande eller anslutande objekt. Klippta polygoner skulle då kunna renderas på ett sätt om de gränsar till ett lager med en annan attributkategori, och på ett annat om det är samma. Då skulle exempelvis Lantmäteriets markytor kunna renderas med en kantlinje där de gränsar till andra kategorier, men utan om angränsande polygon är av samma typ, och vi skulle sluppit ”kors” i kartan. Enda sättet att uppnå denna effekt nu är med ”dissolve”, men det är inte praktiskt användbart på stora dataset.
Funktionen skulle kunna vara ”Betrakta angränsande polygon av samma typ som samma geometri”. Vilket i princip även skulle kunna fungera för linjer, men jag tror att det skulle göra mest nytta för polygoner. Man skulle kunna betrakta det som en form av ”topologisk rendering”?