Publicerad den Lämna en kommentar

Häftig Geometrigenerator

Efter en video om geometrigeneratorn så fick jag många exempel på hur man använder den. Ett av dessa (från @michelstuyts ) var så annorlunda och användbart att jag tänkte försöka återskapa den på egen hand.

Till skillnad från Michel så använder jag nästan uteslutande geometrigeneratorn och inte de ”vanliga” stilar som finns i QGIS.

Jag inleder med ett lager med byggnadspolygoner, där jag vill märka ut hur långa byggnadernas sidor är.

Skärmbild från 2018-10-30 08-03-09.png

Att enbart skapa linjer som kan stilsättas som pilar utanför varje del av polygonen är väldigt enkelt med geometrigeneratorn.

offset_curve( segments_to_lines( $geometry ) , 10 )

Sedan blir det lite krångligare…

Om man vill lägga till förlängda linjer som pilarna kan peka mot så krävs med min metod en ny, lite mera avancerad, geometrigenerator.

Skärmbild från 2018-10-30 10-11-17.png

Allt i geometrigeneratorn är säkert inte perfekt, men den ger mig den effekt jag är ute efter. Och det tog ganska lång tid att få till, inte minst då felsökningen i uttrycksbyggaren i och för sig är bättre än vad den varit tidigare, men långt ifrån perfekt.

geom_from_wkt( 'MULTILINESTRING(' ||
array_to_string(
array_foreach(generate_series(1,num_points($geometry)-1), with_variable('dir', azimuth(point_n($geometry,@element),point_n($geometry, if(num_points($geometry)=@element,1,@element+1) ))-pi()/2, '(' || x(point_n($geometry, @element)) || ' ' || y(point_n($geometry, @element)) || ',' || x(project(point_n($geometry, @element),12,@dir)) || ' ' || y(project(point_n($geometry, @element),12,@dir)) || ')' || ',' || '(' || x(point_n($geometry, if(num_points($geometry)=@element,1,@element+1))) || ' ' || y(point_n($geometry, if(num_points($geometry)=@element,1,@element+1))) || ',' || x(project(point_n($geometry, if(num_points($geometry)=@element,1,@element+1)),12,@dir)) || ' ' || y(project(point_n($geometry, if(num_points($geometry)=@element,1,@element+1)),12,@dir)) || ')' )
)) || ')'
)

Generator skapar, för varje segment, en hjälplinje i början och en i slutet av segmentet, 90 grader ut från segmentets riktning.

Etiketter är sedan ännu ett bekymmer.

Även om jag skapar enskilda linjer med geometrigeneratorn så kan jag inte sätta normala etiketter på dessa, då etiketter följer den ursprungliga geometrin, vilket är en polygon.

Skärmbild från 2018-10-30 10-58-37.png

Jag kan skapa punkter för att förankra etiketter på korrekt plats med geometrigeneratorn, och jag kan skicka med längdmåttet som ”z” värde för punkten. Detta hjälper dock inte…

Det går fortfarande inte att använda dessa värden utanför geometrigeneratorn! Inte ens som text i en teckenmarkör.

Det som genereras i geometrigeneratorn, stannar i geometrigeneratorn!

Jag valde därför att använda verktyget ”Geometri med uttryck” och samma uttryck som jag använde för att skapa pilarna i geometrigeneratorn.

Skärmbild från 2018-10-30 11-19-03.png

Mitt temporära lager skapas korrekt och ser bra ut, men det är temporärt. Med QGIS 3.4 är detta lätt fixat! Klicka bara på den lilla ”chip” symbolen i lagerpanelen, ange en sökväg dit lagret kan sparas ”permanent” och klicka OK. QGIS byter då ut det temporära lagret mot det permanenta med bibehållet lagernamn och symbologi. Jättesmidigt! Det går även att gå via ”högerklicksmenyn” och välja ”Gör Permanent…”.

(Här fick jag senare lite problem med skapandet av unika ”FID”, så jag valde helt enkelt att inte skapa något FID när jag gjorde lagret permanent. Det kan fungera annorlunda om du inte väljer GeoPackage som filformat.)

Nästa problem är att det är en multipartgeometri…

Detta är också en barnlek att fixa i QGIS 3.4!

Skärmbild från 2018-10-30 11-26-30

Markera bara lagret, aktivera ”Redigera Objekt Direkt” och dubbelklicka på verktyget ”Multipart till singelpart”. BAM!!!

Inga dialoger, inga extra knapptryck, inga nya filer…

Lagret är i redigeringsläge när man kört verktyget, så det går att ångra ändringarna, men annars är det bara att stänga redigeringsläget, så är man klar.

Skärmbild från 2018-10-30 11-38-36.png

Alternativ…

Det jag beskrivit ovan är som sagt inspirerat från ett svar från Twitter, och efter att jag var klar så fick jag en hänvisning till den stil som hade använts där.

Den innehöll några annorlunda val i stil och geometrigenerator, och den fungerade helt som stil utan att nya lager tillverkades.

Skärmbild från 2018-10-31 14-09-50.png

Jag modifierade naturligtvis stilen så att den passade mig bättre (ovan) men full credit skall gå till https://twitter.com/michelstuyts.

Jag kommer nog att använda båda metoderna, och kanske en ”mashup” så småningom. Min metod ger mig nämligen mera friheter med etiketterna och det fungerar att rotera kartan vid behov så att även etiketterna följer med.

Det kan även finnas tillfällen då jag inte vill ha med måttpilar precis överallt och då kan det vara smidigt att helt enkelt radera de pilar och stödlinjer som inte behövs.

Genom att jag byggt allt i geometrigeneratorn och inte som stil så var det därför enkelt att göra om stilen till geometrier med modellen.

Min modell och stilfiler finns här: MakePolygonMeasureLines.zip

Du hittar Michel Stuyts filer här: mstuyts/qgis_styles

Avslutning

Jag lyckades inte att stilsätta geometrierna helt via geometrigeneratorn. Det som allt föll på var textsättningen, men det fick mig att gå vidare med att skapa modellen för att generera nya lager. Med Michels stilfil så fungerar textsättningen, så det går att få till detta med enbart stil, om man vill det. Mina pilar och linjer var dels enkla, men även komplicerade, men görbara. Här kan jag nog lära ett och annat om geometrigeneratorn från Michel. Jag har redan lärt mig massor genom att testa själv först.

Resultatet blev det önskade, men till priset av extra lager. Redigering av ursprungspolygonen kommer därmed att kräva att processen görs om. Inte så svårt, men det är ett extra moment.

Om det är bråttom så kan jag använda Michels stil, annars kan jag använda min egen metod för att få mera exakt kontroll över stilen. Kanske använda stilen som standard, men om jag vill anpassa måttsättningen så kör jag modellen och kan då redigera lagren så att jag får de mått jag behöver.

Det problem jag hade med FID handlade troligen om att delningen från multipart till singelpart inte lyckades skapa unika id för de nya geometrierna. Genom att exempelvis dela upp geometrierna innan minneslagret görs permanent, så slipper man detta problem. Det borde dock inte vara problem att köra processen på ett GeoPackage, så det kan handla om en ”bugg”, men det får tiden utvisa.

Nyhet från Geosupportsystem , orginal inlägg

Lämna ett svar