Skip to content

Commit cd8275e

Browse files
committed
Add CAPI for CoverageCleaner
1 parent 3ae4912 commit cd8275e

File tree

4 files changed

+394
-2
lines changed

4 files changed

+394
-2
lines changed

capi/geos_c.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,20 @@
5252
#define GEOSGeoJSONReader geos::io::GeoJSONReader
5353
#define GEOSGeoJSONWriter geos::io::GeoJSONWriter
5454

55+
// Implementation struct for the GEOSCoverageCleanParams object
56+
typedef struct {
57+
double snappingDistance;
58+
int overlapMergeStrategy;
59+
double gapMaximumWidth;
60+
} GEOSCoverageCleanParams;
61+
5562
// Implementation struct for the GEOSMakeValidParams object
5663
typedef struct {
5764
int method;
5865
int keepCollapsed;
5966
} GEOSMakeValidParams;
6067

68+
6169
#include "geos_c.h"
6270

6371
/// Define this if you want operations triggering Exceptions to
@@ -1007,6 +1015,60 @@ extern "C" {
10071015
return GEOSMakeValidWithParams_r(handle, g, params);
10081016
}
10091017

1018+
GEOSCoverageCleanParams*
1019+
GEOSCoverageCleanParams_create()
1020+
{
1021+
return GEOSCoverageCleanParams_create_r(handle);
1022+
}
1023+
1024+
void
1025+
GEOSCoverageCleanParams_destroy(
1026+
GEOSCoverageCleanParams* params)
1027+
{
1028+
return GEOSCoverageCleanParams_destroy_r(handle, params);
1029+
}
1030+
1031+
int
1032+
GEOSCoverageCleanParams_setSnappingDistance(
1033+
GEOSCoverageCleanParams* params, double snappingDistance)
1034+
{
1035+
return GEOSCoverageCleanParams_setSnappingDistance_r(
1036+
handle, params, snappingDistance);
1037+
}
1038+
1039+
int
1040+
GEOSCoverageCleanParams_setGapMaximumWidth(
1041+
GEOSCoverageCleanParams* params, double gapMaximumWidth)
1042+
{
1043+
return GEOSCoverageCleanParams_setGapMaximumWidth_r(
1044+
handle, params, gapMaximumWidth);
1045+
}
1046+
1047+
int
1048+
GEOSCoverageCleanParams_setOverlapMergeStrategy(
1049+
GEOSCoverageCleanParams* params, int overlapMergeStrategy)
1050+
{
1051+
return GEOSCoverageCleanParams_setOverlapMergeStrategy_r(
1052+
handle, params, overlapMergeStrategy);
1053+
}
1054+
1055+
GEOSGeometry *
1056+
GEOSCoverageCleanWithParams(
1057+
const GEOSGeometry* input,
1058+
const GEOSCoverageCleanParams* params)
1059+
{
1060+
return GEOSCoverageCleanWithParams_r(
1061+
handle, input, params);
1062+
}
1063+
1064+
GEOSGeometry *
1065+
GEOSCoverageClean(
1066+
const GEOSGeometry * input)
1067+
{
1068+
return GEOSCoverageClean_r(
1069+
handle, input);
1070+
}
1071+
10101072
Geometry*
10111073
GEOSRemoveRepeatedPoints(
10121074
const Geometry* g,

capi/geos_c.h.in

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,13 @@ typedef struct GEOSSTRtree_t GEOSSTRtree;
168168
*/
169169
typedef struct GEOSBufParams_t GEOSBufferParams;
170170

171+
/**
172+
* Parameter object for coverage cleaning options.
173+
* \see GEOSCoverageCleanParams_create()
174+
* \see GEOSCoverageCleanParams_destroy()
175+
*/
176+
typedef struct GEOSCoverageCleanParams_t GEOSCoverageCleanParams;
177+
171178
/**
172179
* Parameter object for validity enforcement.
173180
* \see GEOSMakeValidParams_create()
@@ -879,6 +886,51 @@ GEOSCoverageSimplifyVW_r(
879886
double tolerance,
880887
int preserveBoundary);
881888

889+
/** \see GEOSCoverageCleanParams_create */
890+
extern GEOSCoverageCleanParams GEOS_DLL *
891+
GEOSCoverageCleanParams_create_r(
892+
GEOSContextHandle_t extHandle);
893+
894+
/** \see GEOSCoverageCleanParams_destroy */
895+
extern void GEOS_DLL
896+
GEOSCoverageCleanParams_destroy_r(
897+
GEOSContextHandle_t extHandle,
898+
GEOSCoverageCleanParams* params);
899+
900+
/** \see GEOSCoverageCleanParams_setSnappingDistance */
901+
extern int GEOS_DLL
902+
GEOSCoverageCleanParams_setSnappingDistance_r(
903+
GEOSContextHandle_t extHandle,
904+
GEOSCoverageCleanParams* params,
905+
double snappingDistance);
906+
907+
/** \see GEOSCoverageCleanParams_setGapMaximumWidth */
908+
extern int GEOS_DLL
909+
GEOSCoverageCleanParams_setGapMaximumWidth_r(
910+
GEOSContextHandle_t extHandle,
911+
GEOSCoverageCleanParams* params,
912+
double gapMaximumWidth);
913+
914+
/** \see GEOSCoverageCleanParams_setOverlapMergeStrategy */
915+
extern int GEOS_DLL
916+
GEOSCoverageCleanParams_setOverlapMergeStrategy_r(
917+
GEOSContextHandle_t extHandle,
918+
GEOSCoverageCleanParams* params,
919+
int overlapMergeStrategy);
920+
921+
/** \see GEOSCoverageCleanWithParams */
922+
extern GEOSGeometry GEOS_DLL *
923+
GEOSCoverageCleanWithParams_r(
924+
GEOSContextHandle_t extHandle,
925+
const GEOSGeometry* input,
926+
const GEOSCoverageCleanParams* params);
927+
928+
/** \see GEOSCoverageClean */
929+
extern GEOSGeometry GEOS_DLL *
930+
GEOSCoverageClean_r(
931+
GEOSContextHandle_t extHandle,
932+
const GEOSGeometry* input);
933+
882934
/* ========= Topology Operations ========= */
883935

884936
/** \see GEOSEnvelope */
@@ -4269,8 +4321,154 @@ extern GEOSGeometry GEOS_DLL * GEOSCoverageSimplifyVW(
42694321
double tolerance,
42704322
int preserveBoundary);
42714323

4324+
/**
4325+
* Create a default GEOSCoverageCleanParams object for controlling
4326+
* the way invalid polygon interactions are repaird by \ref GEOSCoverageCleanWithParams.
4327+
* \return A newly allocated GEOSCoverageCleanParams. NULL on exception.
4328+
* Caller is responsible for freeing with GEOSCoverageCleanParams_destroy().
4329+
*
4330+
* \since 3.14
4331+
*/
4332+
extern GEOSCoverageCleanParams GEOS_DLL *
4333+
GEOSCoverageCleanParams_create();
4334+
4335+
/**
4336+
* Destroy a GEOSCoverageCleanParams and free all associated memory.
4337+
* \param params The object to destroy.
4338+
*
4339+
* \since 3.14
4340+
*/
4341+
extern void GEOS_DLL
4342+
GEOSCoverageCleanParams_destroy(
4343+
GEOSCoverageCleanParams* params);
4344+
4345+
/**
4346+
* Snapping to nearby vertices and line segment snapping
4347+
* is used to improve noding robustness
4348+
* and eliminate small errors in an efficient way,
4349+
* By default this uses a very small snapping distance
4350+
* based on the extent of the input data.
4351+
* The snapping distance may be specified explicitly.
4352+
* This can reduce the number of overlaps and gaps that need to be merged,
4353+
* and reduce the risk of spikes formed by merging gaps.
4354+
* However, a large snapping distance may introduce undesirable
4355+
* data alteration.
4356+
*
4357+
* A distance of zero prevents snapping from being used.
4358+
* \see geos::coverage::CoverageCleaner::setSnappingDistance
4359+
* \param params The GEOSCoverageCleanParams to operate on
4360+
* \param snappingDistance Set to 0.0 for no snapping.
4361+
* \return 0 on exception, 1 on success.
4362+
*
4363+
* \since 3.14
4364+
*/
4365+
extern int GEOS_DLL
4366+
GEOSCoverageCleanParams_setSnappingDistance(
4367+
GEOSCoverageCleanParams *params,
4368+
double snappingDistance);
4369+
4370+
/**
4371+
* Gaps which are wider than a given distance are merged with an adjacent polygon.
4372+
* Polygon width is determined as twice the radius of the MaximumInscribedCircle
4373+
* of the gap polygon.
4374+
* Gaps are merged with the adjacent polygon with longest shared border.
4375+
* Empty holes in input polygons are treated as gaps, and may be filled in.
4376+
* Gaps which are not fully enclosed ("inlets") are not removed.
4377+
*
4378+
* The width of a gap is twice the radius of the Maximum Inscribed Circle in the gap polygon,
4379+
* A width of zero prevents gaps from being merged.
4380+
*
4381+
* \see geos::coverage::CoverageCleaner::setGapMaximumWidth
4382+
* \param params The GEOSCoverageCleanParams to operate on
4383+
* \param gapMaximumWidth Set to 0.0 for no snapping.
4384+
* \return 0 on exception, 1 on success.
4385+
*
4386+
* \since 3.14
4387+
*/
4388+
extern int GEOS_DLL
4389+
GEOSCoverageCleanParams_setGapMaximumWidth(
4390+
GEOSCoverageCleanParams* params,
4391+
double gapMaximumWidth);
4392+
4393+
/**
4394+
* Overlap repair strategies.
4395+
* \see GEOSCoverageCleanParams_setOverlapMergeStrategy
4396+
*/
4397+
enum GEOSOverlapMerge {
4398+
/** Merge strategy that chooses polygon with longest common border */
4399+
GEOS_MERGE_LONGEST_BORDER = 0,
4400+
/** Merge strategy that chooses polygon with maximum area */
4401+
GEOS_MERGE_MAX_AREA = 1,
4402+
/** Merge strategy that chooses polygon with minimum area */
4403+
GEOS_MERGE_MIN_AREA = 2,
4404+
/** Merge strategy that chooses polygon with smallest input index */
4405+
GEOS_MERGE_MIN_INDEX = 3
4406+
};
4407+
4408+
/*
4409+
* Sets the overlap merge strategy to use, using one from \ref GEOSOverlapMerge.
4410+
* Overlaps are merged with an adjacent polygon chosen according to a specified merge strategy.
4411+
* The supported strategies are:
4412+
*
4413+
* * **Longest Border**: (default) merge with the polygon with longest shared border (GEOS_MERGE_LONGEST_BORDER.)
4414+
* * **Maximum/Minimum Area**: merge with the polygon with largest or smallest area (GEOS_MERGE_MAX_AREA, GEOS_MERGE_MIN_AREA.)
4415+
* * **Minimum Index**: merge with the polygon with the lowest index in the input array (GEOS_MERGE_MIN_INDEX.)
4416+
*
4417+
* This allows sorting the input according to some criteria to provide a priority
4418+
* for merging gaps.
4419+
*
4420+
* The default is GEOS_MERGE_LONGEST_BORDER.
4421+
*
4422+
* \see geos::coverage::CoverageCleaner::setGapMaximumWidth
4423+
* \param params The GEOSCoverageCleanParams to operate on
4424+
* \param overlapMergeStrategy One of \ref GEOSOverlapMerge strategies
4425+
* \return 0 on exception, 1 on success.
4426+
*
4427+
* \since 3.14
4428+
*/
4429+
extern int GEOS_DLL
4430+
GEOSCoverageCleanParams_setOverlapMergeStrategy(
4431+
GEOSCoverageCleanParams* params,
4432+
int overlapMergeStrategy);
4433+
4434+
/**
4435+
* Operates on a list of polygonal geometry with "exactly matching"
4436+
* edge geometry, to fix cases where the geometry does not in fact
4437+
* exactly match.
4438+
*
4439+
* The input is a collection of polygons, and the output is a collection
4440+
* with the same number of cleaned polygons, in the same order as
4441+
* the input. Polygons that have collapsed during cleaning will be returned
4442+
* as empties.
4443+
*
4444+
* \param input The dirty polygonal coverage,
4445+
* stored in a geometry collection. All members must be POLYGON
4446+
* or MULTIPOLYGON.
4447+
* \param params A GEOSCoverageCleanParams to control the options
4448+
* used in cleaning the coverage.
4449+
* \return A collection containing the cleaned geometries, or null
4450+
* on error. Where cleaning has resulted in polygon collapse,
4451+
* an EMPTY geometry will be returned as part of the collection.
4452+
*
4453+
* \since 3.14
4454+
*/
4455+
extern GEOSGeometry GEOS_DLL *
4456+
GEOSCoverageCleanWithParams(
4457+
const GEOSGeometry* input,
4458+
const GEOSCoverageCleanParams* params
4459+
);
4460+
4461+
/** \see GEOSCoverageCleanWithParams */
4462+
extern GEOSGeometry GEOS_DLL *
4463+
GEOSCoverageClean(
4464+
const GEOSGeometry* input);
4465+
4466+
4467+
4468+
42724469
///@}
42734470

4471+
42744472
/* ========== Construction Operations ========== */
42754473
/** @name Geometric Constructions
42764474
* Functions for computing geometric constructions.

0 commit comments

Comments
 (0)