Sådan knækker du koden til det perfekte kort i Power BI
Skrevet af Christian Vinter, Principal consultant, AI-lead.
Shape Maps og Bing Maps på vej ud af Power BI, mens Azure Maps er blevet standarden med mange flere features og genkendelse af mere almindelige dataformater. Det er godt.
Lad os prøve at kigge på, hvordan man laver kort, som viser data fordelt på dansk geografi (kommuner, regioner eller postnumre).
Salg fordelt på kommune (undskyld Bornholm): Vi sælger mest i kommunerne med flest indbyggere.
Dette har i sig selv stor anvendelse - f.eks:
Salgsdata fordelt på kommune
Borgerlig/rød stemmeandel fordelt på kommune.
Jeg har for mange år siden lavet et tilsvarende kort for en ejendomsmægler med markedsandel, liggetider og konverteringsandele mellem vurdering, kontrakt og salg - farvet efter postnummer
For en arbejdsgiverorganisation lavede jeg et kort, der viser mange relevante metrikker som telefonhenvendelser, medlemsandel, medlemsaktivitet med meget mere per aggregeret postnummer.
Og jeg håber, at du selv kan se, hvor værdifuldt det kan være, når man nemt og hurtigt kan se sine vigtigste tal fordelt på geografisk inddeling. Det er i hvert fald bedre end samme information i et tilsvarende søjlediagram eller tabel:
Samme data i to visninger, som næppe vinder guldmedaljer ved næste DM i Power BI.
Jeg dykker i denne artikel ned i dét med udfyldte kort. Azure Maps understøtter også andre visninger, som virker rigtig godt: Min kollega Kasper har lige lavet en rigtig fin visning af en stor, dansk detailkædes butikker, og det blev uden nogen besvær helt perfekt med out-of-the-box-funktionaliteten.
Tutorial
Den gode nyhed er, at det er ret nemt at komme i gang, mens den dårlige nyhed er, at out-of-the-box-resultatet bliver forfærdeligt.
Jeg antager, du har:
En geografidimension med kommunenavne i lang form som Ribe Kommune, Bornholms Regionskommune, Københavns Kommune etc. Bemærk, at det ikke bare er at sætte ”Kommune” efter dens korte navn, da fire kommuner også skal have et s klistret efter kort form (Nordfyn, Vesthimmerland, Bornholm og København), mens Bornholm skal have ”Regionskommune”), hvis det skal være helt rigtigt. Og så er der jo Christiansøs lidt under 100 beboere, der slet ikke er i en kommune, men har Forsvarsminister Jeppe Bruus som ”borgmester” og regionsrådsformand.
En fact med tal som f.eks. salg, og som er forbundet mange-til-en til geografidimensionen.
Du og din organisation har aktiveret alle indstillinger for at kunne bruge denne visual. Der er "Users can use Azure Maps visual" i Fabric Tenant Settings, og du må ikke være blokeret mod Azures endpoints i jeres firewall. Endelig skal du slå Azure Maps til under preview-settings/indstillinger til eksempelvisning, hvis du har en version af Power BI Desktop fra før marts 2026.
Vælg Azure Maps som visualisering, og træk kommunenavn ind på ”Placering”. Hvis du har region i geografidimensionen, understøtter Azure Maps hierarkier på samme måde som en masse andre visualiseringstyper, og du trækker bare f.eks. kommuner og regioner ind i feltbrønden ”Placering”.
Under malerpensel -> ”Visual”, fjern flueben fra ”Mærkelag”, men slå det til for ”Udfyldt kortlag”. Under ”Udfyldning” -> fx laver du en gradueringsregel, hvor dit tal/measure bruges til at farve polygonerne.
Azures forsøg på at gengive de danske kommuner ser godt ud, indtil man kigger nærmere
Og ved første øjekast ser det supergodt ud! Men kigger man lidt nærmere, ser man, at Læsø er næste helt ignoreret på nær de små sandbanker rundt om øen, og at Københavns Kommune er reduceret til Nordamager, Slotsholmen og Middelgrundsfortet.
Læsø og Københavns Kommuner i en alternativ rendering
Vi bemærker også, at især omkring storbyerne er polygonerne mærkeligt overlappende eller hullede:
Kan man bo i to kommuner samtidig? Og i ingen kommune?
Og som allersidste brok bemærker vi, at baggrundskortet fra Microsoft foretager nogle mystiske valg af, hvad der skal vises og ikke: Brøndby gider vi ikke vise (og det kan man måske godt forstå), men at vælge KFUM’s spejderhytter i Brøndbyskoven i stedet, må man kalde et mærkværdigt valg. I Hornsherred viser den fem små gårde og en bakke, før den viser Jægerspris! I Østjylland mener den, at Odder, Skanderborg og Hadsten er værd at vise uden at vise Århus.
Der ligger en eller anden by dér et sted mellem Odder og Hadsten. De var en del i nyhederne for et par uger siden med noget fodbold. Byen hedder vist
Malaga.
Nå, det med baggrundskortet kan vi ikke gøre noget ved, og man kan nemt slå det fra eller forbinde til sit eget, hvilket jeg dog ikke kommer mere ind på her.
Prøver man med danske postnumre i stedet, bliver det overraskende nok imponerende meget bedre:
Fire minutters arbejde giver et perfekt kort med postnumre i Danmark.
De fjollede overlap og huller i polygonerne er forsvundet, mens Læsø er tilbage! Selv i Indre By, Christianshavn, Frederiksberg, Valby og Vesterbro, der jo har de sindssygt små postnumre, ser det absolut fejlfrit ud
Azure Maps kan tegne Københavns minipostnumre perfekt. Det er vildt imponerende!
Egne polygoner
Azure Maps er klart bedre end de gamle Bing Maps-baserede visuals. Men danske administrative grænser er stadig ikke noget, Microsoft virker specielt optaget af, og vi skal have fixet de kommuner!
Til dét dykker vi ned i forskellene på Power BI’s gamle shape maps og den nye Azure Maps. Den største ændring er egentlig ikke kvaliteten af kortene, men arkitekturen bag dem. For tidligere VAR Shape Map selve visual, mens custom geografi nu blot er endnu et layer oven på Azure Maps.
Det betyder blandt andet:
GeoJSON fungerer direkte uden TopoJSON-konvertering
Man kan kombinere polygoner med bubbles, heatmaps og andre lag
Kortet opfører sig lidt mere som et GIS-system og mindre som et specialvisual
Azure Maps understøtter stadig ikke danske specialinddelinger som:
Kommuner (godt i hvert fald)
Københavns bydele, kvarterer og roder
Valgkredse
Retskredse
Skoledistrikter
Politikredse
Sogne
Eller interne geografiske opdelinger som distributionsområder, salgsdistrikter, marker, fabrikshaller etc.
Vi skal derfor downloade vores egne definitioner af disse afgrænsninger/polygoner, så Power BI ved, præcis hvilket område vi mener, når vi siger Læsø Kommune.
Dataforsyningen og data-science.dk
Så hvis man arbejder seriøst med danske geografiske data, slipper man stadig ikke for egne polygoner. Til gengæld er det blevet noget nemmere at komme i gang med.
Det er bare at downloade GeoJSON-filer fra data-science.dk (*), hvor man finder de vildeste geodata – et sandt eldorado for geonørder. Blandt deres gratisprodukter er alle tænkelige danske administrative inddelinger som de ovenstående, men også landets slotte, sluser og sporvognsskinner for bare at nævne 3 af de 33 kortdefinitioner, der starter med 's'.
Skal man kun bruge de danske, officielle inddelinger (DAGI), kan man også hente dem fra Datafordeleren.dk, hvor der er lidt flere muligheder for at styre f.eks. opløsningen og dermed filstørrelserne. Men hvor man skal logge ind med MitID og desværre også selv skal konvertere filerne fra JSON til det mere specifikke GeoJSON-format via noget i retning af:
import geopandas as gpd
gdf = gpd.read_file("input.gpkg")
gdf.to_file("output.geojson", driver="GeoJSON")Data fra data-science.dk er baseret på Datafordelerens data, og desværre har de ikke rettet de fejl, der i min verden er i polygonerne. Det vender vi tilbage til.
Azure Maps: Referencelag
Med polygoner i GeoJSON-format, er det supernemt at vise data fordelt efter dem. Tilføj igen kommunenavne til feltbrønden Placering. Gå så ind i malerpenslen og under Visual fjern alle andre flueben end Referencelag, og upload din GeoJSON-fil. Under Referencelag -> Polygoner, vælger du fx ud for Udfyldningsfarve, og opretter en gradueret farvelægning baseret på
Og det bliver faktisk ganske udmærket:
Danske kommuner bliver fint med polygoner downloadet fra offentlige kilder
Læsø er tilbage også som kommune, og ligedan er København i sin helhed. Der er stadig enkelte renderingsfejl i overlappene mellem kommunerne, men de forsvinder, når man zoomer ind.
Python redder dagen igen
Det største problem med DAGI-data er, at de i begge kilder bruger de korte kommunenavne, men har fejl i to af dem: Polygonerne for Vesthimmerlands Kommune og for Nordfyns Kommune er navngivet som Vesthimmerlands og Nordfyns, mens Københavns Kommune og Bornholms Regionskommune er navngivet hhv. København og Bornholm uden s, hvilket er åbenlyst inkonsistent.
Derfor endte jeg naturligvis - igen - med at tweake polygonerne med et Python-script.
Scriptet gør blandt andet følgende:
Flytter Bornholm tættere på resten af Danmark
Laver kopi af hovedstadskommunerne. Bemærk, at man kan klikke både i den store og i den normale version af polygonkopierne, og at begge fremhæves samtidig.
Retter kommunenavne
Indsætter regionnanvne som ekstra felt
Fjerner dubletter og artefakter i polygoner
Scriptet er ikke nødvendigt for at få DAGI-data til at virke i Power BI, men giver et godt indtryk af, hvad man kan justere for at få sit eget, personlige udtryk i interaktive kortvisualiseringer.
Færdigt produkt med Bornholm flyttet lidt tættere på og hovedstadskommunerne kopieret større.
Konklusion
Azure Maps er klart et fremskridt. Det er hurtigere, mere fleksibelt og væsentligt mindre smertefuldt end de gamle løsninger. Men hvis man troede, at danske geografiske data pludselig bare ville fungere perfekt out-of-the-box, så bliver man nok stadig en lille smule skuffet.
Så selvom mulighederne er rige med Azure Maps - og rigere end med Power BI's gamle visualiseringer, er der stadig arbejde i at få det gjort godt.
Skriv til mig, Christian Vinter, på cv@dataon.dk, hvis du har brug for hjælp eller inspiration med kortvisualiseringer.
Github med scripts og eksempelfil til Power BI Desktop: https://github.com/CVinterDataon/AzureMaps/
(*) data-science.dk har venligt givet mig lov til at bruge deres data i denne artikel også.