How to make a non-rectangular map layout in QGIS

Rectangles are the most common shape of maps in GIS software, but why stop there?

In GIS software like ArcGIS Pro, it is possible to create map layouts in non-rectangular shapes without too much hassle. But that is not the case in QGIS (yet!), so let’s look at ways to make creative map shapes in QGIS.

In this post, I explain how to download a Sentinel 2 image from the Copernicus Open Access Hub. I want to use this image to make some unique map-layouts.

I want to make an NDVI map, so I take the NIR and Red bands from the image (band 8 and 4), add them to QGIS, and use the Raster Calculator to make an NDVI image

I use the latest country-border polygon from GADM to clip the raster layer

I want to show the NDVI data of the area near the city of Aalborg, in some different shapes.

I start by creating two polygon layers, and create a big polygon in one layer and a small polygon (near Aalborg) in the second layer . The small polygon is the one that will define the layout, so get creative!

I use the Difference tool in QGIS to cut out the shape of the small polygon in the large polygon.

The outcome looks something like this:

Depending on your creative skills, you can make some cool shapes. You can also import a pre-made polygon and use that instead.

Here are the 3 versions I ended up with:

You can also add some of the classical map elements

How to download a satellite image from Copernicus Open Access Hub

Personally I don’t find the Copernicus Open Access Hub very intuitive to use, so I wanted to provide an example of how I download data from the website.

For this example I want to download a single Sentinel 2 (A or B) image from the northern part of Jutland in Denmark. I want it to be cloud free and it should be as recent as possible.

Here’s how I would do that:

1. Login to Copernicus Open Access Hub by clicking the confused looking person in the top right corner

2. Click on “Switch to Navigation Mode” in order to select the area that you are interested in

3. Select the area

4. Click on the filter-button left of the search bar, and make the following selections:

  • Select Sort by : Sensing date
  • Select the time period you are interested in (choose Sensing period)
  • Select the Sentinel satellite mission you want data from
    Tip: If e.g. you just want any image from Sentinel 2, you don’t have to select anything in the Satellite platform dropdown, just leave it empty.
  • Select cloud cover % if that is relevant. For Sentinel 2, I usually set the cloud cover very low, e.g. “[0 to 10]”.

5. Click on the search symbol in the top, and you should see a list of available images from your area.
If you don’t see any images, try to change the cloud cover or expand the selected time period.

6. Select the image that suits your needs and download it.
The download might take a while. The most recent image I downloaded took ~3 min to download and the size was ~0.6GB.

How a filter could look like

The image I ended up selecting

Once the download is finished, the next challenge is to find the raster files in the labyrinth of subfolders. I found mine here:

C:\Users\username\Downloads\S2B_MSIL2A_20220618T102559_N0400_R108_T32VNJ_20220618T121737\S2B_MSIL2A_20220618T102559_N0400_R108_T32VNJ_20220618T121737.SAFE\GRANULE\L2A_T32VNJ_A027590_20220618T102602\IMG_DATA

Here you can find three resolutions folders (R10m, R20m, R60m). In my case I chose R10m.

The data is in the JP2-format, which a program like QGIS should not have any problem reading.

That’s it — good luck with downloading data on your own!

If you want to see what I used the sentinel image for, you can read about it in this post.

How to find a specific satellite image in Google Earth Engine

Let’s say there is a specific spatial event that you are interested in, for example the volcanic eruption in Tonga on January 15th in 2022.

For this example I will use data from publicly available polar orbiting satellites. These kind of satellites only take a single image of an area, and returns to that area perhaps a week later. So it is pretty unlikely that one of these satellites passed by at the exact time of the eruption, but I hope to find some before-and-after shots.

Now, you might have seen incredible images of events like the Tonga eruption. Here is a gif of the Japanese meteorological satellite Himawari 8:

From the Japanese National Institute of Informatics (link)

Meteorological satellites are geostationary, which means that they follow the rotation of the earth and therefore appear as if they are in a fixed position in the sky. Geostationary satellites are typically placed at an altitude of 35,800 kilometers, compared to only 500-600 kilometers of polar orbiting satellites. A satellite like the Himawari 8 can obtain images e.g. every 10 minutes, which is not what we will be dealing with now (sorry to disappoint).

