Skip to content

Commit a4e5105

Browse files
committed
C API: Add GEOSCurveToLine, GEOSLineToCurve
1 parent 37651a7 commit a4e5105

5 files changed

Lines changed: 476 additions & 0 deletions

File tree

capi/geos_c.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*
1616
***********************************************************************/
1717

18+
#include <geos/algorithm/CurveToLineParams.h>
19+
#include <geos/algorithm/LineToCurveParams.h>
1820
#include <geos/geom/prep/PreparedGeometryFactory.h>
1921
#include <geos/index/strtree/TemplateSTRtree.h>
2022
#include <geos/io/WKTReader.h>
@@ -43,7 +45,9 @@
4345
#define GEOSPreparedGeometry geos::geom::prep::PreparedGeometry
4446
#define GEOSClusterInfo geos::operation::cluster::Clusters
4547
#define GEOSCoordSequence geos::geom::CoordinateSequence
48+
#define GEOSCurveToLineParams geos::algorithm::CurveToLineParams
4649
#define GEOSBufferParams geos::operation::buffer::BufferParameters
50+
#define GEOSLineToCurveParams geos::algorithm::LineToCurveParams
4751
#define GEOSSTRtree geos::index::strtree::TemplateSTRtree<void*>
4852
#define GEOSWKTReader geos::io::WKTReader
4953
#define GEOSWKTWriter geos::io::WKTWriter
@@ -217,6 +221,65 @@ extern "C" {
217221
return GEOSCoveredBy_r(handle, g1, g2);
218222
}
219223

224+
GEOSCurveToLineParams*
225+
GEOSCurveToLineParams_create()
226+
{
227+
return new geos::algorithm::CurveToLineParams;
228+
}
229+
230+
int
231+
GEOSCurveToLineParams_setTolerance(GEOSCurveToLineParams* params, int toleranceType, double toleranceValue)
232+
{
233+
return GEOSCurveToLineParams_setTolerance_r(handle, params, toleranceType, toleranceValue);
234+
}
235+
236+
void
237+
GEOSCurveToLineParams_destroy(GEOSCurveToLineParams* params)
238+
{
239+
delete params;
240+
}
241+
242+
GEOSGeometry*
243+
GEOSCurveToLine(const GEOSGeometry* g, const GEOSCurveToLineParams* params)
244+
{
245+
return GEOSCurveToLine_r(handle, g, params);
246+
}
247+
248+
GEOSGeometry*
249+
GEOSLineToCurve(const GEOSGeometry* g, const GEOSLineToCurveParams* params)
250+
{
251+
return GEOSLineToCurve_r(handle, g, params);
252+
}
253+
254+
GEOSLineToCurveParams*
255+
GEOSLineToCurveParams_create()
256+
{
257+
return new geos::algorithm::LineToCurveParams;
258+
}
259+
260+
void
261+
GEOSLineToCurveParams_destroy(GEOSLineToCurveParams* params)
262+
{
263+
delete params;
264+
}
265+
266+
int
267+
GEOSLineToCurveParams_setRadiusTolerance(GEOSLineToCurveParams* params, double tolerance)
268+
{
269+
return GEOSLineToCurveParams_setRadiusTolerance_r(handle, params, tolerance);
270+
}
271+
272+
int
273+
GEOSLineToCurveParams_setMaxStepDegrees(GEOSLineToCurveParams* params, double tolerance)
274+
{
275+
return GEOSLineToCurveParams_setMaxStepDegrees_r(handle, params, tolerance);
276+
}
277+
278+
int
279+
GEOSLineToCurveParams_setMaxAngleDifferenceDegrees(GEOSLineToCurveParams* params, double tolerance)
280+
{
281+
return GEOSLineToCurveParams_setMaxAngleDifferenceDegrees_r(handle, params, tolerance);
282+
}
220283

221284
//-------------------------------------------------------------------
222285
// low-level relate functions

