The other day Gina, one of our researchers at SED, had a GIS dataset of Urban Morphology Types (UMTs). This data contained many small roads, which we needed to remove.
The initial dataset looked like this:
This is a single polygon shapefile (UMT_v1.shp), here symbolized by UMT class. As you can see, there are lots of minor streets, mostly in residential areas. Let’s zoom in:
You can see minor streets in blue here. For reasons specifioc to her project, Gina needed to get rid of these streets so that it looks like this:
So, how do we get rid of the streets? We can easily select them, as they all have a common attrribute (“LULEVEL4GR” LIKE ‘Street’). Howwever, if we select and delete the streets we get holes in the dataset, as show in teh next image. This is because the data consists of non-overlapping polygons. There are perfectly valid reasoons for such a data structure, but in this case it causes a problem.
I eventually came up with a procedure that eleiminates the streets, but sufficiently maintains the geometric integrity of all other features. First we do some preprocessing:
- Select all streets by their common attribute “LULEVEL4GR” LIKE ‘Street’
- Write the selection to a new dataset ‘UMT_Streets’
- Switch the selection
- Write the selection to a new dataset UMT_v2
Now we have one dataset containing only the streets that need to be removed, and one dataset containing only UMTs, but the latter has holes where the streets used to be.
- We apply a buffer of -0.75m to the streets daatset. This negative buffer buffers the street polygons to their inside, creating thinner street polygons.
- We snap the vertices of non-street polygons that are within one meter of these new streets to the new street polygons. For this step we use the ArcGIS Integrate tool.
Now we only need to repeat these two steps a few times. With each iteration the street polygons become thinner until they disappear completely (when the buffer output does not contain any features anymore).
I automated the procedure with a simple model, and after 18 iterations it produced the desired output:
Zoomd out it looks like this:
For comparision here is the initial UMT dataset again:
Note that the second step of our procedure (snapping with the Integrate tool) intoduces a positional error, as it basically snaps all non-street vertices to whatever is within their snapping distance. In our case we had set this tolerance to 1m to make sure we reach the -0.75m buffers. If higher spatial accuracy in the output was required we could set both the buffer distance and snap tolerance to lower values. This would require more iterations but create a higher accuracy output.