[geos-commits] [SCM] GEOS branch main updated. afe57da9baff42e27afdbec613bb0fa8394eaba5
git at osgeo.org
git at osgeo.org
Tue Mar 24 10:46:34 PDT 2026
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 afe57da9baff42e27afdbec613bb0fa8394eaba5 (commit)
from 861ed20b38bb26067f5a552302b30d3637c03bdf (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 afe57da9baff42e27afdbec613bb0fa8394eaba5
Author: Daniel Baston <dbaston at gmail.com>
Date: Tue Mar 24 13:46:14 2026 -0400
GeometryPrecisionReducer: Support curved types for pointwise precision reduction (#1402)
diff --git a/capi/geos_c.h.in b/capi/geos_c.h.in
index 635bfff64..4637c5ab4 100644
--- a/capi/geos_c.h.in
+++ b/capi/geos_c.h.in
@@ -5622,6 +5622,7 @@ extern GEOSGeometry GEOS_DLL *GEOSSnap(
* has the same semantics as GEOS_PREC_NO_TOPO
*
* Z and M values in the input are preserved.
+* Curved geometries are supported since GEOS 3.15 if GEOS_PREC_NO_TOPO is used.
*
* \param g Input geometry
* \param gridSize cell size of grid to round coordinates to,
diff --git a/include/geos/geom/Quadrant.h b/include/geos/geom/Quadrant.h
index d7a9e9519..0c616dc47 100644
--- a/include/geos/geom/Quadrant.h
+++ b/include/geos/geom/Quadrant.h
@@ -70,7 +70,7 @@ public:
std::ostringstream s;
s << "Cannot compute the quadrant for point ";
s << "(" << dx << "," << dy << ")" << std::endl;
- throw util::IllegalArgumentException(s.str());
+ throw geos::util::IllegalArgumentException(s.str());
}
if(dx >= 0) {
if(dy >= 0) {
@@ -98,7 +98,7 @@ public:
static int quadrant(const geom::CoordinateXY& p0, const geom::CoordinateXY& p1)
{
if(p1.x == p0.x && p1.y == p0.y) {
- throw util::IllegalArgumentException("Cannot compute the quadrant for two identical points " + p0.toString());
+ throw geos::util::IllegalArgumentException("Cannot compute the quadrant for two identical points " + p0.toString());
}
if(p1.x >= p0.x) {
diff --git a/include/geos/geom/util/GeometryTransformer.h b/include/geos/geom/util/GeometryTransformer.h
index 7cbe0c35f..a2f9bcaca 100644
--- a/include/geos/geom/util/GeometryTransformer.h
+++ b/include/geos/geom/util/GeometryTransformer.h
@@ -41,6 +41,11 @@ class MultiPoint;
class MultiPolygon;
class MultiLineString;
class GeometryCollection;
+class CircularString;
+class CompoundCurve;
+class CurvePolygon;
+class MultiCurve;
+class MultiSurface;
namespace util {
//class GeometryEditorOperation;
}
@@ -121,6 +126,14 @@ protected:
const LineString* geom,
const Geometry* parent);
+ virtual Geometry::Ptr transformCircularString(
+ const CircularString* geom,
+ const Geometry* parent);
+
+ virtual Geometry::Ptr transformCompoundCurve(
+ const CompoundCurve* geom,
+ const Geometry* parent);
+
virtual Geometry::Ptr transformMultiLineString(
const MultiLineString* geom,
const Geometry* parent);
@@ -129,10 +142,22 @@ protected:
const Polygon* geom,
const Geometry* parent);
+ virtual Geometry::Ptr transformCurvePolygon(
+ const CurvePolygon* geom,
+ const Geometry* parent);
+
virtual Geometry::Ptr transformMultiPolygon(
const MultiPolygon* geom,
const Geometry* parent);
+ virtual Geometry::Ptr transformMultiCurve(
+ const MultiCurve* geom,
+ const Geometry* parent);
+
+ virtual Geometry::Ptr transformMultiSurface(
+ const MultiSurface* geom,
+ const Geometry* parent);
+
virtual Geometry::Ptr transformGeometryCollection(
const GeometryCollection* geom,
const Geometry* parent);
diff --git a/include/geos/operation/overlay/snap/GeometrySnapper.h b/include/geos/operation/overlay/snap/GeometrySnapper.h
index 63f092f02..757d72dfa 100644
--- a/include/geos/operation/overlay/snap/GeometrySnapper.h
+++ b/include/geos/operation/overlay/snap/GeometrySnapper.h
@@ -24,6 +24,8 @@
#include <memory>
#include <vector>
+#include "geos/util.h"
+
// Forward declarations
namespace geos {
namespace geom {
@@ -80,11 +82,7 @@ public:
*
* @param g the geometry to snap
*/
- GeometrySnapper(const geom::Geometry& g)
- :
- srcGeom(g)
- {
- }
+ GeometrySnapper(const geom::Geometry& g);
/** \brief
* Snaps the vertices in the component {@link geom::LineString}s
@@ -138,7 +136,7 @@ private:
const geom::Geometry& srcGeom;
/// Extract target (unique) coordinates
- std::unique_ptr<geom::Coordinate::ConstVect> extractTargetCoordinates(
+ static std::unique_ptr<geom::Coordinate::ConstVect> extractTargetCoordinates(
const geom::Geometry& g);
// Declare type as noncopyable
diff --git a/src/geom/util/Densifier.cpp b/src/geom/util/Densifier.cpp
index a344757b4..19ec91d3a 100644
--- a/src/geom/util/Densifier.cpp
+++ b/src/geom/util/Densifier.cpp
@@ -103,7 +103,9 @@ Densifier::DensifyTransformer::createValidArea(const Geometry* roughAreaGeom)
Densifier::Densifier(const Geometry* geom):
inputGeom(geom)
-{}
+{
+ geos::util::ensureNoCurvedComponents(geom);
+}
std::unique_ptr<CoordinateSequence>
Densifier::densifyPoints(const CoordinateSequence& pts, double distanceTolerance, const PrecisionModel* precModel)
diff --git a/src/geom/util/GeometryTransformer.cpp b/src/geom/util/GeometryTransformer.cpp
index afa01ce32..815d85ce0 100644
--- a/src/geom/util/GeometryTransformer.cpp
+++ b/src/geom/util/GeometryTransformer.cpp
@@ -18,11 +18,16 @@
**********************************************************************/
#include <geos/geom/util/GeometryTransformer.h>
+#include <geos/geom/CircularString.h>
+#include <geos/geom/CompoundCurve.h>
+#include <geos/geom/CurvePolygon.h>
#include <geos/geom/GeometryFactory.h>
#include <geos/geom/Geometry.h>
+#include <geos/geom/MultiCurve.h>
#include <geos/geom/MultiPoint.h>
#include <geos/geom/MultiPolygon.h>
#include <geos/geom/MultiLineString.h>
+#include <geos/geom/MultiSurface.h>
#include <geos/geom/CoordinateSequence.h>
#include <geos/geom/Polygon.h>
#include <geos/geom/Point.h>
@@ -84,29 +89,33 @@ GeometryTransformer::transform(const Geometry* nInputGeom)
return inputGeom->clone();
}
- if(const Point* p = dynamic_cast<const Point*>(inputGeom)) {
- return transformPoint(p, nullptr);
- }
- if(const MultiPoint* mp = dynamic_cast<const MultiPoint*>(inputGeom)) {
- return transformMultiPoint(mp, nullptr);
- }
- if(const LinearRing* lr = dynamic_cast<const LinearRing*>(inputGeom)) {
- return transformLinearRing(lr, nullptr);
- }
- if(const LineString* ls = dynamic_cast<const LineString*>(inputGeom)) {
- return transformLineString(ls, nullptr);
- }
- if(const MultiLineString* mls = dynamic_cast<const MultiLineString*>(inputGeom)) {
- return transformMultiLineString(mls, nullptr);
- }
- if(const Polygon* p = dynamic_cast<const Polygon*>(inputGeom)) {
- return transformPolygon(p, nullptr);
- }
- if(const MultiPolygon* mp = dynamic_cast<const MultiPolygon*>(inputGeom)) {
- return transformMultiPolygon(mp, nullptr);
- }
- if(const GeometryCollection* gc = dynamic_cast<const GeometryCollection*>(inputGeom)) {
- return transformGeometryCollection(gc, nullptr);
+ switch (inputGeom->getGeometryTypeId()) {
+ case GEOS_POINT:
+ return transformPoint(detail::down_cast<const Point*>(inputGeom), nullptr);
+ case GEOS_LINESTRING:
+ return transformLineString(detail::down_cast<const LineString*>(inputGeom), nullptr);
+ case GEOS_LINEARRING:
+ return transformLinearRing(detail::down_cast<const LinearRing*>(inputGeom), nullptr);
+ case GEOS_POLYGON:
+ return transformPolygon(detail::down_cast<const Polygon*>(inputGeom), nullptr);
+ case GEOS_CIRCULARSTRING:
+ return transformCircularString(detail::down_cast<const CircularString*>(inputGeom), nullptr);
+ case GEOS_COMPOUNDCURVE:
+ return transformCompoundCurve(detail::down_cast<const CompoundCurve*>(inputGeom), nullptr);
+ case GEOS_CURVEPOLYGON:
+ return transformCurvePolygon(detail::down_cast<const CurvePolygon*>(inputGeom), nullptr);
+ case GEOS_MULTIPOINT:
+ return transformMultiPoint(detail::down_cast<const MultiPoint*>(inputGeom), nullptr);
+ case GEOS_MULTILINESTRING:
+ return transformMultiLineString(detail::down_cast<const MultiLineString*>(inputGeom), nullptr);
+ case GEOS_MULTIPOLYGON:
+ return transformMultiPolygon(detail::down_cast<const MultiPolygon*>(inputGeom), nullptr);
+ case GEOS_MULTICURVE:
+ return transformMultiCurve(detail::down_cast<const MultiCurve*>(inputGeom), nullptr);
+ case GEOS_MULTISURFACE:
+ return transformMultiSurface(detail::down_cast<const MultiSurface*>(inputGeom), nullptr);
+ case GEOS_GEOMETRYCOLLECTION:
+ return transformGeometryCollection(detail::down_cast<const GeometryCollection*>(inputGeom), nullptr);
}
throw IllegalArgumentException("Unknown Geometry subtype.");
@@ -224,6 +233,78 @@ GeometryTransformer::transformLineString(
transformCoordinates(geom->getCoordinatesRO(), geom));
}
+std::unique_ptr<Geometry>
+GeometryTransformer::transformCircularString(
+ const CircularString* geom,
+ const Geometry* parent)
+{
+ ::geos::ignore_unused_variable_warning(parent);
+
+#if GEOS_DEBUG
+ std::cerr << "GeometryTransformer::transformCircularString(CircularString " << geom << ", Geometry " << parent << ");"
+ << std::endl;
+#endif
+
+ return factory->createCircularString(
+ transformCoordinates(geom->getCoordinatesRO(), geom));
+}
+
+std::unique_ptr<Geometry>
+GeometryTransformer::transformCompoundCurve(
+ const CompoundCurve* geom,
+ const Geometry* parent)
+{
+ ::geos::ignore_unused_variable_warning(parent);
+
+#if GEOS_DEBUG
+ std::cerr << "GeometryTransformer::transformCompoundCurve(CompoundCurve " << geom << ", Geometry " << parent << ");"
+ << std::endl;
+#endif
+
+ std::vector<std::unique_ptr<SimpleCurve>> curves;
+ std::vector<std::unique_ptr<Geometry>> components;
+ bool outputIsCompoundCurve = true;
+
+ for(std::size_t i = 0; i < geom->getNumCurves(); i++) {
+ const SimpleCurve* c = geom->getCurveN(i);
+
+ std::unique_ptr<Geometry> transformGeom;
+ if(const CircularString* cs = dynamic_cast<const CircularString*>(c)) {
+ transformGeom = transformCircularString(cs, geom);
+ }
+ else if(const LineString* ls = dynamic_cast<const LineString*>(c)) {
+ transformGeom = transformLineString(ls, geom);
+ }
+ else {
+ throw geos::util::IllegalArgumentException("Unknown Curve subtype.");
+ }
+
+ if(transformGeom == nullptr || transformGeom->isEmpty()) {
+ continue;
+ }
+
+ if (!dynamic_cast<const SimpleCurve*>(transformGeom.get())) {
+ outputIsCompoundCurve = false;
+
+ for (auto& curve : curves) {
+ components.push_back(std::move(curve));
+ }
+ }
+
+ if (outputIsCompoundCurve) {
+ curves.emplace_back(detail::down_cast<SimpleCurve*>(transformGeom.release()));
+ } else {
+ components.push_back(std::move(transformGeom));
+ }
+ }
+
+ if (outputIsCompoundCurve) {
+ return factory->createCompoundCurve(std::move(curves));
+ }
+
+ return factory->buildGeometry(std::move(components));
+}
+
Geometry::Ptr
GeometryTransformer::transformMultiLineString(
const MultiLineString* geom,
@@ -261,6 +342,34 @@ GeometryTransformer::transformMultiLineString(
}
+std::unique_ptr<Geometry>
+GeometryTransformer::transformMultiCurve(
+ const MultiCurve* geom,
+ const Geometry* parent)
+{
+ ::geos::ignore_unused_variable_warning(parent);
+
+#if GEOS_DEBUG
+ std::cerr << "GeometryTransformer::transformMultiCurve(MultiCurve " << geom << ", Geometry " << parent << ");"
+ << std::endl;
+#endif
+
+ std::vector<std::unique_ptr<Geometry>> components;
+ for(std::size_t i = 0; i < geom->getNumGeometries(); i++) {
+ auto transformGeom = transform(geom->getGeometryN(i));
+
+ if(transformGeom && !transformGeom->isEmpty()) {
+ components.push_back(std::move(transformGeom));
+ }
+ }
+
+ if (components.empty()) {
+ return factory->createMultiCurve();
+ }
+
+ return factory->buildGeometry(std::move(components));
+}
+
Geometry::Ptr
GeometryTransformer::transformPolygon(
const Polygon* geom,
@@ -325,6 +434,93 @@ GeometryTransformer::transformPolygon(
}
+std::unique_ptr<Geometry>
+GeometryTransformer::transformCurvePolygon(
+ const CurvePolygon* geom,
+ const Geometry* parent)
+{
+ ::geos::ignore_unused_variable_warning(parent);
+
+#if GEOS_DEBUG
+ std::cerr << "GeometryTransformer::transformCurvePolygon(CurvePolygon " << geom << ", Geometry " << parent << ");"
+ << std::endl;
+#endif
+
+ bool isAllValidCurves = true;
+
+ const Curve* shellIn = geom->getExteriorRing();
+ assert(shellIn);
+
+ std::unique_ptr<Geometry> shell;
+ if(const CompoundCurve* cc = dynamic_cast<const CompoundCurve*>(shellIn)) {
+ shell = transformCompoundCurve(cc, geom);
+ }
+ else if(const CircularString* cs = dynamic_cast<const CircularString*>(shellIn)) {
+ shell = transformCircularString(cs, geom);
+ }
+ else if(const LineString* ls = dynamic_cast<const LineString*>(shellIn)) {
+ shell = transformLineString(ls, geom);
+ }
+ else {
+ throw geos::util::IllegalArgumentException("Unknown Curve subtype.");
+ }
+
+ if(shell == nullptr || !dynamic_cast<Curve*>(shell.get()) || shell->isEmpty()) {
+ isAllValidCurves = false;
+ }
+
+ std::vector<std::unique_ptr<Curve>> holes;
+ for(std::size_t i = 0, n = geom->getNumInteriorRing(); i < n; i++) {
+ const Curve* holeIn = geom->getInteriorRingN(i);
+ assert(holeIn);
+
+ Geometry::Ptr hole;
+ if(const CompoundCurve* cc = dynamic_cast<const CompoundCurve*>(holeIn)) {
+ hole = transformCompoundCurve(cc, geom);
+ }
+ else if(const CircularString* cs = dynamic_cast<const CircularString*>(holeIn)) {
+ hole = transformCircularString(cs, geom);
+ }
+ else if(const LineString* ls = dynamic_cast<const LineString*>(holeIn)) {
+ hole = transformLineString(ls, geom);
+ }
+ else {
+ throw geos::util::IllegalArgumentException("Unknown Curve subtype.");
+ }
+
+ if(hole == nullptr || hole->isEmpty()) {
+ continue;
+ }
+
+ if(dynamic_cast<Curve*>(hole.get())) {
+ holes.emplace_back(dynamic_cast<Curve*>(hole.release()));
+ }
+ else {
+ if(skipTransformedInvalidInteriorRings) {
+ continue;
+ }
+ isAllValidCurves = false;
+ }
+ }
+
+ if(isAllValidCurves) {
+ std::unique_ptr<Curve> shellCurve(dynamic_cast<Curve*>(shell.release()));
+ return factory->createCurvePolygon(std::move(shellCurve), std::move(holes));
+ }
+ else {
+ std::vector<std::unique_ptr<Geometry>> components;
+ if(shell != nullptr) {
+ components.push_back(std::move(shell));
+ }
+
+ for(auto& g : holes) {
+ components.push_back(std::move(g));
+ }
+
+ return factory->buildGeometry(std::move(components));
+ }
+}
+
Geometry::Ptr
GeometryTransformer::transformMultiPolygon(
const MultiPolygon* geom,
@@ -350,7 +546,6 @@ GeometryTransformer::transformMultiPolygon(
if(transformGeom->isEmpty()) {
continue;
}
-
transGeomList.push_back(std::move(transformGeom));
}
@@ -362,6 +557,34 @@ GeometryTransformer::transformMultiPolygon(
}
+std::unique_ptr<Geometry>
+GeometryTransformer::transformMultiSurface(
+ const MultiSurface* geom,
+ const Geometry* parent)
+{
+ ::geos::ignore_unused_variable_warning(parent);
+
+#if GEOS_DEBUG
+ std::cerr << "GeometryTransformer::transformMultiSurface(MultiSurface " << geom << ", Geometry " << parent << ");"
+ << std::endl;
+#endif
+
+ std::vector<std::unique_ptr<Geometry>> components;
+ for(std::size_t i = 0; i < geom->getNumGeometries(); i++) {
+ auto transformGeom = transform(geom->getGeometryN(i));
+
+ if(transformGeom && !transformGeom->isEmpty()) {
+ components.push_back(std::move(transformGeom));
+ }
+ }
+
+ if (components.empty()) {
+ return factory->createMultiSurface();
+ }
+
+ return factory->buildGeometry(std::move(components));
+}
+
Geometry::Ptr
GeometryTransformer::transformGeometryCollection(
const GeometryCollection* geom,
diff --git a/src/operation/overlay/snap/GeometrySnapper.cpp b/src/operation/overlay/snap/GeometrySnapper.cpp
index 7a13005f5..c0b429739 100644
--- a/src/operation/overlay/snap/GeometrySnapper.cpp
+++ b/src/operation/overlay/snap/GeometrySnapper.cpp
@@ -87,6 +87,12 @@ public:
};
+GeometrySnapper::GeometrySnapper(const Geometry& g)
+ : srcGeom(g)
+{
+ util::ensureNoCurvedComponents(g);
+}
+
/*private*/
std::unique_ptr<Coordinate::ConstVect>
GeometrySnapper::extractTargetCoordinates(const Geometry& g)
diff --git a/src/simplify/TopologyPreservingSimplifier.cpp b/src/simplify/TopologyPreservingSimplifier.cpp
index 85e39e1d5..b796610e0 100644
--- a/src/simplify/TopologyPreservingSimplifier.cpp
+++ b/src/simplify/TopologyPreservingSimplifier.cpp
@@ -35,6 +35,8 @@
#include <unordered_map>
#include <cassert>
+#include "geos/util.h"
+
#ifndef GEOS_DEBUG
#define GEOS_DEBUG 0
#endif
@@ -214,6 +216,7 @@ TopologyPreservingSimplifier::TopologyPreservingSimplifier(const Geometry* geom)
inputGeom(geom),
lineSimplifier(new TaggedLinesSimplifier())
{
+ util::ensureNoCurvedComponents(geom);
}
/*public*/
diff --git a/tests/unit/precision/GeometryPrecisionReducerTest.cpp b/tests/unit/precision/GeometryPrecisionReducerTest.cpp
index 2550a34bf..cd007c7b6 100644
--- a/tests/unit/precision/GeometryPrecisionReducerTest.cpp
+++ b/tests/unit/precision/GeometryPrecisionReducerTest.cpp
@@ -52,12 +52,12 @@ struct test_gpr_data {
void checkReducePointwise(
const std::string& wkt,
- const std::string& wktExpected)
+ const std::string& wktExpected) const
{
std::unique_ptr<Geometry> g = reader_.read(wkt);
std::unique_ptr<Geometry> expected = reader_.read(wktExpected);
std::unique_ptr<Geometry> actual = GeometryPrecisionReducer::reducePointwise(*g, pm_fixed_);
- ensure_equals_geometry(expected.get(), actual.get());
+ ensure_equals_exact_geometry_xyzm(expected.get(), actual.get(), 0);
ensure("Factories are not the same", expected->getFactory() == actual->getFactory());
}
@@ -409,7 +409,65 @@ void object::test<28> ()
"MULTIPOLYGON(((0 0, 1 0, 1 1, 0 1, 0 0)), ((10 10, 11 10, 11 11, 10 11, 10 10)))");
}
+template<>
+template<>
+void object::test<29>()
+{
+ set_test_name("CircularString pointwise");
+ checkReducePointwise("CIRCULARSTRING (1.23 2.34, 4.56 5.67, 8.910 3.21)",
+ "CIRCULARSTRING (1 2, 5 6, 9 3)");
+}
+
+template<>
+template<>
+void object::test<30>()
+{
+ set_test_name("CompoundCurve pointwise");
+
+ checkReducePointwise("COMPOUNDCURVE ((0 0, 1.23 2.34), CIRCULARSTRING (1.23 2.34, 4.56 5.67, 8.910 3.21), (8.91 3.21, 10 10))",
+ "COMPOUNDCURVE ((0 0, 1 2), CIRCULARSTRING(1 2, 5 6, 9 3), (9 3, 10 10))");
+}
+
+template<>
+template<>
+void object::test<31>()
+{
+ set_test_name("CurvePolygon pointwise");
+
+ // CompoundCurve shell, no holes
+ checkReducePointwise("CURVEPOLYGON (COMPOUNDCURVE ((8.91 3.21, 1.23 2.34), CIRCULARSTRING (1.23 2.34, 4.56 5.67, 8.910 3.21)))",
+ "CURVEPOLYGON (COMPOUNDCURVE ((9 3, 1 2), CIRCULARSTRING (1 2, 5 6, 9 3)))");
+
+ // LineString shell, CircularString hole
+ checkReducePointwise("CURVEPOLYGON ((0 0, 10 0, 10.1 10, 0 10, 0 0), CIRCULARSTRING (5 5, 6 6, 7 5.4, 6 4, 5 5))",
+ "CURVEPOLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), CIRCULARSTRING (5 5, 6 6, 7 5, 6 4, 5 5))");
+
+ // CircularString shell, LineString hole, CompoundCurve hole
+ checkReducePointwise(
+ "CURVEPOLYGON (CIRCULARSTRING (-5 0, 0 5.2, 5 0, 0 -5, -5 0), (0 0, 1 0, 1 1.3, 0 1, 0 0), COMPOUNDCURVE((-2 -2, 0 -2), CIRCULARSTRING (0 -2, -1 -0.8, -2 -2)))",
+ "CURVEPOLYGON (CIRCULARSTRING (-5 0, 0 5, 5 0, 0 -5, -5 0), (0 0, 1 0, 1 1, 0 1, 0 0), COMPOUNDCURVE((-2 -2, 0 -2), CIRCULARSTRING (0 -2, -1 -1, -2 -2)))");
+}
+
+template<>
+template<>
+void object::test<32>()
+{
+ set_test_name("MultiCurve pointwise");
+
+ checkReducePointwise("MULTICURVE ((100.1 100, 102 102), COMPOUNDCURVE ((0 0, 1.23 2.34), CIRCULARSTRING (1.23 2.34, 4.56 5.67, 8.910 3.21), (8.91 3.21, 10 10)))",
+ "MULTICURVE ((100 100, 102 102), COMPOUNDCURVE ((0 0, 1 2), CIRCULARSTRING(1 2, 5 6, 9 3), (9 3, 10 10)))");
+}
+
+template<>
+template<>
+void object::test<33>()
+{
+ set_test_name("MultiSurface pointwise");
+
+ checkReducePointwise("MULTISURFACE(CURVEPOLYGON (COMPOUNDCURVE ((8.91 3.21, 1.23 2.34), CIRCULARSTRING (1.23 2.34, 4.56 5.67, 8.910 3.21))), ((5 0, 10.2 0, 10 2, 5 0)))",
+ "MULTISURFACE(CURVEPOLYGON (COMPOUNDCURVE ((9 3, 1 2), CIRCULARSTRING (1 2, 5 6, 9 3))), ((5 0, 10 0, 10 2, 5 0)))");
+}
template<>
template<>
-----------------------------------------------------------------------
Summary of changes:
capi/geos_c.h.in | 1 +
include/geos/geom/Quadrant.h | 4 +-
include/geos/geom/util/GeometryTransformer.h | 25 ++
.../geos/operation/overlay/snap/GeometrySnapper.h | 10 +-
src/geom/util/Densifier.cpp | 4 +-
src/geom/util/GeometryTransformer.cpp | 271 +++++++++++++++++++--
src/operation/overlay/snap/GeometrySnapper.cpp | 6 +
src/simplify/TopologyPreservingSimplifier.cpp | 3 +
.../precision/GeometryPrecisionReducerTest.cpp | 62 ++++-
9 files changed, 351 insertions(+), 35 deletions(-)
hooks/post-receive
--
GEOS
More information about the geos-commits
mailing list