Rotera etiketter

När jag höll på med Antarktiskartan tidigare så tyckte jag det skulle vara fräckt att lägga in texter som indikerade var stora städer låg och hur långt det var till dessa.

Jag skapade ett punktlager med punkter på -60 grader syd och samma longitud som de valda städerna och matade in ungefärligt avstånd i ett av fälten.

Den anpassade etiketten var lätt att skapa av mina två fält ”TEXT” och ”AVST_KM” med ett uttryck:

”TEXT” || ‘ ‘ || ”AVST_KM” || ‘ km’

I min enfald så trodde jag att man enkelt skulle kunna ange riktning för dessa så att de pekade ut från kontinenten som solstrålar (typ), men det visade sig inte vara så enkelt.

Texters riktning är nämligen skärmrelaterad, vilket kanske är tur när man tänker efter lite. När jag angav riktning för etiketterna till 0 grader, d.v.s. norrut, så hände naturligtvis ingenting.

Nåja, övertygad om att det skulle gå att lösa så skapade jag ett attribut kallat ”RI” och startade Fältkalkylatorn.

Jag vill med hänsyn till den valda projektionen att etiketter på 0 grader skall vara riktade uppåt, etiketter på 90 grader åt höger, 180 grader nedåt och -90 grader till vänster.

Normal etikettriktning (0 grader) är åt höger, sedan räknas graderna moturs så att 90 är rakt upp, 180 till vänster och 270 nedåt. Dock så vänds texterna så att de inte hamnar upp och ned, vilket kan vara synd i vissa situationer (går att ändra under Etikettens ”Rendering” i lageregenskaperna).

Nu snurrar det lite i huvudet, 0 skall bli 90, 90 skall bli 0, 180 skall bli 270 och -90 skall bli 180…

Ok, om vi vrider allt 90 grader så att 90 grader blir 0 så blir etiketter på 90 grader öst i alla fall rätt:

Longitud – 90

Och eftersom riktning på etiketter inte kan vara negativa så skall vi ha absolutbeloppet av värdet:

abs( Longitud – 90)

Och då stämmer det för 90 till -180 då absolutbeloppet av två negativa tal blir det samma som om det vore addition.

Återstår problemet med 90 till 180 grader öst…

Tja, varför inte ett villkor? Om Longituden är mindre än 90 grader så gör som tidigare, annars:

450 – Longituden

Det hela blir då:

Om Longituden är mindre än (eller lika med) 90 så använd abs(Longituden-90) annars 450-Longituden

Om jag då skriver detta som en QGIS formel i Fältkalkylatorn så blir det:

Skärmbild från 2013-12-12 17:54:46

En förutsättning för att det beskrivna ovan skall fungera är att data är lagrat i WGS84 och inget annat, annars är det svårt att hålla koll på x-värdet.

För att sätta rotationen så är det bara att gå in i egenskaperna för lagret (se bild nedan), och välja datadefinierad rotation satt till det aktuella attributet.

Skärmbild från 2013-12-12 18:03:56

Rent teoretiskt så skulle man kunna välja ”Redigera” (i bilden ovan) och skriva in uttrycket direkt här.

CASE WHEN $x <= 90 THEN abs($x-90) ELSE 450-$x END

Men jag får inte detta att fungera. Det borde göra det, men det går inte. Samma formel för att skapa ett attribut med rätt riktning (som ovan) fungerar dock hur bra som helst.

Annonser

Taggar:,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: