Om man vill fylla en polygon med markörer i QGIS så kan man använda ”Point Pattern fill”.
I bilden ovan har jag en fyllning med markörer med 5 mm intervall där punkterna är 4 mm stora. I bakgrunden visas ursprungspolygonen. Som synes så är alla punkter klippta efter polygonens utsträckning. Det är säkert OK i många sammanhang, men det hade varit trevligt med ett alternativ att inte klippa markörer som har sin centroid i polygonen, och inte rita ut de som har centroiden utanför.
Detta går att åstadkomma med geometrigeneratorer. I mitt första exempel så kommer jag att använda kartans enheter för att visualisera punkterna och utgå från varje enskild polygon vid beräkningen, vilket är det snabbaste sättet.
-- Marker interval is set by the variable 'stl' with_variable('stl', 65, intersection($geometry, collect_geometries( -- Collect column multipoints array_foreach( -- Generate start points on the x axis generate_series(x_min($geometry), x_max($geometry),@stl), with_variable('x_pos', @element, collect_geometries( -- Collect points in columns to multipoint array_foreach( -- Generate points on the y axis generate_series(y_min($geometry), y_max($geometry), @stl), with_variable('y_pos', @element, make_point(@x_pos, @y_pos) ) ) ))))))
Geometrigeneratorn som används till fyllning i koden ovan, utgår från varje enskilt objekt och genererar ett punktmönster med ett intervall som anges i kartenheter med variabeln ’stl’ i början av koden.
Objektets utbredning används för att generera listor med x- och y-koordinater, som sedan används för att skapa punkter på dessa platser.
Då det krävs två ”loopar” så måste summeringar göras två gånger för geometrierna. I den ”inre” loopen samlas punkterna som skapats i kolumner i en multipunkt. Den ”yttre” loopen skapar en lista med multipunkter, som samlas till en ny multipunkt när båda looparna är klara.
Eftersom det också skapas två @element variabler så behöver dessa ”döpas om” så inga konflikter riskeras. I koden så döper jag om båda dessa variabler mest för att göra det tydligare, till ’x_pos’ och ’y_pos’.
Resultatet syns i bilden ovan.
Som det syns vid närmare kontroll så är inte de individuella mönstren justerade mot varandra. Det fungerar när polygonerna inte direkt angränsar varandra. Det är dessutom den snabbaste metoden för att skapa denna stil, speciellt om det är många lite mindre polygoner. Alternativt så kan man justera uttrycket något så att mönstren är justerade mot varandra.
Genom att byta $geometry i generate_series() funktionerna mot @map_extent, så genereras mönstret med samma utgångspunkt för alla objekt i lagret. Det är därmed betydligt fler punkter som genereras vilket tar lite mer tid att rendera.
Ett mellanting är att utgå från @map_extent för x_min och y_min, men använda $geometry för x_max och y_max. Då kan man nästan halvera renderingstiden jämfört med om alla punkter skall genereras för alla objekt. Det är inte säkert att man sparar väldigt mycket, då $geometry även utför beräkningar utanför kartans synliga del. Om det är många stora ytor som även sträcker sig långt utanför kartan, så kan till och med @map_extent vara snabbare att använda.
Med denna geometrigenerator kan man nu skapa många trevliga kartor som utgår från mönster med markörer, utan att dessa ”klipps” vid polygongränser. Jämför bara kartorna nedan där den ena har traditionell fyllning och den andra geometrigeneratorn.
Den nya stilen är inte lika ”exakt” som den traditionella, men i många situationer så skulle jag föredra den mer generaliserade stilen.
Hoppas du kan använda stilen i olika sammanhang och dela gärna med dig av resultatet på Internet. Använd exempelvis QGIS Map Showcase gruppen på Flickr, eller #QGIS på Twitter.
Jag lägger även upp stilen ovan på experimentsidan för ”QGIS-Hub” som du tills vidare hittar på http://qgis-hub.fast-page.org.