I have a road network shapefile for a US state and I am trying to derive the radius of curvature for road segments in this shapefile. I need to be able to perform this task within just a few functions for thousands of road segments.

The road segments vary between 0.2 miles and maybe 5 or so miles. Each segment has several curves, but I am only interested in curves small enough to force a vehicle to make a reasonable turn. This should reduce the number of curves of interest per segment to a max of 1 or 2, with many segments not having such curves at all. I have not determined the maximum radius of the curve (the threshold) I would like to use.

For segments with only 1 such curve, I would like to obtain the values of those curves for those segments, and for those with more than 1, an average will do.

  • A helpful link forums.arcgis.com/threads/… – Alex Tereshenkov Jun 11 '14 at 18:04
  • Would calculating sinuosity of each road segment be helpful to you? There are ready-to-use tools for this I could share. – Alex Tereshenkov Jun 11 '14 at 18:11
  • Because a segment (which is a portion of a straight line, by definition) has infinite radius of curvature, surely your intent is to estimate a mean radius of curvature throughout series of connected segments. The estimates can vary depending on how long a portion of the road is used as well as the estimation procedure. The output in principle is a continuously varying function of location, so there's also an issue of how that should be represented. Choosing a good solution depends on understanding why you need this calculation. Could you edit the question to provide that kind of context? – whuber Jun 11 '14 at 21:17
  • Incidentally, one solution, with working code, is posted at gis.stackexchange.com/a/37078/664--but it's not clear whether that's what you're looking for. – whuber Jun 11 '14 at 21:18
  • whuber- i will add more detail to the question. – VT2 Jul 16 '14 at 12:34

The curvature (κ) of a two-dimensional curve is defined as κ=dϕ/ds, where ϕ is the tangential angle and s is the arc length (source). To avoid calculus, this derivative can be approximated as the total change in angle divided by the total length of the curve. The radius of curvature (r) is simply the inverse of the curvature: r = 1/κ

This math can be used to calculate the radius of a curve in a digitized road polyline that is approximated with multiple line segments. The procedure goes something like this:

  • Determine the beginning and end points of the curve.
  • Measure total change in angle and total curve length from start to finish.
  • Do the math and store the radius of curvature.

I once wrote a script that cycles through the vertices of polylines, calculating the bearing of the line and the angle change. Depending on the angle change (is it turning right? left? not turning?), it decides whether each point is an inflection point (where direction changes). Between the start and end, it adds up the total angle change and total line segments length and then calculates r.

There are some additional filtering steps to ignore very small angle changes and other problems that are due to digitization artifacts rather than actual road curvature. If the radius is within a certain range of interest (for our purposes, we only cared about r less than 100'), it outputs it to a new shapefile. Even with all this, it is quite fast and capable of running through thousands of roads. Results seem reasonably reliable, although I haven't put it through a comprehensive error analysis.

| improve this answer | |

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.