The first thing to do in Google Earth Engine is to get the location of the event. In this case, it is the Hunga Tonga–Hunga Ha’apai volcano in the southern Pacific Ocean.

I create a geometry point at approximately (-175.39, -20.55), which roughly corresponds to where the volcano is located. I also create a polygon, which I will use to search for satellite images that overlap the area.

Point and polygon are in place

Now let’s hunt for satellite images!

The two Earth Observation satellite programmes that I am most familiar with are Landsat and Sentinel, so let’s focus on those.

I want to start by getting an idea of what the volcano looked like before the eruption. Let’s get a nice, cloud-free image from both satellite programmes.

Since Landsat 9 was launched in September 2021, I will use data from Landsat 8 instead for this pre-eruption image. I will set the cloud cover to a maximum of 20% to keep the image as clear as possible:

var l8_2021 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
                  .filterDate('2021-01-01', '2022-01-01')
                  .filterBounds(geometry)
                  .filter(ee.Filter.lt('CLOUD_COVER_LAND', 20));
var l8_2021 = l8_2021.select(['B2','B3','B4'], ['B2','B3','B4'])
print(l8_2021, 'Landsat 8 (2021 average)');

var visualisation_l8 = {
  bands: ['B4', 'B3', 'B2'],
  min: 0.01,
  max: 0.2,
};

Map.addLayer(l8_2021.mean(), visualisation_l8, 'Landsat 8 2021')

Let’s do the same for Sentinel 2:

var s2_2021 = ee.ImageCollection('COPERNICUS/S2')
                  .filterDate('2021-01-01', '2022-01-01')
                  .filterBounds(geometry)
                  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 5));

var s2_2021 = s2_2021.select(['B2','B3','B4'], ['B2','B3','B4'])
print(s2_2021, 'Sentinel 2 (2021 average)');

var visualisation_s2 = {
  min: 600,
  max: 2000,
  bands: ['B4', 'B3', 'B2'],
};

Map.addLayer(s2_2021.mean(), visualisation_s2, 'Sentinel 2 2021');

Note that I set the cloud cover to only 5% for the Sentinel 2 images. I allow myself to set it that low, because there are much more images available than in the Landsat collection.

Here are the resulting images:

The Landsat 8 (left) is comprised of the average of 3 images,
whereas the Sentinel 2 (right) is based on the average of 20 images.

From this comparison I think it is quite clear that the Sentinel 2 images have a higher spatial resolution than the Landsat 9 images.

Now we know the situation before the eruption. Next we need to find out if there was a satellite passing over the volcano on the day of the eruption, or at least closely after. First, let’s have a look at the newly launched Landsat 9:

var l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_TOA')
                  .filterDate('2022-01-15', '2022-01-20')
                  .filterBounds(geometry);
var l9 = l9.select(['B2','B3','B4'], ['B2','B3','B4'])
print(l9, 'Landsat 9 (eruption)');

From the print-statement I can see that there is a single image from Landsat 9 available, from January 17th:

Let’s do the same for Sentinel 2:

var s2 = ee.ImageCollection('COPERNICUS/S2')
                  .filterDate('2022-01-15', '2022-01-20')
                  .filterBounds(geometry);

var s2 = s2.select(['B2','B3','B4'], ['B2','B3','B4'])
print(s2, 'Sentinel 2 (eruption)');

Here I also only get a single image, also from January 17th:

Luckily, both images are fairly cloud free, so we are able to see what remains of the island after the volcanic eruption two days prior:

Landsat 9 (left) and Sentinel 2 (right) on January 17 2022, two days after the eruption.

When comparing one of the images from January 17th to the average from 2021, it becomes evident that almost the entire island has disappeared as a result of the eruption:

I drew a polygon to make the difference more clear in the post-eruption image:

According to an estimate by NASA’s Earth Observatory, the eruption of Hunga Tonga–Hunga Ha’apai “released hundreds of times the equivalent mechanical energy of the Hiroshima nuclear explosion”. The plume from the eruption rose to 58 kilometers, making it the largest known volcanic plume measured by satellites.

You can find the Google Earth Engine code here.