QGIS atlas on non geometry tables


This is proof that no matter how close you are to a project you can still miss some really cool stuff that you never knew or considered was possible.

The problem to solve:

You have a CSV with a row of colours. Each row should be a new map and each column is the colour for that feature.

This is example of that kind of input

A       B
#93b2f3    #FF0000 
#dfbdbb    #FF0000
#f9d230    #FF0000

This questhion was asked on GIS.SE this morning. When I first saw it I had no idea it was even possible, I was thinking along the same lines as the person asking, that it would have to be done with Python. Not hard, but a lot harder then something built in and I put it in the too hard basket. I thought the atlas can almost do that, almost but not really.

Well almost was wrong. It can.

Note: You will need QGIS 2.5 (2.6 when released) for this to work

Lets make some cool maps! (and go to GIS.SE and upvote Nyalls answer)

First open your vector layer and the CSV. Don’t worry about style just yet, we will do it later.

Create a composer and add your map.

Here comes the first part of the trick.

Enable Atlas and set the coverage layer to the CSV layer. Wait? What? That doesn’t make any sense. If you think about it for a while it does. We need a map for each row (or “feature”) in the CSV and atlas does just that.

atlas_colours

How do we style the features? Well here is the other part of the trick. In 2.6 there is a magic expression function that returns a field value from another feature. And it’s as simple as attribute( $atlasfeature , 'A' ) – give me the attribute from the current atlas feature for field ‘A’. Simple.

First we categorize our features so we have a symbol for each feature. I’m using a sample layer I have but you can understand how this works. The first feature is A and the other is B, etc, etc

render

Now to use another awesome feature of QGIS. The data defined symbol properties (and labels too). Change each symbol and define the colour data defined property. Using attribute( $atlasfeature , 'A' ) for the first one and attribute( $atlasfeature , 'B' ) for the second.

atlas_feature

That is it. Now jump back over to your composer and enable Atlas preview.

atlas1

atlas2

Bam! Magic! How awesome is that!

Now my other thought was. “Ok cool, but the legend won’t update”. I should learn by now not to assume anything. The legend will also update based on the colours from the feature.

atlas1_legend

atlas2_legend

How far can we take this. What if you need the label to match the colour. Simple just make the label text look like this:

<h1 style='color:[% "A" %]'>This is the colour of A</h1>

atlas1_label

Heaps of credit to Nyall and the others who have added all this great stuff to the composer, atlas, and the data defined properties. It’s not something that you will do every day but it’s great to see the flexibility of QGIS in these situations.

You can even make the background colour of the page match the atlas feature

atlas1_back

but don’t do that because people might think you are mad ;)

Advertisements

One thought on “QGIS atlas on non geometry tables

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s