41
41
#include < geos/operation/buffer/OffsetCurve.h>
42
42
#include < geos/operation/cluster/GeometryDistanceClusterFinder.h>
43
43
#include < geos/operation/cluster/GeometryIntersectsClusterFinder.h>
44
+ #include < geos/coverage/CoverageSimplifier.h>
44
45
#include < geos/coverage/CoverageValidator.h>
45
46
#include < geos/operation/linemerge/LineMerger.h>
46
47
#include < geos/operation/distance/DistanceOp.h>
@@ -106,6 +107,14 @@ struct GeometryOpCreator {
106
107
std::function<GeometryOp *( std::string name )> create;
107
108
} ;
108
109
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
+
109
118
/*
110
119
* Static array of operation definitions.
111
120
* All metadata for an operation is defined here.
@@ -838,6 +847,20 @@ std::vector<GeometryOpCreator> opRegistry {
838
847
839
848
// ============= category: Polygonal Coverage ==================
840
849
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
+ }},
841
864
{" coverageUnionNG" , [](std::string name) { return GeometryOp::createAgg (name,
842
865
catCoverage, " union a polygonal coverage" ,
843
866
[](const std::unique_ptr<Geometry>& geom) {
@@ -853,16 +876,11 @@ std::vector<GeometryOpCreator> opRegistry {
853
876
{" coverageValidate" , [](std::string name) { return GeometryOp::createAgg (name,
854
877
catCoverage, " validate a polygonal coverage" ,
855
878
[](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);
862
880
std::vector<std::unique_ptr<Geometry>> invalidList
863
881
= geos::coverage::CoverageValidator::validate (coverage);
864
882
865
- // -- create GeometryCollection from result list
883
+ // result may contain nulls, so remove them
866
884
std::vector<std::unique_ptr<const Geometry>> resultList;
867
885
for (std::size_t i = 0 ; i < invalidList.size (); i++) {
868
886
if (invalidList[i] != nullptr ) {
@@ -1041,7 +1059,7 @@ Result::toString() {
1041
1059
case typeGeomList:
1042
1060
return metadata ();
1043
1061
}
1044
- return " Value for Unknonwn type" ;
1062
+ return " Value for Unknown type" ;
1045
1063
}
1046
1064
1047
1065
std::string
0 commit comments