— Lutra Consulting Limited (@lutraconsulting) April 22, 2020
But the question asked by Tammo on Twitter was quite special. Tammo wanted to apply gradients on lines, and data-define the starting and ending color along a certain color ramp.
Here is my result, that I also gave on StackOverflow. It uses a hack based on interpolating points along a line and coloring them based on their position.
How to do this ?
First, set your line to geometry generator to Points
Then, apply this expression to have interpolated points along the line :
collect_geometries(
array_foreach(
generate_series(0, length($geometry), 0.000001), -- here, we add a point every 0.000001 unit (I am in WGS84)
line_interpolate_point($geometry,
@element
)
)
You can not see it, but there are very little points !
Here is a zoomed-in image of the line :
The points are very near from one another. I don’t know if you can see them. That’s why it looks like lines.
Finally, just set the filling color according to the position of the point along the line, and along the subsetted color ramp :
ramp_color( -- this function allows you to select one particular color along a color ramp
'Viridis', -- I ❤ Viridis
scale_linear(
@geometry_part_num, -- @geometry_part_num is the number of the point along the line (its position)
0, @geometry_part_count, -- @geometry_part_count is the number for points along the line
"start"/10, "end"/10 -- my values are between 0 and 10, so 10/10 gives 1 (the max of the color ramp)
)
)
Here it is !
What if you made them meteors ?
Just set the size of each point from a min to a max :
On Georezo, a French forum, someone asked how to retrieve the streets closest to pipelines.
The QGIS expression
So, let’s suppose we have one data for pipelines (source) and one for streets (target), here is a QGIS expression that retrieves the street data object index closest to each pipeline.
One way to master QGIS field calculator expressions is to conceive them progressively, iteratively. Let’s decompose it.
Add a virtual field named nearest_with_nodes as integer which will store the index of the perfect target candidate, that is the index of the closest street line.
Open the Field Calculator window and follow this tutorial.
One street can be retrieved with the expression
get_feature_by_id('streets', 1)
Here it is the first object
To get the distance to this street from the current object, we calculate
But this distance is not ideal, because it is the closest space from one line to the other. If nodes are spread out, this does not reflect the “true” distance.
The “true” distance can be approached by calculating the distance from each of target object nodes to the current source line.
Now we have an array of distances, let’s say [1, 3, 2], we want to get the average of the distance. For this, we use array_avg available after installing the ArrayPlus plugin.
Interestingly, you can see you can execute sophisticated tasks internally with expressions in the field calculator without making any SQLish virtual layers or applying magic python code.
That makes the Field Calculator a powerful and fun-to-use tool
To me, ArrayPlusshould benefit from higher visibility as adding really interesting operators in QGIS. A user had to remain me of its existence. It would be nice if it joined the panoply of Field Calculator functions.
On the 10th of April, I created a map to see the evolution of COVID cases in France as spatialized sparklines.
I first saw it like a good use case on how to use some QGIS related functions (QGIS is an opensource geospatial tool)
Another experiment on rendering #COVID-19 evolution in France in #qgis using geometry generator Tonight, I'll put the code or write a tuto ▶️Use of relation_aggregate, some blur effects and a pinch of array "magic" 🧙♂️#datavizpic.twitter.com/Ugr7svXNx9
“Les Artisans cartographes” mentioned the map on twitter. Thereafter, many people started retweeting it. I didn’t expect it to make so much “noise”
For me, this representation was an efficient way to see evolutions on a map because you could observe the dynamics at a single glance.
Maybe this instantaneous look can help in emergency cases because you don’t need to press play and wait for every frame to complete in order to get “the big picture”.
For me, there was nothing much innovative or disruptive about this map. It had been a long time the idea was in my head and I had already experimented it around census data.
I thought someone had already created something similar. But Alberto Cairo, a world-reknown dataviz expert, seemed to have never seen something like this before, which surprised me.
Well before I put the QGIS code to create the map on github and explained it on this blog, some people on twitter started to create their own. Later, I saw some similar maps emerge.
That’s a gallery of these initiatives you’ll discover here.
You can see that the Washington Post map is more sophisticated, with additional use of thickness to illustrate the current state (actual number of cases) and color to support the evolution
Note the Washington Post map was showcased on flowingdata, which is a reference media relaying dataviz experiments (also tutorials)