I didn’t remember that I had 4 previous post on this topic, but I’ve gotten a little obsessed with this problem– how to (with relatively little computational cost) kind the centerline of complex polygons, so we can extract flow lines from streams, label long complex polygons, easily generate the centerline parcel boundary line for river bound parcels, etc.. FYI, here are my 4 previous posts on this topic:
I’ll confess, I became somewhat enamored of the scale axis transform as a method for tackling this problem. In short, the scale axis transform identifies the medial axis of the polygon using Amenta and Kolluri’s finite union of balls to identify the initial centerline of the polygon, and then tries to fix the deficiencies in the robustness of the medial axis.
The problem, of course, is the degree to which bumps in the shape result in extra little lines hanging off our medial axis. This does not represent an intuitive medial axis. This is not what we would (in this case) call the centerline of the stream.
The scale axis transform suggests expanding these balls by a multiplicative factor, and deriving the new axis from that scaled version:
This step can easily be done in PostGIS once you have the medial axis:
CREATE TABLE rr_expand_r3_12 AS SELECT ST_Buffer(b.the_geom, ST_Distance(b.the_geom, ST_Union(a.the_geom)) * 1.2 ) FROM medial_axis b, polyline a GROUP BY <a href="http://a.id/" target="_blank">a.id</a>, b.the_geom ;
I will play a bit more with this, but the initial results I got around areas with islands (torus like topology) were disappointing. Also, at least as I have this implemented in PostGIS, this is a computationally intensive process. I think though that I have a good (enough) alternative, which will be the topic of my next post.