2

I'm dealing with several thousand polylines of Geologic data with mixed degrees of curvature. I'm attempting to quantify just "how curved" these lines are and was curious if there was a means to do so in ArcGIS.

I've also exported by Dataset to Matlab in an attempt to find a solution there.

I am seeking a repeatable and robust means for calculating curvature.

  • 1
    Do you, by any chance, mean 'sinuosity'? If so, there are a few posts on this site describing how to calculate it. – Fezter May 30 '16 at 0:02
  • The objects I have digitized are typically straight (dikes) and I am attempting to quantify their deviation from straight. Sinuousity could provide one measure of this. – morrismc May 30 '16 at 4:15
  • Find average and any other appropriate statistics of vertices to straight line connecting end points – FelixIP May 30 '16 at 4:24
  • Take a look at arcgis.com/home/item.html?id=00e708a448b74810a0e805c4a97f9d46 Calculate Sinuosity script tool. – Alex Tereshenkov May 30 '16 at 5:12
2

If you have access to an Advanced ArcGIS license, you are able to run the Simplify Line tool, which remove unnecessary vertices while preserving the feature's basic shape.

If not, you can access similar functionality via the Generalize or Smooth tools on the Advanced Editing toolbar in ArcMap.

You could therefore:

  • simplify the features to a known tolerance, then
  • count the remaining vertices

Features with more vertices are more "curved".

Eg in the case of a straight dyke there will only be 2 vertices after simplification, while in the case of a complicated feature there will be many vertices.

(You should perform the simplification on a COPY of your data, as this will corrupt the original shape)

| improve this answer | |
  • More vertices doesn't necessarily equate to more curved. For example, you could have a straight line with with 100 points all along the line. The line is still straight, just with more vertices. – Fezter May 30 '16 at 5:28
  • 1
    @Fezter that's why I suggested simplifying first, to remove any extraneous vertices. If you simplify all features with the same tolerance, then in the output features more vertices does equate to more curved – Stephen Lead May 30 '16 at 5:46
  • 1
    Oh yes. I see that now. Yeah, that should work. +1 – Fezter May 30 '16 at 5:47
  • @Fezter your first suggestion, of comparing the length between the endpoints and the recorded length, is a much better non-destructive approach! – Stephen Lead May 31 '16 at 22:11
1

You can calculate the degrees of curvature using at least the follwoing two metrics.

  1. Sinuosity - I mentioned this in my comment above. Also, see @Alex Tereshenkov's link for a tool to calculate sinuosity. Also, this could be calculated using field calculator by comparing the pythagorean distance of the start and end points vs. the actual length of the line. Note, this requires that your data is not multi-part.

  2. As per @FelixIP's comments, you can use spatial statistics. Specifically, maybe run the Linear Directional Mean tool for each individual line. This is probably not something you want to do manually for each individual line. However, this could easily be achieved using scripting with search cursors.

If there is something else that you're thinking of, please edit your question with more details. For example, @whuber, has shown a fantastic solution for finding inflection points in a line using R.

| improve this answer | |
0

If you use Matlab, you could calculate the curvature (radius of curvature) at any point along your polylines using this formula

K = 2*((x2-x1)*(y3-y2)-(y2-y1)*(x3-x2)) / sqrt( ...
((x2-x1)^2+(y2-y1)^2)*((x3-x2)^2+(y3-y2)^2)*((x1-x3)^2+(y1-y3)^2) );

(x1,y1), (x2,y2), and (x3,y3) being the coordinates of three successive points on the curve, as explained here http://www.mathworks.com/matlabcentral/newsreader/view_thread/145981

To use this, you will need to have your polylines vertices sampled at equal interval. You could then use the average as an estimate of the overall curvature of a given polyline. You would also need to determine the window length to estimate the curvature, as this metric is scale-dependant (i.e you are looking at large or small variation). You could compare different spatial scales if it is relevant.

1- make sure your lines are smooth and have a high density in vertices (optional)

[Line]=densif_line(X1,Y1,npoints)

lineX(1,1:2)=NaN
lineY(1,1:2)=NaN

for i=1:length(Y1)-1

[linspace(x1,x2,npoints);linspace(y1,y2,npoints)]
interpointX=linspace(X1(i),X1(i+1),npoints);
interpointY=linspace(Y1(i),Y1(i+1),npoints);

 lineX=[lineX interpointX];
 lineY=[lineY interpointY];
end

Line(:,1)=lineX';
Line(:,2)=lineY';

end

2- create a vector of distance from first vertex. Cumulate the distance between two points iteratively using the function

 pdist

3- iteratively estimate the radius of curvature with the above formula at a given window

4- estimate the average curvature value for the polyline

 mean

5- build a loop to process all your polylines at once

| improve this answer | |
0

You can see also the tool of Parcel Editor Development Team Curve And Lines

ArcGIS Pro 2.1 introduced a geoprocessing tool that will also convert densified lines into one or more separate circular arcs by fitting circular arcs to the straight-line segment sequences. This new gp tool can be found in the Editing toolbox and is called Simplify By Straight Lines And Circular Arcs.

| 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.