capi/geos_c.h.in

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,20 @@ typedef struct GEOSMakeValidParams_t GEOSMakeValidParams;
188188
*/
189189
typedef struct GEOSClusterInfo_t GEOSClusterInfo;
190190

191+
/**
192+
* Parameter object for curve-to-line conversion
193+
* \see GEOSCurveToLineParams_create()
194+
* \see GEOSCurveToLineParams_destroy()
195+
*/
196+
typedef struct GEOSCurveToLineParams_t GEOSCurveToLineParams;
197+
198+
/**
199+
* Parameter object for line-to-curve conversion
200+
* \see GEOSLineToCurveParams_create()
201+
* \see GEOSLineToCurveParams_destroy()
202+
*/
203+
typedef struct GEOSLineToCurveParams_t GEOSLineToCurveParams;
204+
191205
#endif
192206

193207
/** \cond */
@@ -1799,6 +1813,53 @@ extern double GEOS_DLL GEOSGeom_getPrecision_r(
17991813
GEOSContextHandle_t handle,
18001814
const GEOSGeometry *g);
18011815

1816+
/**
1817+
* Curve-to-line tolerance types.
1818+
*/
1819+
enum GEOSCurveToLineTolerance {
1820+
/** Maximum angle between successive vertices of a linearized arc */
1821+
GEOS_CURVETOLINE_STEP_DEGREES = 0,
1822+
/** Maximum distance between an arc and its linearized approximation */
1823+
GEOS_CURVETOLINE_MAX_DEVIATION = 1
1824+
};
1825+
1826+
/** \see GEOSCurveToLine */
1827+
extern GEOSGeometry GEOS_DLL *GEOSCurveToLine_r(
1828+
GEOSContextHandle_t handle,
1829+
const GEOSGeometry* g,
1830+
const GEOSCurveToLineParams* params);
1831+
1832+
/** \see GEOSCurveToLineParams_setTolerance */
1833+
extern int GEOS_DLL GEOSCurveToLineParams_setTolerance_r(
1834+
GEOSContextHandle_t extHandle,
1835+
GEOSCurveToLineParams* params,
1836+
int toleranceType,
1837+
double toleranceValue);
1838+
1839+
/** \see GEOSLineToCurve */
1840+
extern GEOSGeometry GEOS_DLL *GEOSLineToCurve_r(
1841+
GEOSContextHandle_t handle,
1842+
const GEOSGeometry* g,
1843+
const GEOSLineToCurveParams* params);
1844+
1845+
/** \see GEOSLineToCurveParams_setRadiusTolerance */
1846+
extern int GEOS_DLL GEOSLineToCurveParams_setRadiusTolerance_r(
1847+
GEOSContextHandle_t extHandle,
1848+
GEOSLineToCurveParams* params,
1849+
double tolerance);
1850+
1851+
/** \see GEOSLineToCurveParams_setMaxStepDegrees */
1852+
extern int GEOS_DLL GEOSLineToCurveParams_setMaxStepDegrees_r(
1853+
GEOSContextHandle_t extHandle,
1854+
GEOSLineToCurveParams* params,
1855+
double tolerance);
1856+
1857+
/** \see GEOSLineToCurveParams_setMaxAngleDifferenceDegrees */
1858+
extern int GEOS_DLL GEOSLineToCurveParams_setMaxAngleDifferenceDegrees_r(
1859+
GEOSContextHandle_t extHandle,
1860+
GEOSLineToCurveParams* params,
1861+
double tolerance);
1862+
18021863
/** \see GEOSGetNumInteriorRings */
18031864
extern int GEOS_DLL GEOSGetNumInteriorRings_r(
18041865
GEOSContextHandle_t handle,
@@ -5483,6 +5544,101 @@ extern GEOSGeometry GEOS_DLL *GEOSGeom_setPrecision(
54835544

54845545
///@}
54855546

5547+
/* ============================================================== */
5548+
5549+
/** @name Line/Curve conversion
5550+
* Functions for converting between curved and linear geometry types.
5551+
*/
5552+
///@{
5553+
5554+
/** Approximate all circular arcs in a geometry using line segments.
5555+
* If the input has no circular arcs, a copy will be returned.
5556+
* \param g the geometry to convert
5557+
* \param params parameters to use in the linearization.
5558+
* \return The linearized geometry.
5559+
* Caller must free with GEOSGeom_destroy()
5560+
* NULL on exception
5561+
*
5562+
* \since 3.15
5563+
*/
5564+
extern GEOSGeometry GEOS_DLL *GEOSCurveToLine(
5565+
const GEOSGeometry* g,
5566+
const GEOSCurveToLineParams* params);
5567+
5568+
extern GEOSCurveToLineParams GEOS_DLL *GEOSCurveToLineParams_create();
5569+
5570+
extern void GEOS_DLL GEOSCurveToLineParams_destroy(GEOSCurveToLineParams* params);
5571+
5572+
extern int GEOS_DLL GEOSCurveToLineParams_setTolerance(
5573+
GEOSCurveToLineParams* params,
5574+
int toleranceType,
5575+
double toleranceValue);
5576+
5577+
/** Replace line segments in the geometry with circular arcs, where possible.
5578+
*
5579+
* \param g the geometry to convert
5580+
* \param params parameters to use in the conversion.
5581+
* \return The converted geometry.
5582+
* Caller must free with GEOSGeom_destroy()
5583+
* NULL on exception
5584+
*
5585+
* \since 3.15
5586+
*/
5587+
extern GEOSGeometry GEOS_DLL *GEOSLineToCurve(
5588+
const GEOSGeometry* g,
5589+
const GEOSLineToCurveParams* params);
5590+
5591+
extern GEOSLineToCurveParams GEOS_DLL *GEOSLineToCurveParams_create();
5592+
5593+
extern void GEOS_DLL GEOSLineToCurveParams_destroy(GEOSLineToCurveParams* params);
5594+
5595+
/** Set the radius tolerance used in line-to-curve conversion.
5596+
*
5597+
* A vertex may be considered to continue a circular arc if its distance to the
5598+
* previously-computed circle center is within the specified fraction of the
5599+
* circle radius.
5600+
*
5601+
* \param params the parameters object
5602+
* \param tolerance the tolerance value
5603+
* \return 1 on success, 0 on failure
5604+
* \since 3.15
5605+
*/
5606+
extern int GEOS_DLL GEOSLineToCurveParams_setRadiusTolerance(
5607+
GEOSLineToCurveParams* params,
5608+
double tolerance);
5609+
5610+
/** Set the maximum angle spacing used in line-to-curve conversion.
5611+
*
5612+
* A vertex may be considered to continue a circular arc if the circular sector
5613+
* between the vertex and the final point in the arc is less than the specified tolerance. Because of round-off errors, this value should be slightly greater than the one used
5614+
* in \ref GEOSCurveToLineParams_setTolerance.
5615+
*
5616+
* \param params the parameters object
5617+
* \param tolerance the tolerance value
5618+
* \return 1 on success, 0 on failure
5619+
* \since 3.15
5620+
*/
5621+
extern int GEOS_DLL GEOSLineToCurveParams_setMaxStepDegrees(
5622+
GEOSLineToCurveParams* params,
5623+
double tolerance);
5624+
5625+
/** Set the maximum angle difference used in line-to-curve conversion
5626+
*
5627+
* A vertex p[n] may be considered to continue a circular arc if the
5628+
* difference between the angles p[n-2] / p[n-1] / p[n] is within the
5629+
* specified difference of the angle p[0] / p[1] / p[2].
5630+
*
5631+
* \param params the parameters object
5632+
* \param tolerance the tolerance value
5633+
* \return 1 on success, 0 on failure
5634+
* \since 3.15
5635+
*/
5636+
extern int GEOS_DLL GEOSLineToCurveParams_setMaxAngleDifferenceDegrees(
5637+
GEOSLineToCurveParams* params,
5638+
double tolerance);
5639+
5640+
///@}
5641+
54865642
/* ============================================================== */
54875643
/** @name Spatial Predicates
54885644
* Functions computing binary spatial predicates using the DE-9IM topology model.

capi/geos_ts_c.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
***********************************************************************/
1919

2020
#include <geos/algorithm/BoundaryNodeRule.h>
21+
#include <geos/algorithm/CurveToLineParams.h>
22+
#include <geos/algorithm/LineToCurveParams.h>
2123
#include <geos/algorithm/MinimumBoundingCircle.h>
2224
#include <geos/algorithm/MinimumDiameter.h>
2325
#include <geos/algorithm/MinimumAreaRectangle.h>
@@ -145,7 +147,9 @@
145147
#define GEOSPreparedGeometry geos::geom::prep::PreparedGeometry
146148
#define GEOSClusterInfo geos::operation::cluster::Clusters
147149
#define GEOSCoordSequence geos::geom::CoordinateSequence
150+
#define GEOSCurveToLineParams geos::algorithm::CurveToLineParams
148151
#define GEOSBufferParams geos::operation::buffer::BufferParameters
152+
#define GEOSLineToCurveParams geos::algorithm::LineToCurveParams
149153
#define GEOSSTRtree geos::index::strtree::TemplateSTRtree<void*>
150154
#define GEOSWKTReader geos::io::WKTReader
151155
#define GEOSWKTWriter geos::io::WKTWriter
@@ -3499,6 +3503,61 @@ extern "C" {
34993503
});
35003504
}
35013505

