I have a shapefile with buildings defined as polygons. Some of them are partially overlapped. They are all in the same layer. I can identify the overlapping using the "Topology Checker" but I cannot solve the overlapping issue.

What I would like is to obtain separate polygons, without overlapping but contiguous.

I have this:

enter image description here

enter image description here

and I would like to have this:

enter image description here

I tried without success:

  • GRASS/v.clean - nothing changed
  • SAGA/vector polygon tools/intersect
  • SAGA/vector polygon tools/self intersection - they both break the the 2 polygons on 3 (2+intersected area).
  • You could try geometry checker: docs.qgis.org/3.16/en/docs/user_manual/plugins/core_plugins/… – Babel Dec 11 '20 at 19:23
  • If there aren't many of these you can fix them manually, best done with snapping on. Note that any time a polygon has a vertex the abutting one must have one added there as well. The GRASS v.clean settings aren't stated in your question. You might start with inputs of line, boundary & area, with break, snap, bpol and rmarea tools, thresholds of 0,1,0,5 and a v.in.ogr snap of 1 (thresholds and snap hinge on your layer's units and tolerance but those with 0 don't use a threshold) with an output type of area. I like to assign unique id prior to clean to help find new polys if any. – johns Dec 15 '20 at 18:22

First make sure your Buildings have a unique id (which does not contain a | character, you will see why below). You can add it for example via field calculator by adding a new field with the expression $id if they do not have one already.

Then run "Polygon Self-Intersection" from SAGA Processing tools and choose this ID as Identifier:

enter image description here

Which will create a new layer, where the overlapping Parts become their own polygons.

enter image description here

This new layer will contain a new ID field, containing the IDs of their original buildings splitted by a | sign.

Now open the field calculator of this new layer and calulate a new field with this expression:

if(regexp_match("ID",'\\|') > 0,regexp_substr("ID",'[^|]*'),"ID") to get the second ID as mergeID or if(regexp_match("ID",'\\|') > 0,regexp_substr("ID",'(?<=\\|).*'),"ID") to get the first ID as mergeID:

This expression looks up in your "ID" field, wheter it contains a | character. If so, it chooses the ID before or after the | character. If it does not contain this character, it will just copy over the ID to the mergeID.

enter image description here

Then run "Dissolve" from processing toolbox and choose this mergeID as dissolve field:

enter image description here

Your final result:

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.