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.
can you please provide me with the full code for the 6-Pure SF case as I was not able to adjust the above code to my case? Thanks in advance
LikeLike
I just try it again, it works just fine maybe an issue with formatting
library(sf)
map = plot(st_as_sf(dataset, wkt =”geometry”))
map
LikeLike
I can’t get the import to work with st_as_sf, it keeps throwing up this error
Error in CPL_sfc_from_wkt(x) : OGR error
Calls: st_as_sf … st_as_sfc.character -> st_sfc -> CPL_sfc_from_wkt -> .Call
I have done the QGIS export to csv and then imported to Power BI as per your instructions.
the code I use is:
dataset = st_as_sf(Values, wkt = “WKT”)
Does it make a difference that I am trying to import a multipolygon area in the form of a WKT?
On the bright side I have been able to create a leaflet map.
LikeLike
sorry for the late reply, I think now a better option is to use icon map in PowerBi, all you need is a wkt
https://icon-map.com/index.html
LikeLike
I didn’t expect such a quick reply 🙂
I have looked at Icon Map but it doesn’t give me enough enough layers of information to add on as I want and I can modify my custom visualisation to as many or as few as I need.
Hopefully I will find a way of importing WKT or shape data, but thanks for the reply.
LikeLike
Did you find a solution for reading wkt into powerbi using sf. I am experiencing the same error
Error in CPL_sfc_from_wkt(x) : OGR error
LikeLike
Unfortunately I didn’t but I am still searching for the solution.
LikeLike
curious if you found a solution to the error?
LikeLike
maybe have a look here, Icon map saved the day
https://github.com/djouallah/GIS_Presentation
LikeLike
I am looking at working round it by loading a full map of the area at ward level into leaflet and then creating a map from just the wards i want to use.
LikeLike