3506+
GEOSGeometry*
3507+
GEOSCurveToLine_r(GEOSContextHandle_t extHandle, const Geometry *g,
3508+
const GEOSCurveToLineParams* params)
3509+
{
3510+
return execute(extHandle, [&]() {
3511+
return g->getLinearized(*params).release();
3512+
});
3513+
}
3514+
3515+
int
3516+
GEOSCurveToLineParams_setTolerance_r(GEOSContextHandle_t extHandle, GEOSCurveToLineParams* params,
3517+
int toleranceType, double toleranceValue)
3518+
{
3519+
return execute(extHandle, 0, [&]() {
3520+
params->setTolerance(static_cast<GEOSCurveToLineParams::TOLERANCE_TYPE>(toleranceType), toleranceValue);
3521+
return 1;
3522+
});
3523+
}
3524+
3525+
GEOSGeometry*
3526+
GEOSLineToCurve_r(GEOSContextHandle_t extHandle, const GEOSGeometry* g,
3527+
const GEOSLineToCurveParams* params)
3528+
{
3529+
return execute(extHandle, [&]() {
3530+
return g->getCurved(*params).release();
3531+
});
3532+
}
3533+
3534+
int
3535+
GEOSLineToCurveParams_setMaxAngleDifferenceDegrees_r(GEOSContextHandle_t extHandle, GEOSLineToCurveParams* params, double tolerance)
3536+
{
3537+
return execute(extHandle, 0, [&]() {
3538+
params->setMaxExteriorAngleDifferenceDegrees(tolerance);
3539+
return 1;
3540+
});
3541+
}
3542+
3543+
int
3544+
GEOSLineToCurveParams_setMaxStepDegrees_r(GEOSContextHandle_t extHandle, GEOSLineToCurveParams* params, double tolerance)
3545+
{
3546+
return execute(extHandle, 0, [&]() {
3547+
params->setMaxStepDegrees(tolerance);
3548+
return 1;
3549+
});
3550+
}
3551+
3552+
int
3553+
GEOSLineToCurveParams_setRadiusTolerance_r(GEOSContextHandle_t extHandle, GEOSLineToCurveParams* params, double tolerance)
3554+
{
3555+
return execute(extHandle, 0, [&]() {
3556+
params->setRadiusTolerance(tolerance);
3557+
return 1;
3558+
});
3559+
}
3560+
35023561
int
35033562
GEOSGeom_getDimensions_r(GEOSContextHandle_t extHandle, const Geometry* g)
35043563
{

0 commit comments

Comments
 (0)