Turfjs / turf

A modular geospatial engine written in JavaScript and TypeScript
https://turfjs.org/
MIT License
9.4k stars 944 forks source link

Round corners of LineString/Polygon #2352

Open asindl opened 2 years ago

asindl commented 2 years ago

Hi there, I am looking for an easy to use way to round corners of linestrings or polygons. Similar to the bezierSpline function, one could apply the "roundCorner" function to a linestring or polygon with a defined radius in the options which would then return the linestring/polygon with rounded corners.

Is that a meaningful feature for turf?

rowanwins commented 2 years ago

Hi @asindl

You might want to take a look at the @turf/polygonSmooth module.

It currently doesn't work with LineString's but from memory the underlying algorithm could be extended to support that.

And there is probably other algorithms out there for smoothing which might output slightly different shapes - as there isn't really one 'correct' output, it just depends a bit on what you're expecting.

Hope that helps

asindl commented 2 years ago

Thanks, @rowanwins. The polygonSmooth isn't exactly doing, what I am looking for (defined curve radius to smooth corners), but thanks for the suggestion to look at the source code and adapting it to my needs.

deflectn commented 1 month ago

It is possible to achieve this with multiple buffer operations.

const feature: Feature = …
const cornerRadius = 8;

// 1. increase geometry by radius without smoothing
feature.geometry = turf.buffer(feature.geometry, cornerRadius, { steps: 0 }).geometry;

// 2. decrease it by doubled radius with smoothing
feature.geometry = turf.buffer(feature.geometry, -(cornerRadius * 2), { steps: 8 }).geometry;

// 3. finally increase geometry again by radius with smoothing
feature.geometry = turf.buffer(feature.geometry, cornerRadius, { steps: 8 }).geometry;

Logical Steps

Maybe this logic could get wraped into a default function.

smallsaucepan commented 1 month ago

@deflectn this might be enough justification for us to start a "tips and techniques" section on the website.

smallsaucepan commented 1 month ago

Or perhaps @deflectn would you like to put together a PR for a new roundCorners module?

deflectn commented 1 month ago

Probably I could schedule it for Christmas time. 😉