Starting a new project that involve plotting a relatively big map ( 3000 polygons), it should be straightforward, as I have done it before, but a limitation in my prefered PowerBI custom visuals had an interesting result.
1- synoptic panel: in my view it is the best visual to show custom map, ( floor plan, general layout etc), unfortunately not this time, my new map has 3000 polygons, when I tried to plot some attributes, I get the equivalent of Windows screen of death for PowerBI, too many values !!!
That’s bad, I filled a bug report, the author was kind enough to reply that it will be fixed in a next release, (something to do with incremental loading) fine let’s try other options
2- Shape map : (it did not even render the polygons correctly, and to be honest the visual did not receive any update since the first time I use it, 2 years ago)
3- Mapbox: showstopper, to load your own shape file and keep it private, you need a business plan.
I am stuck, I can’t plot a 3000 polygons map in PowerBI, let’s try Rstats.
4-Leaflet: is very versatile mapping engine, right now I use it in other projects (outside of PowerBI) and it plot 60K points and nearly 500 polygons in sub 2 seconds, but there is a problem, Leaflet output is HTML which is not supported under PowerBI, I never manage to make decent screenshot, something to do with the zoom.
5-ggplot2 + SF : quick google and got this code
library(sf)
library(tidyverse)
map_shp <- read_sf(‘C:/Users/mimoune.djouallah/test.geojson’) map =dataset %>%
left_join(map_shp, ., by = c(‘id’ = ‘id’)) %>%
ggplot() +
geom_sf(aes(fill = type),lwd = 0)
map
Great, I have my map now ( this is only a portion, I can show the whole layout as it is proprietary), there is only a little problem, code take 25 seconds to render, it is very annoying, especially as in PowerBI you touch anything, and all the visuals render again.
my first thought maybe the join between PowerBI dataset ( dataframe) and the geojson is slow !!! the beauty of R integration in PowerBI is: you click on R icon, a new window open with an empty dataset, then you add the columns you want to analyse, yes that simple no ETL, no messing with data, you have to the mighty data model.
Loading Geometry data into PowerBI data model ?
After reading the SF documentation, I learned all I need is a dataframe with a column that store geometry data, too easy just use QGIS , save as csv and make sure to select geometry, WKT
Now I loaded the csv file to the data model and join it with the attribute
Now here is the new code, notice, we don’t load any external file, all data is from the data model
library(sf)
library(tidyverse)
map_file= st_as_sf(dataset, wkt = “geometry”)
map = ggplot(map_file) +
geom_sf(aes(fill = type),lwd = 0)
map
basically, you need just to tell SF which column represent the geometry , unfortunately it is still slow maybe now it is 24 seconds
Another round of googling and I find the issue ggplot2 is very slow to render, no problem, this is R after all, there are a least a couple dozen of packages that do the same thing 🙂
6-Pure SF
Turn out SF is not only to manage Geometric dataframe but it can plot too,( who would thought that)
library(sf)
map = plot(st_as_sf(dataset, wkt =geometry”)[“type”])
map
render in less than 2 seconds, happy dance
Bonus point, Cross-filing geometry
My purpose to load geometry was just to speed ggplot2, but hold on, the geometry is in the data model, not only the attribute change ( install quantities, category etc), I can even filter polygons on the fly !!!, this is quite amazing, I can load all the layers and filter out any shape as I want.