Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CAPI for coverage operations #866

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
57 changes: 57 additions & 0 deletions capi/geos_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#define GEOSWKBWriter geos::io::WKBWriter
#define GEOSGeoJSONReader geos::io::GeoJSONReader
#define GEOSGeoJSONWriter geos::io::GeoJSONWriter
#define GEOSGeometryList std::vector<geos::geom::Geometry*>
typedef struct GEOSBufParams_t GEOSBufferParams;
typedef struct GEOSMakeValidParams_t GEOSMakeValidParams;

Expand Down Expand Up @@ -1794,4 +1795,60 @@ extern "C" {
cx, cy);
}

GEOSGeometryList*
GEOSGeometryList_create()
{
return GEOSGeometryList_create_r(handle);
}

int
GEOSGeometryList_destroy(GEOSGeometryList* list)
{
return GEOSGeometryList_destroy_r(handle, list);
}

int
GEOSGeometryList_release(GEOSGeometryList* list)
{
return GEOSGeometryList_release_r(handle, list);
}

int
GEOSGeometryList_push(GEOSGeometryList* list, Geometry* g)
{
return GEOSGeometryList_push_r(handle, list, g);
}

Geometry*
GEOSGeometryList_pop(GEOSGeometryList* list)
{
return GEOSGeometryList_pop_r(handle, list);
}

int
GEOSGeometryList_size(GEOSGeometryList* list)
{
return GEOSGeometryList_size_r(handle, list);
}

Geometry*
GEOSGeometryList_at(GEOSGeometryList* list, unsigned int i)
{
return GEOSGeometryList_at_r(handle, list, i);
}

GEOSGeometryList*
GEOSCoverage_valid(GEOSGeometryList* list)
{
return GEOSCoverage_valid_r(handle, list);
}

GEOSGeometryList*
GEOSCoverage_simplify(GEOSGeometryList* list, double tolerance)
{
return GEOSCoverage_simplify_r(handle, list, tolerance);
}



} /* extern "C" */
177 changes: 177 additions & 0 deletions capi/geos_c.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,14 @@ typedef struct GEOSBufParams_t GEOSBufferParams;
*/
typedef struct GEOSMakeValidParams_t GEOSMakeValidParams;

/**
* Utility object to hold GEOSGeometry pointers
* \see GEOSGeometryList_create()
* \see GEOSGeometryList_destroy()
*/
typedef struct GEOSGeometryList_t GEOSGeometryList;


#endif

/** \cond */
Expand Down Expand Up @@ -747,6 +755,63 @@ extern GEOSGeometry GEOS_DLL *GEOSGeom_clone_r(
GEOSContextHandle_t handle,
const GEOSGeometry* g);

/* ========= Geometry Lists ========= */
/** \see GEOSGeometryList_create */
extern GEOSGeometryList GEOS_DLL *
GEOSGeometryList_create_r(
GEOSContextHandle_t handle);

/** \see GEOSGeometryList_destroy */
extern int GEOS_DLL
GEOSGeometryList_destroy_r(
GEOSContextHandle_t handle,
GEOSGeometryList* list);

/** \see GEOSGeometryList_release */
extern int GEOS_DLL
GEOSGeometryList_release_r(
GEOSContextHandle_t handle,
GEOSGeometryList* list);

/** \see GEOSGeometryList_push */
extern int GEOS_DLL
GEOSGeometryList_push_r(
GEOSContextHandle_t extHandle,
GEOSGeometryList* list,
GEOSGeometry* g);

/** \see GEOSGeometryList_pop */
extern GEOSGeometry GEOS_DLL *
GEOSGeometryList_pop_r(
GEOSContextHandle_t extHandle,
GEOSGeometryList* list);

/** \see GEOSGeometryList_size */
extern int GEOS_DLL
GEOSGeometryList_size_r(
GEOSContextHandle_t extHandle,
GEOSGeometryList* list);

/** \see GEOSGeometryList_at */
extern GEOSGeometry GEOS_DLL *
GEOSGeometryList_at_r(
GEOSContextHandle_t extHandle,
GEOSGeometryList* list,
unsigned int i);

/* ========= Coverage ========= */

extern GEOSGeometryList GEOS_DLL *
GEOSCoverage_valid_r(
GEOSContextHandle_t extHandle,
GEOSGeometryList* list);

extern GEOSGeometryList GEOS_DLL *
GEOSCoverage_simplify_r(
GEOSContextHandle_t extHandle,
GEOSGeometryList* list,
double tolerance);

/* ========= Memory management ========= */

/** \see GEOSGeom_destroy */
Expand Down Expand Up @@ -2431,6 +2496,118 @@ extern void GEOS_DLL GEOSGeom_destroy(GEOSGeometry* g);

///@}


/* ====================================================================== */
/** @name Geometry Lists
* Functions to manipulate geometry lists.
*/
///@{

/**
* Creates an empty geometry list container. The geometry
* list is a utility return type for some functions, and the input
* type for some functions.
* \return An empty geometry list.
* Caller must free with GEOSGeometryList_destroy() or GEOSGeometryList_release.
* NULL on exception.
*/
extern GEOSGeometryList GEOS_DLL * GEOSGeometryList_create();

/**
* Free all geometries in the list and then free the list itself.
* \param list The geometry list to be destroyed.
* \return 1 on success, 0 on failure
*/
extern int GEOS_DLL GEOSGeometryList_destroy(GEOSGeometryList* list);

/**
* Release only the memory associated with a geometry list container,
* leaving the contained geometries untouched.
* \param list The geometry list to be released.
* \return 1 on success, 0 on failure
*/
extern int GEOS_DLL GEOSGeometryList_release(GEOSGeometryList* list);

/**
* Add a geometry to the end of list, or do nothing
* if the list or the geometry are null.
* \param list The geometry list to add the geometry to.
* \param g The geometry to be added.
* \return 1 on success, 0 on failure
*/
extern int GEOS_DLL
GEOSGeometryList_push(
GEOSGeometryList* list,
GEOSGeometry* g);

/**
* Return the geometry currently at the end of the list
* and remove it from the list.
* \param list The geometry list to access.
* \return The last geometry in the list.
*/
extern GEOSGeometry GEOS_DLL *
GEOSGeometryList_pop(
GEOSGeometryList* list);

/**
* Return the length of the list or -1 on error.
* \param list The geometry list to access.
* \return The list length or -1 on error.
*/
extern int GEOS_DLL
GEOSGeometryList_size(
GEOSGeometryList* list);

/**
* Return the geometry at an location in the list.
* \param list The geometry list to access.
* \param i The index of the geometry to access.
* \return The geometry at index location or null on error.
*/
extern GEOSGeometry GEOS_DLL *
GEOSGeometryList_at(
GEOSGeometryList* list,
unsigned int i);

///@}


/* ====================================================================== */
/** @name Coverages
* Functions to work with coverages represented by lists of polygons
* that exactly share edge geometry.
*/
///@{

/**
* Analyze a coverage (represented as a list of polygonal geometry
* with exactly matching edge geometry) to find places where the
* assumption of exactly matching edges is not met.
* \param list The coverage to access, stored in a geometry list.
* \return A geometry list with exactly the same length as the input,
* where each entry shows the location of invalidity for that
* input polygon.
*/
extern GEOSGeometryList GEOS_DLL * GEOSCoverage_valid(
GEOSGeometryList* list);

/**
* Operates on a coverage (represented as a list of polygonal geometry
* with exactly matching edge geometry) to apply a Visvalingam–Whyatt
* simplification to the edges, reducing complexity in proportion with
* the provided tolerance, while retaining a valid coverage (no edges
* will cross or touch after the simplification).
* \param list The geometry list to simplify.
* \param tolerance A tolerance parameter in linear units.
* \return A list containing the simplified geometries in a valid coverage.
*/
extern GEOSGeometryList GEOS_DLL * GEOSCoverage_simplify(
GEOSGeometryList* list, double tolerance);


///@}

/* ========== Geometry info ========== */
/** @name Geometry Accessors
* Functions to provide information about geometries.
Expand Down