2

How can I measure/calculate the curvature of a linestring?

I need just a boolean value: is curved or is not curved.

At the moment, I don't find a working strategy for that.

4
  • 1
    Does "not curved" for you mean all the points are on a straight line?
    – Spacedman
    Jun 27, 2019 at 14:53
  • Yes it does. My problem is that a straight line does not necessarily have to have two points. In my application a polygon line has been created from many points. This was divided into different segments depending on a defined length value. Each segment is a line string and consists of at least two points. One point is at the beginning and one point at the end of this line. However, other points can also lie between them. The preparatory work was done by a colleague. I shall now extend the individual segments with information, e.g. curvature. Translated with www.DeepL.com/Translator
    – md118
    Jun 27, 2019 at 15:11
  • I don't understand your first solution, but it's working.
    – md118
    Jul 1, 2019 at 8:05
  • look up what a "convex hull" of a set of points is. Then you can see that the convex hull of a straight line of points is a polygon that is a straight line - it has no width. This will have zero area.
    – Spacedman
    Jul 1, 2019 at 10:19

1 Answer 1

8

Some of many (somewhat hacky) solutions using the field calculator:

  • select to add a field with type BOOLEAN
  • use one of the expressions (returning true when line is curved)

    area( convex_hull( $geometry ) ) > 0 AND area( convex_hull( $geometry ) ) IS NOT NULL
    

    or, probably better performing

    length( $geometry ) > distance( start_point( $geometry ), end_point( $geometry ) )
    

    or many more...

5
  • Why do you have to catch NULL in the first example?
    – Spacedman
    Jun 27, 2019 at 18:16
  • @Spacedman either a LineString is invalid for the convex_hull function or, more likely, the area function doesn't like invalid polygon, didn't check (you might even use a different syntax, but then you'd necessarily add a NOT comparison. or use a is_straight column). the expression returned NULL for straight lines when I validated (QGIS 3.8, Linux). I should have emphasized the second approach anyways I guess, calculating the convey hull for more complex geometries is way more expensive.
    – geozelot
    Jun 27, 2019 at 20:52
  • Will the length test work for a straight line that jumps back on itself? eg a LINESTRING from A to B and then back to the midpoint between A and B? I think overlapping and intersecting LINESTRINGS are valid simple features...
    – Spacedman
    Jun 27, 2019 at 21:52
  • although it may be that a line feature that jumps back on itself is "curved" with a 180 degree curve and should therefore be classed as "curved"... depends on the use case. Two nice hacks anyway.
    – Spacedman
    Jun 27, 2019 at 22:12
  • @Spacedman that's indeed an edge case...most angle based computations will result in this case being True. the matrix determinant of the slope functions between vertices would return False, or you could rotate the line so that the end point has the same Y, then check if any vertice is above or below. way more involved anyways...
    – geozelot
    Jun 28, 2019 at 6:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.