[GIS] How to split polygon features using an overlaid polygon layer in QGIS

editinggeoprocessingmultipartqgissplitting

I have a polygon layer (pictured below) that I made by vectorizing a clip from the USDA Cropland Data Layer. The low resolution of the USDA layer causes fields that are separated by narrow roads to "bleed" into each other and be rendered as a single feature following vectorization.

enter image description here

For analysis purposes, I need separate fields to be rendered as separate features. So, I downloaded a vector roads layer and subtracted that from the crop layer, carving up the layer along the roads. I expected this to split bisected fields into separate features, but it did not, as shown below (only one side was selected, but both light up).

enter image description here

Manually splitting features one at a time is not an option. How can I use a geoprocessing approach to cut my crop layer along roads such that bisected features are split into separate features in the output? I'm using QGIS 2.8.

Best Answer

The difference operation has resulted in multipart features - that is multiple geometries for a single record/feature in the database. This makes sense as the difference tool is simply erasing parts of existing features. As lolcat mentions in the comment, there is a tool called Multipart to Singleparts which will split them up so you have one record/row for each geometry. Do note that each resulting singlepart will typically have the same attributes as the parent part - value attributes are not apportioned to the children.

You could also use alternative means on the two source layers which may not result in multiparts. Some other questions more aimed at splitting polygons by lines (as opposed to buffered lines):

Alternatively, if you've buffered the roads as centerlines or have them as polygons, you could union the two layers and then delete the polygons that were formed from the overlap, which should leave just the field polygons (union may have an option to allow multiparts or not, be sure to check).

Related Question