[geos-commits] [SCM] GEOS branch main updated. ddd197d17589d1ce8106eee37bd4460026a854c4
git at osgeo.org
git at osgeo.org
Fri May 2 13:24:38 PDT 2025
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".
The branch, main has been updated
via ddd197d17589d1ce8106eee37bd4460026a854c4 (commit)
from c66c9e8adbdfea6b7a36e14ff93fe97474fedfac (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit ddd197d17589d1ce8106eee37bd4460026a854c4
Author: Daniel Baston <dbaston at gmail.com>
Date: Fri May 2 16:24:19 2025 -0400
C API: Add functions to work on CoordinateSequences with M values (#1246)
* C API: Add GEOSCoordSeq_getM, GEOSCoordSeq_setM
* C API: Add GEOSCoordSeq_createWithDimensions
References https://github.com/libgeos/geos/issues/1244
diff --git a/capi/geos_c.cpp b/capi/geos_c.cpp
index 633c6b07c..6aa9952a0 100644
--- a/capi/geos_c.cpp
+++ b/capi/geos_c.cpp
@@ -1105,6 +1105,12 @@ extern "C" {
return GEOSCoordSeq_create_r(handle, size, dims);
}
+ CoordinateSequence*
+ GEOSCoordSeq_createWithDimensions(unsigned int size, int hasZ, int hasM)
+ {
+ return GEOSCoordSeq_createWithDimensions_r(handle, size, hasZ, hasM);
+ }
+
CoordinateSequence*
GEOSCoordSeq_copyFromBuffer(const double* buf, unsigned int size, int hasZ, int hasM)
{
@@ -1138,19 +1144,25 @@ extern "C" {
int
GEOSCoordSeq_setX(CoordinateSequence* s, unsigned int idx, double val)
{
- return GEOSCoordSeq_setOrdinate(s, idx, 0, val);
+ return GEOSCoordSeq_setOrdinate(s, idx, CoordinateSequence::X, val);
}
int
GEOSCoordSeq_setY(CoordinateSequence* s, unsigned int idx, double val)
{
- return GEOSCoordSeq_setOrdinate(s, idx, 1, val);
+ return GEOSCoordSeq_setOrdinate(s, idx, CoordinateSequence::Y, val);
}
int
GEOSCoordSeq_setZ(CoordinateSequence* s, unsigned int idx, double val)
{
- return GEOSCoordSeq_setOrdinate(s, idx, 2, val);
+ return GEOSCoordSeq_setOrdinate(s, idx, CoordinateSequence::Z, val);
+ }
+
+ int
+ GEOSCoordSeq_setM(CoordinateSequence* s, unsigned int idx, double val)
+ {
+ return GEOSCoordSeq_setOrdinate(s, idx, CoordinateSequence::M, val);
}
int
@@ -1180,19 +1192,25 @@ extern "C" {
int
GEOSCoordSeq_getX(const CoordinateSequence* s, unsigned int idx, double* val)
{
- return GEOSCoordSeq_getOrdinate(s, idx, 0, val);
+ return GEOSCoordSeq_getOrdinate(s, idx, CoordinateSequence::X, val);
}
int
GEOSCoordSeq_getY(const CoordinateSequence* s, unsigned int idx, double* val)
{
- return GEOSCoordSeq_getOrdinate(s, idx, 1, val);
+ return GEOSCoordSeq_getOrdinate(s, idx, CoordinateSequence::Y, val);
}
int
GEOSCoordSeq_getZ(const CoordinateSequence* s, unsigned int idx, double* val)
{
- return GEOSCoordSeq_getOrdinate(s, idx, 2, val);
+ return GEOSCoordSeq_getOrdinate(s, idx, CoordinateSequence::Z, val);
+ }
+
+ int
+ GEOSCoordSeq_getM(const CoordinateSequence* s, unsigned int idx, double* val)
+ {
+ return GEOSCoordSeq_getOrdinate(s, idx, CoordinateSequence::M, val);
}
int
diff --git a/capi/geos_c.h.in b/capi/geos_c.h.in
index 06a5dec49..3ca7a9aac 100644
--- a/capi/geos_c.h.in
+++ b/capi/geos_c.h.in
@@ -444,6 +444,13 @@ extern GEOSCoordSequence GEOS_DLL *GEOSCoordSeq_create_r(
unsigned int size,
unsigned int dims);
+/** \see GEOSCoordSeq_createWithDimensions */
+extern GEOSCoordSequence GEOS_DLL *GEOSCoordSeq_createWithDimensions_r(
+ GEOSContextHandle_t handle,
+ unsigned int size,
+ int hasZ,
+ int hasM);
+
/** \see GEOSCoordSeq_copyFromBuffer */
extern GEOSCoordSequence GEOS_DLL *GEOSCoordSeq_copyFromBuffer_r(
GEOSContextHandle_t handle,
@@ -506,6 +513,12 @@ extern int GEOS_DLL GEOSCoordSeq_setZ_r(
GEOSCoordSequence* s, unsigned int idx,
double val);
+/** \see GEOSCoordSeq_setM */
+extern int GEOS_DLL GEOSCoordSeq_setM_r(
+ GEOSContextHandle_t handle,
+ GEOSCoordSequence* s, unsigned int idx,
+ double val);
+
/** \see GEOSCoordSeq_setXY */
extern int GEOS_DLL GEOSCoordSeq_setXY_r(
GEOSContextHandle_t handle,
@@ -543,6 +556,12 @@ extern int GEOS_DLL GEOSCoordSeq_getZ_r(
const GEOSCoordSequence* s,
unsigned int idx, double *val);
+/** \see GEOSCoordSeq_getM */
+extern int GEOS_DLL GEOSCoordSeq_getM_r(
+ GEOSContextHandle_t handle,
+ const GEOSCoordSequence* s,
+ unsigned int idx, double *val);
+
/** \see GEOSCoordSeq_getXY */
extern int GEOS_DLL GEOSCoordSeq_getXY_r(
GEOSContextHandle_t handle,
@@ -2252,6 +2271,16 @@ extern void GEOS_DLL GEOSFree(void *buffer);
*/
extern GEOSCoordSequence GEOS_DLL *GEOSCoordSeq_create(unsigned int size, unsigned int dims);
+/**
+* Create a coordinate sequence.
+* \param size number of coordinates in the sequence
+* \param hasZ whether the sequence should store Z values
+* \param hasM whether the sequence should store M values
+* \return the sequence or NULL on exception
+* \since 3.14
+*/
+extern GEOSCoordSequence GEOS_DLL *GEOSCoordSeq_createWithDimensions(unsigned int size, int hasZ, int hasM);
+
/**
* Create a coordinate sequence by copying from an interleaved buffer of doubles (e.g., XYXY or XYZXYZ)
* \param buf pointer to buffer
@@ -2347,6 +2376,18 @@ extern int GEOS_DLL GEOSCoordSeq_setY(GEOSCoordSequence* s,
*/
extern int GEOS_DLL GEOSCoordSeq_setZ(GEOSCoordSequence* s,
unsigned int idx, double val);
+
+/**
+* Set M ordinate values in a coordinate sequence.
+* \param s the coordinate sequence
+* \param idx the index of the coordinate to alter, zero based
+* \param val the value to set the ordinate to
+* \return 0 on exception
+* \since 3.14
+*/
+extern int GEOS_DLL GEOSCoordSeq_setM(GEOSCoordSequence* s,
+ unsigned int idx, double val);
+
/**
* Set X and Y ordinate values in a coordinate sequence simultaneously.
* \param s the coordinate sequence
@@ -2405,6 +2446,7 @@ extern int GEOS_DLL GEOSCoordSeq_getX(const GEOSCoordSequence* s,
*/
extern int GEOS_DLL GEOSCoordSeq_getY(const GEOSCoordSequence* s,
unsigned int idx, double *val);
+
/**
* Read Z ordinate values from a coordinate sequence.
* \param s the coordinate sequence
@@ -2415,6 +2457,18 @@ extern int GEOS_DLL GEOSCoordSeq_getY(const GEOSCoordSequence* s,
*/
extern int GEOS_DLL GEOSCoordSeq_getZ(const GEOSCoordSequence* s,
unsigned int idx, double *val);
+
+/**
+* Read M ordinate values from a coordinate sequence.
+* \param s the coordinate sequence
+* \param idx the index of the coordinate to alter, zero based
+* \param val pointer where ordinate value will be placed
+* \return 0 on exception
+* \since 3.14
+*/
+extern int GEOS_DLL GEOSCoordSeq_getM(const GEOSCoordSequence* s,
+ unsigned int idx, double *val);
+
/**
* Read X and Y ordinate values from a coordinate sequence.
* \param s the coordinate sequence
diff --git a/capi/geos_ts_c.cpp b/capi/geos_ts_c.cpp
index 981d0cf8e..c6a824cbb 100644
--- a/capi/geos_ts_c.cpp
+++ b/capi/geos_ts_c.cpp
@@ -2689,6 +2689,14 @@ extern "C" {
});
}
+ CoordinateSequence*
+ GEOSCoordSeq_createWithDimensions_r(GEOSContextHandle_t extHandle, unsigned int size, int hasZ, int hasM)
+ {
+ return execute(extHandle, [&]() {
+ return new CoordinateSequence(size, hasZ, hasM);
+ });
+ }
+
CoordinateSequence*
GEOSCoordSeq_copyFromBuffer_r(GEOSContextHandle_t extHandle, const double* buf, unsigned int size, int hasZ, int hasM)
{
@@ -2854,19 +2862,25 @@ extern "C" {
int
GEOSCoordSeq_setX_r(GEOSContextHandle_t extHandle, CoordinateSequence* s, unsigned int idx, double val)
{
- return GEOSCoordSeq_setOrdinate_r(extHandle, s, idx, 0, val);
+ return GEOSCoordSeq_setOrdinate_r(extHandle, s, idx, CoordinateSequence::X, val);
}
int
GEOSCoordSeq_setY_r(GEOSContextHandle_t extHandle, CoordinateSequence* s, unsigned int idx, double val)
{
- return GEOSCoordSeq_setOrdinate_r(extHandle, s, idx, 1, val);
+ return GEOSCoordSeq_setOrdinate_r(extHandle, s, idx, CoordinateSequence::Y, val);
}
int
GEOSCoordSeq_setZ_r(GEOSContextHandle_t extHandle, CoordinateSequence* s, unsigned int idx, double val)
{
- return GEOSCoordSeq_setOrdinate_r(extHandle, s, idx, 2, val);
+ return GEOSCoordSeq_setOrdinate_r(extHandle, s, idx, CoordinateSequence::Z, val);
+ }
+
+ int
+ GEOSCoordSeq_setM_r(GEOSContextHandle_t extHandle, CoordinateSequence* s, unsigned int idx, double val)
+ {
+ return GEOSCoordSeq_setOrdinate_r(extHandle, s, idx, CoordinateSequence::M, val);
}
int
@@ -2908,19 +2922,25 @@ extern "C" {
int
GEOSCoordSeq_getX_r(GEOSContextHandle_t extHandle, const CoordinateSequence* s, unsigned int idx, double* val)
{
- return GEOSCoordSeq_getOrdinate_r(extHandle, s, idx, 0, val);
+ return GEOSCoordSeq_getOrdinate_r(extHandle, s, idx, CoordinateSequence::X, val);
}
int
GEOSCoordSeq_getY_r(GEOSContextHandle_t extHandle, const CoordinateSequence* s, unsigned int idx, double* val)
{
- return GEOSCoordSeq_getOrdinate_r(extHandle, s, idx, 1, val);
+ return GEOSCoordSeq_getOrdinate_r(extHandle, s, idx, CoordinateSequence::Y, val);
}
int
GEOSCoordSeq_getZ_r(GEOSContextHandle_t extHandle, const CoordinateSequence* s, unsigned int idx, double* val)
{
- return GEOSCoordSeq_getOrdinate_r(extHandle, s, idx, 2, val);
+ return GEOSCoordSeq_getOrdinate_r(extHandle, s, idx, CoordinateSequence::Z, val);
+ }
+
+ int
+ GEOSCoordSeq_getM_r(GEOSContextHandle_t extHandle, const CoordinateSequence* s, unsigned int idx, double* val)
+ {
+ return GEOSCoordSeq_getOrdinate_r(extHandle, s, idx, CoordinateSequence::M, val);
}
int
diff --git a/tests/unit/capi/GEOSCoordSeqTest.cpp b/tests/unit/capi/GEOSCoordSeqTest.cpp
index ffa7912b0..8adf02658 100644
--- a/tests/unit/capi/GEOSCoordSeqTest.cpp
+++ b/tests/unit/capi/GEOSCoordSeqTest.cpp
@@ -834,9 +834,7 @@ void object::test<25>()
{
set_test_name("setOrdinate on XYM coordinate");
- /* TODO: use GEOSCoordSeq_createWithDimensions() instead */
- double buffer[3];
- cs_ = GEOSCoordSeq_copyFromBuffer(buffer, 1, 0, 1);
+ cs_ = GEOSCoordSeq_createWithDimensions(1, 0, 1);
ensure("setX", GEOSCoordSeq_setOrdinate(cs_, 0, 0, 1));
ensure("setY", GEOSCoordSeq_setOrdinate(cs_, 0, 1, 2));
@@ -851,4 +849,36 @@ void object::test<25>()
ensure_equals("M", m, 4);
}
+template<>
+template<>
+void object::test<26>()
+{
+ set_test_name("getM and setM on XYZ sequence");
+
+ cs_ = GEOSCoordSeq_create(1, 3);
+
+ // setM fails
+ ensure("setM", !GEOSCoordSeq_setM(cs_, 0, 4));
+
+ // getM succeeds but sets value to NaN
+ double m = 0;
+ ensure("getM", GEOSCoordSeq_getM(cs_, 0, &m));
+ ensure(std::isnan(m));
+}
+
+template<>
+template<>
+void object::test<27>()
+{
+ set_test_name("getM and setM on XYZM sequence");
+
+ cs_ = GEOSCoordSeq_create(1, 4);
+
+ ensure("setM", GEOSCoordSeq_setM(cs_, 0, 4));
+
+ double m;
+ ensure(GEOSCoordSeq_getM(cs_, 0, &m));
+ ensure_equals(m, 4);
+}
+
} // namespace tut
-----------------------------------------------------------------------
Summary of changes:
capi/geos_c.cpp | 30 ++++++++++++++++----
capi/geos_c.h.in | 54 ++++++++++++++++++++++++++++++++++++
capi/geos_ts_c.cpp | 32 +++++++++++++++++----
tests/unit/capi/GEOSCoordSeqTest.cpp | 36 ++++++++++++++++++++++--
4 files changed, 137 insertions(+), 15 deletions(-)
hooks/post-receive
--
GEOS
More information about the geos-commits
mailing list