Search code examples
algorithmgeometrygispostgis

How to intelligently degrade or smooth GIS data (simplifying polygons)?


I have detailed US county maps, from the TIGER LINE data sets. How might I sample, smooth, or degrade the data so that I get straighter, more boxy, less "noisy" shapes to represent the geographical features -- in this case just county boundaries and state lines, but maybe also in the general case?

The sampling could happen at rendering time if that can be done efficiently, or a parallel data set could be generated and stored. I am using PostGIS, and the lines are multi-polylines generated by shp2pgsql -- but any solution where you take a squiggly line and reduce it to a smoother line of roughly the same significance to a human interpreter would be very useful.


Solution

  • The problem with simply throwing away points is that you can quickly distort the shape of the original polygon. A better approach is to come at it from the other direction; start with a basic approximation of the polygon and then refine it upwards towards your complex shape.

    An excellent example of this approach is the Douglas-Puecker algorithm. You start with two vertices drawn from the full polygon. Add a third vertex by selecting the one that lies farthest from an edge drawn between the first two vertices. Continue adding points until you have something that sufficiently resembles your original polygon.