Vad är en indexkarta? För länge, länge sedan, när ”Televerket” gav ut kataloger med alla abonnenters telefonnummer, så brukade det även finnas kartor i dessa och de hade ett rutnät som inte var skalenligt. Rutnätet var uppdelat anpassat till sidan och namngivna med bokstäver och siffror. Ofta fanns även en lista med platsnamn som dessutom refererade till vilken ruta platserna fanns i.
I QGIS är det enkelt att skapa ett liknande rutnät på kartor, även om man behöver använda lite uttryck och funktioner för att det skall bli bra.
Vilken karta eller vilken skala du använder spelar absolut ingen roll. Jag börjar med OpenStreetMap och väljer att zooma till Eksjö.
I layouten lägger jag till kartan och den pappersstorlek jag väljer kommer att styra resten av inställningarna, så redan nu gäller det att tänka till. Jag vill ha ett rutnät med 2 cm intervall så baserat på kartelementets storlek så anger jag storleken med datadefinierade uttryck till något jämnt delbart med 2 centimeter.
Detta gör jag för att få jämna (hela) rutor i layouten, eftersom rutorna kommer att skapas baserat på layouten och inte på geografiska koordinater.
Intervallenheten för rutnätet sätts till millimeter (eller centimeter) och intervallet anges i mitt fall till 20 x 20 mm.
Genom att välja kartelementets storlek som en multipel av intervallet så går det jämnt ut.
Som ram väljer jag ”External Ticks” som jag sträcker ut 10 mm. För att även ha en ram runt själva kartan så får jag även kryssa i ”Frame” i kartans grundläggande elementegenskaper. Alternativt använda ramen från ett senare steg nedan.
Varför skapar jag så långa ticks? För att jag vill rama in mina tecken lite trevligare. Jag lägger nämligen till en rektangel i layouten som jag också sätter till en fast storlek, som är 20 mm större än kartelementet. Placeringen kan göras manuellt, eller så sätter man X och Y på samma sätt som storleken, så att ramen justeras till kartan.
Nästa steg blir att lägga till bokstäver och siffror. Här väljer jag att använda bokstäver från vänster till höger och siffror uppifrån och ner (för att det är så vi normalt läser text, och det är så det ser ut i ett kalkylark).
För att skapa ”etiketter” så lägger jag till ett nytt rutnät med samma grund som tidigare, men offset med 10 mm i båda riktningar. Något rutnät skall dock inte ritas ut.
Sedan kommer vi till etiketterna och alla funktioner och uttryck.
Till att börja med så behöver jag skilja på om det är horisontella eller vertikala etiketter, vilket är enkelt att fixa med ett if uttryck.
För bokstäverna så skapar jag en Array med alla bokstäver genom att använda string_to_array funktionen med en ”tom” textsträng som delare, vilket delar upp strängen i enskilda tecken. Observera att denna metod skapar en tom textsträng på index ”0”, så det första tecknet i textsträngen blir index ”1”. Om textsträngen innehåller ”,” för att separera poster i listan, så kommer första posten i strängen att få index = ”0”.
Från denna array hämtar jag sedan det tecken som motsvaras av rutnätsvärdet med array_get. Jag måste skapa ett uttryck även för detta index. Detta fungerar då avrundningen genom to_int funktionen görs ”uppåt”. Jag skulle också kunna använda ceil för att vara på den säkra sidan i stället för int. Om jag valt att använda ”,” som separerare i strig_to_array, så hade jag här fått välja floor som funktion i stället för att få med index ”0”.
För den vertikala axeln så använder jag samma numeriska funktion för att få siffror. Jag vill dock vända siffrornas ordning, vilket jag kan göra genom att minska (i mitt fall) 14 med det tal som genereras.
Nu återstår bara att justera typsnittet något, så är min indexkarta klar!
Den skarpsynte kan notera att jag ”fuskat” ytterligare lite i bilden ovan…
Det är så att justeringen av etiketter är begränsad till avstånd från kanten, vilket gör att enkelsiffror hamnar med centrum närmare kartan än dubbelsiffror. Detta kompenserar jag något för genom att lägga till mellanslag på båda sidor om siffror mindre än 10.
with_variable('nummer', 14 - to_int(@grid_number/20), if(@nummer<10, ' '|| @nummer || ' ', @nummer) )
Ett annat sätt att undvika problemet helt vore att rotera siffrorna så att de skrivs ut vertikalt på sidorna, eller göra en indelning som inte passerar 9…