I stumbled upon a lego map in twitter and I thought it was quite fun and I should do something similar:
And here’s the result. One with NaturalEarth data colours for height, and another one with a set of official lego colours 😀
..
NOTE from the future:
Since everybody in twitter was to keen to remind me, First the map in EPSG:25831, then in 4236 😀
..
Creating the map
Creating this map is a matter of basic steps, and those are explained in other blogs, so I’ll just link and summarize:
- Get some elevation data
- Load in Qgis
- Create a square grid
- Run zonal statistics to get raster data into the square grid
- Create grid centroids
- Style 😀
The lego colour palette
There is a strict colour palette for real lego pieces. My goal was to use the ones described in brickset.com
To do so, Qgis can use the fill by expression
capability, and I can write a python script that translates any original cell colour, to a valid Lego colour.
I skipped the palette here, since it gets a tad long:
import math import colorsys @qgsfunction(args='auto', group='Custom') def to_lego_color(v1,v2,v3, feature, parent): """ Gets the closest available lego colour according to hue_distance <h2>Example usage:</h2> <ul> <li>my_sum(r,g,b) -> (r1,g1,b1)</li> </ul> """ def hue_distance(c1, c2): (r1,g1,b1) = c1 (r2,g2,b2) = c2 hls1 = colorsys.rgb_to_hls(r1,g1,b1) hls2 = colorsys.rgb_to_hls(r2,g2,b2) return abs(hls1[0]-hls2[0]) def find_fit_color3(r,g,b, palette): closest_colors = sorted(palette, key=lambda color: hue_distance(color, (r,g,b))) return closest_colors[0] LEGO_PALETTE=[here the palette] red,green,blue = find_fit_color3(int(v1),int(v2),int(v3), LEGO_PALETTE) rgbValue = str(red) + "," + str(green) + "," + str(blue) return rgbValue
The script is based in an R,G,B
input since my original dataset has this values. It can be easily changed if needed :-).
What this script does is use the HSL space to find the closest color in the palette based on Hue
, nothing else.
References
I’ll just drop here the original tweet for reference, alongside other links: