Skip to content

Commit 93540f4

Browse files
committed
Add geosop coverageSimplify
1 parent d3d9df7 commit 93540f4

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

util/geosop/GeometryOp.cpp

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include <geos/operation/buffer/OffsetCurve.h>
4242
#include <geos/operation/cluster/GeometryDistanceClusterFinder.h>
4343
#include <geos/operation/cluster/GeometryIntersectsClusterFinder.h>
44+
#include <geos/coverage/CoverageSimplifier.h>
4445
#include <geos/coverage/CoverageValidator.h>
4546
#include <geos/operation/linemerge/LineMerger.h>
4647
#include <geos/operation/distance/DistanceOp.h>
@@ -106,6 +107,14 @@ struct GeometryOpCreator {
106107
std::function<GeometryOp *( std::string name )> create;
107108
} ;
108109

110+
std::vector<const Geometry*> toList(const std::unique_ptr<Geometry>& geom) {
111+
std::vector<const Geometry*> geomList;
112+
for (std::size_t i = 0; i < geom->getNumGeometries(); i++) {
113+
geomList.emplace_back( geom->getGeometryN(i));
114+
}
115+
return geomList;
116+
}
117+
109118
/*
110119
* Static array of operation definitions.
111120
* All metadata for an operation is defined here.
@@ -838,6 +847,20 @@ std::vector<GeometryOpCreator> opRegistry {
838847

839848
//============= category: Polygonal Coverage ==================
840849

850+
{"coverageSimplify", [](std::string name) { return GeometryOp::createAgg(name,
851+
catCoverage, "simplify a polygonal coverage by a distance tolerance",
852+
[](const std::unique_ptr<Geometry>& geom, double d) {
853+
std::vector<const Geometry*> coverage = toList(geom);
854+
std::vector<std::unique_ptr<Geometry>> result
855+
= geos::coverage::CoverageSimplifier::simplify(coverage, d);
856+
//-- convert list type (be nice to avoid this)
857+
std::vector<std::unique_ptr<const Geometry>> resultList;
858+
for (std::size_t i = 0; i < result.size(); i++) {
859+
resultList.emplace_back( std::move(result[i]) );
860+
}
861+
return new Result( std::move(resultList) );
862+
});
863+
}},
841864
{"coverageUnionNG", [](std::string name) { return GeometryOp::createAgg(name,
842865
catCoverage, "union a polygonal coverage",
843866
[](const std::unique_ptr<Geometry>& geom) {
@@ -853,16 +876,11 @@ std::vector<GeometryOpCreator> opRegistry {
853876
{"coverageValidate", [](std::string name) { return GeometryOp::createAgg(name,
854877
catCoverage, "validate a polygonal coverage",
855878
[](const std::unique_ptr<Geometry>& geom) {
856-
//-- create list of input polygons
857-
std::vector<const Geometry*> coverage;
858-
for (std::size_t i = 0; i < geom->getNumGeometries(); i++) {
859-
coverage.emplace_back( geom->getGeometryN(i));
860-
}
861-
879+
std::vector<const Geometry*> coverage = toList(geom);
862880
std::vector<std::unique_ptr<Geometry>> invalidList
863881
= geos::coverage::CoverageValidator::validate(coverage);
864882

865-
//-- create GeometryCollection from result list
883+
// result may contain nulls, so remove them
866884
std::vector<std::unique_ptr<const Geometry>> resultList;
867885
for (std::size_t i = 0; i < invalidList.size(); i++) {
868886
if (invalidList[i] != nullptr) {
@@ -1041,7 +1059,7 @@ Result::toString() {
10411059
case typeGeomList:
10421060
return metadata();
10431061
}
1044-
return "Value for Unknonwn type";
1062+
return "Value for Unknown type";
10451063
}
10461064

10471065
std::string

0 commit comments

Comments
 (0)