geos/capi/geos_c.cpp

1477 строки
35 KiB
C++

/************************************************************************
*
*
* C-Wrapper for GEOS library
*
* Copyright (C) 2010 2011 Sandro Santilli <strk@kbt.io>
* Copyright (C) 2005-2006 Refractions Research Inc.
*
* This is free software; you can redistribute and/or modify it under
* the terms of the GNU Lesser General Public Licence as published
* by the Free Software Foundation.
* See the COPYING file for more information.
*
* Author: Sandro Santilli <strk@kbt.io>
*
***********************************************************************/
#include <geos/geom/prep/PreparedGeometryFactory.h>
#include <geos/index/strtree/STRtree.h>
#include <geos/io/WKTReader.h>
#include <geos/io/WKBReader.h>
#include <geos/io/WKTWriter.h>
#include <geos/io/WKBWriter.h>
#include <geos/operation/overlay/OverlayOp.h>
#include <geos/operation/union/CascadedPolygonUnion.h>
#include <geos/algorithm/distance/DiscreteHausdorffDistance.h>
#include <geos/algorithm/distance/DiscreteFrechetDistance.h>
#include <geos/util/Interrupt.h>
#include <stdexcept>
#include <new>
#ifdef _MSC_VER
#pragma warning(disable : 4099)
#endif
// Some extra magic to make type declarations in geos_c.h work - for cross-checking of types in header.
#define GEOSGeometry geos::geom::Geometry
#define GEOSPreparedGeometry geos::geom::prep::PreparedGeometry
#define GEOSCoordSequence geos::geom::CoordinateSequence
#define GEOSSTRtree geos::index::strtree::STRtree
#define GEOSWKTReader_t geos::io::WKTReader
#define GEOSWKTWriter_t geos::io::WKTWriter
#define GEOSWKBReader_t geos::io::WKBReader
#define GEOSWKBWriter_t geos::io::WKBWriter
typedef struct GEOSBufParams_t GEOSBufferParams;
#include "geos_c.h"
/// Define this if you want operations triggering Exceptions to
/// be printed (will use the NOTIFY channel - only implemented for GEOSUnion so far)
///
#undef VERBOSE_EXCEPTIONS
#include <geos/export.h>
/*
#if defined(_MSC_VER)
# define GEOS_DLL __declspec(dllexport)
#else
# define GEOS_DLL
#endif
*/
// import the most frequently used definitions globally
using geos::geom::Geometry;
using geos::geom::LineString;
using geos::geom::Polygon;
using geos::geom::CoordinateSequence;
using geos::geom::GeometryFactory;
using geos::io::WKTReader;
using geos::io::WKTWriter;
using geos::io::WKBReader;
using geos::io::WKBWriter;
using geos::index::strtree::STRtree;
using geos::operation::overlay::OverlayOp;
using geos::operation::overlay::overlayOp;
using geos::operation::geounion::CascadedPolygonUnion;
typedef std::unique_ptr<Geometry> GeomPtr;
//## GLOBALS ################################################
// NOTE: SRID will have to be changed after geometry creation
GEOSContextHandle_t handle = NULL;
extern "C" {
void
initGEOS(GEOSMessageHandler nf, GEOSMessageHandler ef)
{
if(! handle) {
handle = initGEOS_r(nf, ef);
}
else {
GEOSContext_setNoticeHandler_r(handle, nf);
GEOSContext_setErrorHandler_r(handle, ef);
}
geos::util::Interrupt::cancel();
}
void
finishGEOS()
{
if(handle != NULL) {
finishGEOS_r(handle);
handle = NULL;
}
}
GEOSInterruptCallback*
GEOS_interruptRegisterCallback(GEOSInterruptCallback* cb)
{
return geos::util::Interrupt::registerCallback(cb);
}
void
GEOS_interruptRequest()
{
geos::util::Interrupt::request();
}
void
GEOS_interruptCancel()
{
geos::util::Interrupt::cancel();
}
void
GEOSFree(void* buffer)
{
GEOSFree_r(handle, buffer);
}
/****************************************************************
** relate()-related functions
** return 0 = false, 1 = true, 2 = error occured
**
*/
char
GEOSDisjoint(const Geometry* g1, const Geometry* g2)
{
return GEOSDisjoint_r(handle, g1, g2);
}
char
GEOSTouches(const Geometry* g1, const Geometry* g2)
{
return GEOSTouches_r(handle, g1, g2);
}
char
GEOSIntersects(const Geometry* g1, const Geometry* g2)
{
return GEOSIntersects_r(handle, g1, g2);
}
char
GEOSCrosses(const Geometry* g1, const Geometry* g2)
{
return GEOSCrosses_r(handle, g1, g2);
}
char
GEOSWithin(const Geometry* g1, const Geometry* g2)
{
return GEOSWithin_r(handle, g1, g2);
}
// call g1->contains(g2)
// returns 0 = false
// 1 = true
// 2 = error was trapped
char
GEOSContains(const Geometry* g1, const Geometry* g2)
{
return GEOSContains_r(handle, g1, g2);
}
char
GEOSOverlaps(const Geometry* g1, const Geometry* g2)
{
return GEOSOverlaps_r(handle, g1, g2);
}
char
GEOSCovers(const Geometry* g1, const Geometry* g2)
{
return GEOSCovers_r(handle, g1, g2);
}
char
GEOSCoveredBy(const Geometry* g1, const Geometry* g2)
{
return GEOSCoveredBy_r(handle, g1, g2);
}
//-------------------------------------------------------------------
// low-level relate functions
//------------------------------------------------------------------
char
GEOSRelatePattern(const Geometry* g1, const Geometry* g2, const char* pat)
{
return GEOSRelatePattern_r(handle, g1, g2, pat);
}
char
GEOSRelatePatternMatch(const char* mat, const char* pat)
{
return GEOSRelatePatternMatch_r(handle, mat, pat);
}
char*
GEOSRelate(const Geometry* g1, const Geometry* g2)
{
return GEOSRelate_r(handle, g1, g2);
}
char*
GEOSRelateBoundaryNodeRule(const Geometry* g1, const Geometry* g2, int bnr)
{
return GEOSRelateBoundaryNodeRule_r(handle, g1, g2, bnr);
}
//-----------------------------------------------------------------
// isValid
//-----------------------------------------------------------------
char
GEOSisValid(const Geometry* g)
{
return GEOSisValid_r(handle, g);
}
char*
GEOSisValidReason(const Geometry* g)
{
return GEOSisValidReason_r(handle, g);
}
char
GEOSisValidDetail(const Geometry* g, int flags,
char** reason, Geometry** location)
{
return GEOSisValidDetail_r(handle, g, flags, reason, location);
}
//-----------------------------------------------------------------
// general purpose
//-----------------------------------------------------------------
char
GEOSEquals(const Geometry* g1, const Geometry* g2)
{
return GEOSEquals_r(handle, g1, g2);
}
char
GEOSEqualsExact(const Geometry* g1, const Geometry* g2, double tolerance)
{
return GEOSEqualsExact_r(handle, g1, g2, tolerance);
}
int
GEOSDistance(const Geometry* g1, const Geometry* g2, double* dist)
{
return GEOSDistance_r(handle, g1, g2, dist);
}
int
GEOSDistanceIndexed(const Geometry* g1, const Geometry* g2, double* dist)
{
return GEOSDistanceIndexed_r(handle, g1, g2, dist);
}
int
GEOSHausdorffDistance(const Geometry* g1, const Geometry* g2, double* dist)
{
return GEOSHausdorffDistance_r(handle, g1, g2, dist);
}
int
GEOSHausdorffDistanceDensify(const Geometry* g1, const Geometry* g2, double densifyFrac, double* dist)
{
return GEOSHausdorffDistanceDensify_r(handle, g1, g2, densifyFrac, dist);
}
int
GEOSFrechetDistance(const Geometry* g1, const Geometry* g2, double* dist)
{
return GEOSFrechetDistance_r(handle, g1, g2, dist);
}
int
GEOSFrechetDistanceDensify(const Geometry* g1, const Geometry* g2, double densifyFrac, double* dist)
{
return GEOSFrechetDistanceDensify_r(handle, g1, g2, densifyFrac, dist);
}
int
GEOSArea(const Geometry* g, double* area)
{
return GEOSArea_r(handle, g, area);
}
int
GEOSLength(const Geometry* g, double* length)
{
return GEOSLength_r(handle, g, length);
}
CoordinateSequence*
GEOSNearestPoints(const Geometry* g1, const Geometry* g2)
{
return GEOSNearestPoints_r(handle, g1, g2);
}
Geometry*
GEOSGeomFromWKT(const char* wkt)
{
return GEOSGeomFromWKT_r(handle, wkt);
}
char*
GEOSGeomToWKT(const Geometry* g)
{
return GEOSGeomToWKT_r(handle, g);
}
// Remember to free the result!
unsigned char*
GEOSGeomToWKB_buf(const Geometry* g, size_t* size)
{
return GEOSGeomToWKB_buf_r(handle, g, size);
}
Geometry*
GEOSGeomFromWKB_buf(const unsigned char* wkb, size_t size)
{
return GEOSGeomFromWKB_buf_r(handle, wkb, size);
}
/* Read/write wkb hex values. Returned geometries are
owned by the caller.*/
unsigned char*
GEOSGeomToHEX_buf(const Geometry* g, size_t* size)
{
return GEOSGeomToHEX_buf_r(handle, g, size);
}
Geometry*
GEOSGeomFromHEX_buf(const unsigned char* hex, size_t size)
{
return GEOSGeomFromHEX_buf_r(handle, hex, size);
}
char
GEOSisEmpty(const Geometry* g)
{
return GEOSisEmpty_r(handle, g);
}
char
GEOSisSimple(const Geometry* g)
{
return GEOSisSimple_r(handle, g);
}
char
GEOSisRing(const Geometry* g)
{
return GEOSisRing_r(handle, g);
}
//free the result of this
char*
GEOSGeomType(const Geometry* g)
{
return GEOSGeomType_r(handle, g);
}
// Return postgis geometry type index
int
GEOSGeomTypeId(const Geometry* g)
{
return GEOSGeomTypeId_r(handle, g);
}
//-------------------------------------------------------------------
// GEOS functions that return geometries
//-------------------------------------------------------------------
Geometry*
GEOSEnvelope(const Geometry* g)
{
return GEOSEnvelope_r(handle, g);
}
Geometry*
GEOSIntersection(const Geometry* g1, const Geometry* g2)
{
return GEOSIntersection_r(handle, g1, g2);
}
Geometry*
GEOSBuffer(const Geometry* g, double width, int quadrantsegments)
{
return GEOSBuffer_r(handle, g, width, quadrantsegments);
}
Geometry*
GEOSBufferWithStyle(const Geometry* g, double width, int quadsegs,
int endCapStyle, int joinStyle, double mitreLimit)
{
return GEOSBufferWithStyle_r(handle, g, width, quadsegs, endCapStyle,
joinStyle, mitreLimit);
}
Geometry*
GEOSSingleSidedBuffer(const Geometry* g, double width, int quadsegs,
int joinStyle, double mitreLimit, int leftSide)
{
return GEOSSingleSidedBuffer_r(handle, g, width, quadsegs,
joinStyle, mitreLimit, leftSide);
}
Geometry*
GEOSOffsetCurve(const Geometry* g, double width, int quadsegs,
int joinStyle, double mitreLimit)
{
return GEOSOffsetCurve_r(handle, g, width, quadsegs,
joinStyle, mitreLimit);
}
Geometry*
GEOSConvexHull(const Geometry* g)
{
return GEOSConvexHull_r(handle, g);
}
Geometry*
GEOSMinimumRotatedRectangle(const Geometry* g)
{
return GEOSMinimumRotatedRectangle_r(handle, g);
}
Geometry*
GEOSMinimumWidth(const Geometry* g)
{
return GEOSMinimumWidth_r(handle, g);
}
Geometry*
GEOSMinimumClearanceLine(const Geometry* g)
{
return GEOSMinimumClearanceLine_r(handle, g);
}
int
GEOSMinimumClearance(const Geometry* g, double* d)
{
return GEOSMinimumClearance_r(handle, g, d);
}
Geometry*
GEOSDifference(const Geometry* g1, const Geometry* g2)
{
return GEOSDifference_r(handle, g1, g2);
}
Geometry*
GEOSBoundary(const Geometry* g)
{
return GEOSBoundary_r(handle, g);
}
Geometry*
GEOSSymDifference(const Geometry* g1, const Geometry* g2)
{
return GEOSSymDifference_r(handle, g1, g2);
}
Geometry*
GEOSUnion(const Geometry* g1, const Geometry* g2)
{
return GEOSUnion_r(handle, g1, g2);
}
Geometry*
GEOSUnaryUnion(const Geometry* g)
{
return GEOSUnaryUnion_r(handle, g);
}
Geometry*
GEOSCoverageUnion(const Geometry* g)
{
return GEOSCoverageUnion_r(handle, g);
}
Geometry*
GEOSNode(const Geometry* g)
{
return GEOSNode_r(handle, g);
}
Geometry*
GEOSUnionCascaded(const Geometry* g)
{
return GEOSUnionCascaded_r(handle, g);
}
Geometry*
GEOSPointOnSurface(const Geometry* g)
{
return GEOSPointOnSurface_r(handle, g);
}
Geometry*
GEOSClipByRect(const Geometry* g, double xmin, double ymin, double xmax, double ymax)
{
return GEOSClipByRect_r(handle, g, xmin, ymin, xmax, ymax);
}
//-------------------------------------------------------------------
// memory management functions
//------------------------------------------------------------------
void
GEOSGeom_destroy(Geometry* a)
{
return GEOSGeom_destroy_r(handle, a);
}
int
GEOSGetNumCoordinates(const Geometry* g)
{
return GEOSGetNumCoordinates_r(handle, g);
}
/*
* Return -1 on exception, 0 otherwise.
* Converts Geometry to normal form (or canonical form).
*/
int
GEOSNormalize(Geometry* g)
{
return GEOSNormalize_r(handle, g);
}
int
GEOSGetNumInteriorRings(const Geometry* g)
{
return GEOSGetNumInteriorRings_r(handle, g);
}
// returns -1 on error and 1 for non-multi geometries
int
GEOSGetNumGeometries(const Geometry* g)
{
return GEOSGetNumGeometries_r(handle, g);
}
/*
* Call only on GEOMETRYCOLLECTION or MULTI*.
* Return a pointer to the internal Geometry.
*/
const Geometry*
GEOSGetGeometryN(const Geometry* g, int n)
{
return GEOSGetGeometryN_r(handle, g, n);
}
/*
* Call only on LINESTRING
* Returns NULL on exception
*/
Geometry*
GEOSGeomGetPointN(const Geometry* g, int n)
{
return GEOSGeomGetPointN_r(handle, g, n);
}
/*
* Call only on LINESTRING
*/
Geometry*
GEOSGeomGetStartPoint(const Geometry* g)
{
return GEOSGeomGetStartPoint_r(handle, g);
}
/*
* Call only on LINESTRING
*/
Geometry*
GEOSGeomGetEndPoint(const Geometry* g)
{
return GEOSGeomGetEndPoint_r(handle, g);
}
/*
* Call only on LINESTRING
* return 2 on exception, 1 on true, 0 on false
*/
char
GEOSisClosed(const Geometry* g)
{
return GEOSisClosed_r(handle, g);
}
/*
* Call only on LINESTRING
* returns 0 on exception, otherwise 1
*/
int
GEOSGeomGetLength(const Geometry* g, double* length)
{
return GEOSGeomGetLength_r(handle, g, length);
}
/*
* Call only on LINESTRING
* returns -1 on exception
*/
int
GEOSGeomGetNumPoints(const Geometry* g)
{
return GEOSGeomGetNumPoints_r(handle, g);
}
/*
* For POINT
* returns 0 on exception, otherwise 1
*/
int
GEOSGeomGetX(const Geometry* g, double* x)
{
return GEOSGeomGetX_r(handle, g, x);
}
/*
* For POINT
* returns 0 on exception, otherwise 1
*/
int
GEOSGeomGetY(const Geometry* g, double* y)
{
return GEOSGeomGetY_r(handle, g, y);
}
/*
* For POINT
* returns 0 on exception, otherwise 1
*/
int
GEOSGeomGetZ(const Geometry* g1, double* z)
{
return GEOSGeomGetZ_r(handle, g1, z);
}
/*
* Call only on polygon
* Return a copy of the internal Geometry.
*/
const Geometry*
GEOSGetExteriorRing(const Geometry* g)
{
return GEOSGetExteriorRing_r(handle, g);
}
/*
* Call only on polygon
* Return a pointer to internal storage, do not destroy it.
*/
const Geometry*
GEOSGetInteriorRingN(const Geometry* g, int n)
{
return GEOSGetInteriorRingN_r(handle, g, n);
}
Geometry*
GEOSGetCentroid(const Geometry* g)
{
return GEOSGetCentroid_r(handle, g);
}
Geometry*
GEOSMinimumBoundingCircle(const Geometry* g, double* radius, Geometry** center)
{
return GEOSMinimumBoundingCircle_r(handle, g, radius, center);
}
Geometry*
GEOSGeom_createCollection(int type, Geometry** geoms, unsigned int ngeoms)
{
return GEOSGeom_createCollection_r(handle, type, geoms, ngeoms);
}
Geometry*
GEOSPolygonize(const Geometry* const* g, unsigned int ngeoms)
{
return GEOSPolygonize_r(handle, g, ngeoms);
}
Geometry*
GEOSPolygonize_valid(const Geometry* const* g, unsigned int ngeoms)
{
return GEOSPolygonize_valid_r(handle, g, ngeoms);
}
Geometry*
GEOSPolygonizer_getCutEdges(const Geometry* const* g, unsigned int ngeoms)
{
return GEOSPolygonizer_getCutEdges_r(handle, g, ngeoms);
}
GEOSGeometry*
GEOSPolygonize_full(const GEOSGeometry* input,
GEOSGeometry** cuts, GEOSGeometry** dangles, GEOSGeometry** invalid)
{
return GEOSPolygonize_full_r(handle, input, cuts, dangles, invalid);
}
Geometry*
GEOSBuildArea(const Geometry* g)
{
return GEOSBuildArea_r(handle, g);
}
Geometry*
GEOSMakeValid(const Geometry* g)
{
return GEOSMakeValid_r(handle, g);
}
Geometry*
GEOSLineMerge(const Geometry* g)
{
return GEOSLineMerge_r(handle, g);
}
Geometry*
GEOSReverse(const Geometry* g)
{
return GEOSReverse_r(handle, g);
}
int
GEOSGetSRID(const Geometry* g)
{
return GEOSGetSRID_r(handle, g);
}
void
GEOSSetSRID(Geometry* g, int srid)
{
return GEOSSetSRID_r(handle, g, srid);
}
void*
GEOSGeom_getUserData(const Geometry* g)
{
return GEOSGeom_getUserData_r(handle, g);
}
void
GEOSGeom_setUserData(Geometry* g, void* userData)
{
return GEOSGeom_setUserData_r(handle, g, userData);
}
char
GEOSHasZ(const Geometry* g)
{
return GEOSHasZ_r(handle, g);
}
int
GEOS_getWKBOutputDims()
{
return GEOS_getWKBOutputDims_r(handle);
}
int
GEOS_setWKBOutputDims(int newdims)
{
return GEOS_setWKBOutputDims_r(handle, newdims);
}
int
GEOS_getWKBByteOrder()
{
return GEOS_getWKBByteOrder_r(handle);
}
int
GEOS_setWKBByteOrder(int byteOrder)
{
return GEOS_setWKBByteOrder_r(handle, byteOrder);
}
CoordinateSequence*
GEOSCoordSeq_create(unsigned int size, unsigned int dims)
{
return GEOSCoordSeq_create_r(handle, size, dims);
}
int
GEOSCoordSeq_setOrdinate(CoordinateSequence* s, unsigned int idx, unsigned int dim, double val)
{
return GEOSCoordSeq_setOrdinate_r(handle, s, idx, dim, val);
}
int
GEOSCoordSeq_setX(CoordinateSequence* s, unsigned int idx, double val)
{
return GEOSCoordSeq_setOrdinate(s, idx, 0, val);
}
int
GEOSCoordSeq_setY(CoordinateSequence* s, unsigned int idx, double val)
{
return GEOSCoordSeq_setOrdinate(s, idx, 1, val);
}
int
GEOSCoordSeq_setZ(CoordinateSequence* s, unsigned int idx, double val)
{
return GEOSCoordSeq_setOrdinate(s, idx, 2, val);
}
int
GEOSCoordSeq_setXY(CoordinateSequence* s, unsigned int idx, double x, double y)
{
return GEOSCoordSeq_setXY_r(handle, s, idx, x, y);
}
int
GEOSCoordSeq_setXYZ(CoordinateSequence* s, unsigned int idx, double x, double y, double z)
{
return GEOSCoordSeq_setXYZ_r(handle, s, idx, x, y, z);
}
CoordinateSequence*
GEOSCoordSeq_clone(const CoordinateSequence* s)
{
return GEOSCoordSeq_clone_r(handle, s);
}
int
GEOSCoordSeq_getOrdinate(const CoordinateSequence* s, unsigned int idx, unsigned int dim, double* val)
{
return GEOSCoordSeq_getOrdinate_r(handle, s, idx, dim, val);
}
int
GEOSCoordSeq_getX(const CoordinateSequence* s, unsigned int idx, double* val)
{
return GEOSCoordSeq_getOrdinate(s, idx, 0, val);
}
int
GEOSCoordSeq_getY(const CoordinateSequence* s, unsigned int idx, double* val)
{
return GEOSCoordSeq_getOrdinate(s, idx, 1, val);
}
int
GEOSCoordSeq_getZ(const CoordinateSequence* s, unsigned int idx, double* val)
{
return GEOSCoordSeq_getOrdinate(s, idx, 2, val);
}
int
GEOSCoordSeq_getXY(const CoordinateSequence* s, unsigned int idx, double* x, double* y)
{
return GEOSCoordSeq_getXY_r(handle, s, idx, x, y);
}
int
GEOSCoordSeq_getXYZ(const CoordinateSequence* s, unsigned int idx, double* x, double* y, double* z)
{
return GEOSCoordSeq_getXYZ_r(handle, s, idx, x, y, z);
}
int
GEOSCoordSeq_getSize(const CoordinateSequence* s, unsigned int* size)
{
return GEOSCoordSeq_getSize_r(handle, s, size);
}
int
GEOSCoordSeq_getDimensions(const CoordinateSequence* s, unsigned int* dims)
{
return GEOSCoordSeq_getDimensions_r(handle, s, dims);
}
int
GEOSCoordSeq_isCCW(const CoordinateSequence* s, char* is_ccw)
{
return GEOSCoordSeq_isCCW_r(handle, s, is_ccw);
}
void
GEOSCoordSeq_destroy(CoordinateSequence* s)
{
return GEOSCoordSeq_destroy_r(handle, s);
}
const CoordinateSequence*
GEOSGeom_getCoordSeq(const Geometry* g)
{
return GEOSGeom_getCoordSeq_r(handle, g);
}
Geometry*
GEOSGeom_createPoint(CoordinateSequence* cs)
{
return GEOSGeom_createPoint_r(handle, cs);
}
Geometry*
GEOSGeom_createPointFromXY(double x, double y)
{
return GEOSGeom_createPointFromXY_r(handle, x, y);
}
Geometry*
GEOSGeom_createLinearRing(CoordinateSequence* cs)
{
return GEOSGeom_createLinearRing_r(handle, cs);
}
Geometry*
GEOSGeom_createLineString(CoordinateSequence* cs)
{
return GEOSGeom_createLineString_r(handle, cs);
}
Geometry*
GEOSGeom_createPolygon(Geometry* shell, Geometry** holes, unsigned int nholes)
{
return GEOSGeom_createPolygon_r(handle, shell, holes, nholes);
}
Geometry*
GEOSGeom_clone(const Geometry* g)
{
return GEOSGeom_clone_r(handle, g);
}
GEOSGeometry*
GEOSGeom_setPrecision(const GEOSGeometry* g, double gridSize, int flags)
{
return GEOSGeom_setPrecision_r(handle, g, gridSize, flags);
}
double
GEOSGeom_getPrecision(const GEOSGeometry* g)
{
return GEOSGeom_getPrecision_r(handle, g);
}
int
GEOSGeom_getDimensions(const Geometry* g)
{
return GEOSGeom_getDimensions_r(handle, g);
}
int
GEOSGeom_getCoordinateDimension(const Geometry* g)
{
return GEOSGeom_getCoordinateDimension_r(handle, g);
}
int GEOS_DLL GEOSGeom_getXMin(const GEOSGeometry* g, double* value)
{
return GEOSGeom_getXMin_r(handle, g, value);
}
int GEOS_DLL GEOSGeom_getYMin(const GEOSGeometry* g, double* value)
{
return GEOSGeom_getYMin_r(handle, g, value);
}
int GEOS_DLL GEOSGeom_getXMax(const GEOSGeometry* g, double* value)
{
return GEOSGeom_getXMax_r(handle, g, value);
}
int GEOS_DLL GEOSGeom_getYMax(const GEOSGeometry* g, double* value)
{
return GEOSGeom_getYMax_r(handle, g, value);
}
Geometry*
GEOSSimplify(const Geometry* g, double tolerance)
{
return GEOSSimplify_r(handle, g, tolerance);
}
Geometry*
GEOSTopologyPreserveSimplify(const Geometry* g, double tolerance)
{
return GEOSTopologyPreserveSimplify_r(handle, g, tolerance);
}
/* WKT Reader */
WKTReader*
GEOSWKTReader_create()
{
return GEOSWKTReader_create_r(handle);
}
void
GEOSWKTReader_destroy(WKTReader* reader)
{
GEOSWKTReader_destroy_r(handle, reader);
}
Geometry*
GEOSWKTReader_read(WKTReader* reader, const char* wkt)
{
return GEOSWKTReader_read_r(handle, reader, wkt);
}
/* WKT Writer */
WKTWriter*
GEOSWKTWriter_create()
{
return GEOSWKTWriter_create_r(handle);
}
void
GEOSWKTWriter_destroy(WKTWriter* Writer)
{
GEOSWKTWriter_destroy_r(handle, Writer);
}
char*
GEOSWKTWriter_write(WKTWriter* writer, const Geometry* geom)
{
return GEOSWKTWriter_write_r(handle, writer, geom);
}
void
GEOSWKTWriter_setTrim(WKTWriter* writer, char trim)
{
GEOSWKTWriter_setTrim_r(handle, writer, trim);
}
void
GEOSWKTWriter_setRoundingPrecision(WKTWriter* writer, int precision)
{
return GEOSWKTWriter_setRoundingPrecision_r(handle, writer, precision);
}
void
GEOSWKTWriter_setOutputDimension(WKTWriter* writer, int dim)
{
GEOSWKTWriter_setOutputDimension_r(handle, writer, dim);
}
int
GEOSWKTWriter_getOutputDimension(WKTWriter* writer)
{
return GEOSWKTWriter_getOutputDimension_r(handle, writer);
}
void
GEOSWKTWriter_setOld3D(WKTWriter* writer, int useOld3D)
{
GEOSWKTWriter_setOld3D_r(handle, writer, useOld3D);
}
/* WKB Reader */
WKBReader*
GEOSWKBReader_create()
{
return GEOSWKBReader_create_r(handle);
}
void
GEOSWKBReader_destroy(WKBReader* reader)
{
GEOSWKBReader_destroy_r(handle, reader);
}
Geometry*
GEOSWKBReader_read(WKBReader* reader, const unsigned char* wkb, size_t size)
{
return GEOSWKBReader_read_r(handle, reader, wkb, size);
}
Geometry*
GEOSWKBReader_readHEX(WKBReader* reader, const unsigned char* hex, size_t size)
{
return GEOSWKBReader_readHEX_r(handle, reader, hex, size);
}
/* WKB Writer */
WKBWriter*
GEOSWKBWriter_create()
{
return GEOSWKBWriter_create_r(handle);
}
void
GEOSWKBWriter_destroy(WKBWriter* Writer)
{
GEOSWKBWriter_destroy_r(handle, Writer);
}
/* The caller owns the result */
unsigned char*
GEOSWKBWriter_write(WKBWriter* writer, const Geometry* geom, size_t* size)
{
return GEOSWKBWriter_write_r(handle, writer, geom, size);
}
/* The caller owns the result */
unsigned char*
GEOSWKBWriter_writeHEX(WKBWriter* writer, const Geometry* geom, size_t* size)
{
return GEOSWKBWriter_writeHEX_r(handle, writer, geom, size);
}
int
GEOSWKBWriter_getOutputDimension(const GEOSWKBWriter* writer)
{
return GEOSWKBWriter_getOutputDimension_r(handle, writer);
}
void
GEOSWKBWriter_setOutputDimension(GEOSWKBWriter* writer, int newDimension)
{
GEOSWKBWriter_setOutputDimension_r(handle, writer, newDimension);
}
int
GEOSWKBWriter_getByteOrder(const GEOSWKBWriter* writer)
{
return GEOSWKBWriter_getByteOrder_r(handle, writer);
}
void
GEOSWKBWriter_setByteOrder(GEOSWKBWriter* writer, int newByteOrder)
{
GEOSWKBWriter_setByteOrder_r(handle, writer, newByteOrder);
}
char
GEOSWKBWriter_getIncludeSRID(const GEOSWKBWriter* writer)
{
return GEOSWKBWriter_getIncludeSRID_r(handle, writer);
}
void
GEOSWKBWriter_setIncludeSRID(GEOSWKBWriter* writer, const char newIncludeSRID)
{
GEOSWKBWriter_setIncludeSRID_r(handle, writer, newIncludeSRID);
}
//-----------------------------------------------------------------
// Prepared Geometry
//-----------------------------------------------------------------
const geos::geom::prep::PreparedGeometry*
GEOSPrepare(const Geometry* g)
{
return GEOSPrepare_r(handle, g);
}
void
GEOSPreparedGeom_destroy(const geos::geom::prep::PreparedGeometry* a)
{
GEOSPreparedGeom_destroy_r(handle, a);
}
char
GEOSPreparedContains(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedContains_r(handle, pg1, g2);
}
char
GEOSPreparedContainsProperly(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedContainsProperly_r(handle, pg1, g2);
}
char
GEOSPreparedCoveredBy(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedCoveredBy_r(handle, pg1, g2);
}
char
GEOSPreparedCovers(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedCovers_r(handle, pg1, g2);
}
char
GEOSPreparedCrosses(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedCrosses_r(handle, pg1, g2);
}
char
GEOSPreparedDisjoint(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedDisjoint_r(handle, pg1, g2);
}
char
GEOSPreparedIntersects(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedIntersects_r(handle, pg1, g2);
}
char
GEOSPreparedOverlaps(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedOverlaps_r(handle, pg1, g2);
}
char
GEOSPreparedTouches(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedTouches_r(handle, pg1, g2);
}
char
GEOSPreparedWithin(const geos::geom::prep::PreparedGeometry* pg1, const Geometry* g2)
{
return GEOSPreparedWithin_r(handle, pg1, g2);
}
STRtree*
GEOSSTRtree_create(size_t nodeCapacity)
{
return GEOSSTRtree_create_r(handle, nodeCapacity);
}
void
GEOSSTRtree_insert(geos::index::strtree::STRtree* tree,
const geos::geom::Geometry* g,
void* item)
{
GEOSSTRtree_insert_r(handle, tree, g, item);
}
void
GEOSSTRtree_query(geos::index::strtree::STRtree* tree,
const geos::geom::Geometry* g,
GEOSQueryCallback cb,
void* userdata)
{
GEOSSTRtree_query_r(handle, tree, g, cb, userdata);
}
const GEOSGeometry*
GEOSSTRtree_nearest(geos::index::strtree::STRtree* tree,
const geos::geom::Geometry* g)
{
return GEOSSTRtree_nearest_r(handle, tree, g);
}
const void* GEOSSTRtree_nearest_generic(GEOSSTRtree* tree,
const void* item,
const GEOSGeometry* itemEnvelope,
GEOSDistanceCallback distancefn,
void* userdata)
{
return GEOSSTRtree_nearest_generic_r(handle, tree, item, itemEnvelope, distancefn, userdata);
}
void
GEOSSTRtree_iterate(geos::index::strtree::STRtree* tree,
GEOSQueryCallback callback,
void* userdata)
{
GEOSSTRtree_iterate_r(handle, tree, callback, userdata);
}
char
GEOSSTRtree_remove(geos::index::strtree::STRtree* tree,
const geos::geom::Geometry* g,
void* item)
{
return GEOSSTRtree_remove_r(handle, tree, g, item);
}
void
GEOSSTRtree_destroy(geos::index::strtree::STRtree* tree)
{
GEOSSTRtree_destroy_r(handle, tree);
}
double
GEOSProject(const geos::geom::Geometry* g,
const geos::geom::Geometry* p)
{
return GEOSProject_r(handle, g, p);
}
geos::geom::Geometry*
GEOSInterpolate(const geos::geom::Geometry* g,
double d)
{
return GEOSInterpolate_r(handle, g, d);
}
double
GEOSProjectNormalized(const geos::geom::Geometry* g,
const geos::geom::Geometry* p)
{
return GEOSProjectNormalized_r(handle, g, p);
}
geos::geom::Geometry*
GEOSInterpolateNormalized(const geos::geom::Geometry* g,
double d)
{
return GEOSInterpolateNormalized_r(handle, g, d);
}
geos::geom::Geometry*
GEOSGeom_extractUniquePoints(const geos::geom::Geometry* g)
{
return GEOSGeom_extractUniquePoints_r(handle, g);
}
geos::geom::Geometry*
GEOSGeom_createEmptyCollection(int type)
{
return GEOSGeom_createEmptyCollection_r(handle, type);
}
geos::geom::Geometry*
GEOSGeom_createEmptyPoint()
{
return GEOSGeom_createEmptyPoint_r(handle);
}
geos::geom::Geometry*
GEOSGeom_createEmptyLineString()
{
return GEOSGeom_createEmptyLineString_r(handle);
}
geos::geom::Geometry*
GEOSGeom_createEmptyPolygon()
{
return GEOSGeom_createEmptyPolygon_r(handle);
}
int
GEOSOrientationIndex(double Ax, double Ay, double Bx, double By,
double Px, double Py)
{
return GEOSOrientationIndex_r(handle, Ax, Ay, Bx, By, Px, Py);
}
GEOSGeometry*
GEOSSharedPaths(const GEOSGeometry* g1, const GEOSGeometry* g2)
{
return GEOSSharedPaths_r(handle, g1, g2);
}
GEOSGeometry*
GEOSSnap(const GEOSGeometry* g1, const GEOSGeometry* g2, double tolerance)
{
return GEOSSnap_r(handle, g1, g2, tolerance);
}
GEOSBufferParams*
GEOSBufferParams_create()
{
return GEOSBufferParams_create_r(handle);
}
void
GEOSBufferParams_destroy(GEOSBufferParams* p)
{
return GEOSBufferParams_destroy_r(handle, p);
}
int
GEOSBufferParams_setEndCapStyle(GEOSBufferParams* p, int style)
{
return GEOSBufferParams_setEndCapStyle_r(handle, p, style);
}
int
GEOSBufferParams_setJoinStyle(GEOSBufferParams* p, int joinStyle)
{
return GEOSBufferParams_setJoinStyle_r(handle, p, joinStyle);
}
int
GEOSBufferParams_setMitreLimit(GEOSBufferParams* p, double l)
{
return GEOSBufferParams_setMitreLimit_r(handle, p, l);
}
int
GEOSBufferParams_setQuadrantSegments(GEOSBufferParams* p, int joinStyle)
{
return GEOSBufferParams_setQuadrantSegments_r(handle, p, joinStyle);
}
int
GEOSBufferParams_setSingleSided(GEOSBufferParams* p, int singleSided)
{
return GEOSBufferParams_setSingleSided_r(handle, p, singleSided);
}
Geometry*
GEOSBufferWithParams(const Geometry* g, const GEOSBufferParams* p, double w)
{
return GEOSBufferWithParams_r(handle, g, p, w);
}
Geometry*
GEOSDelaunayTriangulation(const Geometry* g, double tolerance, int onlyEdges)
{
return GEOSDelaunayTriangulation_r(handle, g, tolerance, onlyEdges);
}
Geometry*
GEOSVoronoiDiagram(const Geometry* g, const Geometry* env, double tolerance, int onlyEdges)
{
return GEOSVoronoiDiagram_r(handle, g, env, tolerance, onlyEdges);
}
int
GEOSSegmentIntersection(double ax0, double ay0, double ax1, double ay1,
double bx0, double by0, double bx1, double by1,
double* cx, double* cy)
{
return GEOSSegmentIntersection_r(handle,
ax0, ay0, ax1, ay1,
bx0, by0, bx1, by1,
cx, cy);
}
} /* extern "C" */