Trick to fix broken polygon geometries in QGIS 3.X
Fellow researchers and open-source GIS enthusiasts,
Welcome to my blog!
I’d like to start with a disclaimer – I may be a researcher of this very area but that doesn’t mean everything I do or write here will work for you, in your own desktop configurations and package versions. I have no responsibility if you lose data or mess up your installation. I also do not authorize any copies of my content.
Today, I am showing you 1) one thing to look out for when drawing a polygon, and 2) how to fix stubborn invalid polygon geometries.
Most of the time, we can just use the functionality created to fix broken geometries, called “Fix geometries” but if it doesn’t work, there is a workaround for that, too!
First, I will create a purposefully invalid geometry to apply the fix. Then, I will show you two ways to fix it. In one of them, I simply apply the “Fix geometries” native tool of QGIS. The second option I will show here is using the buffer tool. In this simple trick, I will show you how to create an infinitesimal buffer around my broken geometry, which ends up fixing it but has its perks as well.
My friend Iporã Possanti, who also writes about GIS was the one that taught me this trick on QGIS 2, back in the old, pre-pandemic days, saving me of a headache because of a stubborn polygon!
For the examples here shown, I will be using QGIS 3.16, the current stable version.
How to draw a polygon in a way you’ll end up with broken geometries
Create a new vector layer and Toggle Editing
With the edit mode turned on, click in “Add Polygon Feature”.
Start drawing your polygon.
Oops! You double-clicked on a vertex. No problem, right? RIGHT?
Let’s say that you ignored this little mistake and continued to draw the polygon. Been there, done that.
Here is your polygon!
Now, the next step is to generate random points for an analysis on the Atlantic Ocean. Using the tool “Random Points inside Polygons” I try to create 50 random points within this area.
But when I click Run, I get an error:
Feature (-28) from “bad_polygon” has invalid geometry. Please fix the geometry or change the Processing setting to the “Ignore invalid input features” option. Execution failed after 0.02 seconds
My knee-jerk reaction would be to check “Ignore invalid input features”, but then, the algorithm will ignore the only feature there is. There are better solutions to this issue.
OK, how to avoid this error, then?
When generating your polygon, avoid creating intersections between the lines. This is an intersection:
This is (mainly) what causes issues on the geometries.
And how to fix my geometry with this error?
Well, I have two options for you. Tentatively, you should start with the regular algorithm “Fix geometries”. If that does not solve the problem, or if you want to skip to the other solution, the alternative is using the “Buffer”. Both are described in detail below.
Using the QGIS tool “Fix geometries”
Quick and painless, “Fix geometries” will fix most of the geometry issues you may encounter. When applied to my previously created Polygon, it generates this:
It is still a single polygon, as can be seen on the attribute table:
But, when I Toggle Editing and try to edit the vertices, a new vertex was created on the intersection between the lines. This vertex did not previously exist.
After doing this, I was able to run “Random Points inside polygons” without issues.
Buffer with distance=0
You can also solve this issue using the native tool “Buffer”.
The only property that I altered was the distance, that I filled with “0” degrees.
After clicking “Run”, I got this:
The second part of the polygon, which was on the right side of the intersection, was eliminated by this pipeline.
Then, I could run “Random Points inside polygons”, also without issues.
The use of the “Buffer” algorithm can fundamentally alter the geometry of the Polygon but is a valid alternative to “Fix geometries”. In my experience, using a buffer with 0m distance always worked to fix even the most stubborn geometries.
- Splitting many polygons into (almost) equal parts using a simple script in PyQGIS, the Python Console of QGIS
- The wedge tool: drawing circular quadrants, rings, and related geometries in QGIS
- Saving temporary scratch layers using PyQGIS and visualizing them in your QGIS Project
- Solved: QGIS 3.20 Python Console shows an error when running Clip Vector by Extent tool
- Sampling raster values in predetermined points on QGIS