Skip to content

Commit 2ad56c7

Browse files
authored
LineDissolver: Create geometries with dimensions matching input (#1373)
* LineDissolver: Create geometries with dimensions matching input * LineDissolver: Create CoordinateSequence as shared_ptr
1 parent 88e9956 commit 2ad56c7

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

include/geos/dissolve/LineDissolver.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ class GEOS_DLL LineDissolver {
8383
std::vector<std::unique_ptr<LineString>> lines;
8484
std::stack<HalfEdge*> nodeEdgeStack;
8585
DissolveHalfEdge* ringStartEdge = nullptr;
86+
bool constructZ = false;
87+
bool constructM = false;
8688

8789

8890
void computeResult();
@@ -136,7 +138,7 @@ class GEOS_DLL LineDissolver {
136138

137139
void buildRing(HalfEdge* eStartRing);
138140

139-
void addLine(std::unique_ptr<CoordinateSequence>& cs);
141+
void addLine(const std::shared_ptr<CoordinateSequence>& cs);
140142

141143

142144
public:

src/dissolve/LineDissolver.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ void
8888
LineDissolver::add(const LineString* lineString)
8989
{
9090
const CoordinateSequence* seq = lineString->getCoordinatesRO();
91+
constructZ |= seq->hasZ();
92+
constructM |= seq->hasM();
9193

9294
bool doneStart = false;
9395
for (std::size_t i = 1; i < seq->size(); i++) {
@@ -200,7 +202,7 @@ LineDissolver::updateRingStartEdge(DissolveHalfEdge* e)
200202
void
201203
LineDissolver::buildLine(HalfEdge* eStart)
202204
{
203-
std::unique_ptr<CoordinateSequence> line(new CoordinateSequence(0, 4));
205+
auto line = std::make_shared<CoordinateSequence>(0, constructZ, constructM);
204206
DissolveHalfEdge* e = static_cast<DissolveHalfEdge*>(eStart);
205207
ringStartEdge = nullptr;
206208

@@ -238,7 +240,7 @@ LineDissolver::buildLine(HalfEdge* eStart)
238240
void
239241
LineDissolver::buildRing(HalfEdge* eStartRing)
240242
{
241-
std::unique_ptr<CoordinateSequence> line(new CoordinateSequence(0, 4));
243+
auto line = std::make_shared<CoordinateSequence>(0, constructZ, constructM);
242244
HalfEdge* e = eStartRing;
243245

244246
// add first node
@@ -265,9 +267,9 @@ LineDissolver::buildRing(HalfEdge* eStartRing)
265267

266268
/* private */
267269
void
268-
LineDissolver::addLine(std::unique_ptr<CoordinateSequence>& cs)
270+
LineDissolver::addLine(const std::shared_ptr<CoordinateSequence>& cs)
269271
{
270-
auto ls = factory->createLineString(std::move(cs));
272+
auto ls = factory->createLineString(cs);
271273
lines.emplace_back(ls.release());
272274
}
273275

tests/unit/coverage/CoverageCleanerTest.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ struct test_coveragecleaner_data {
7777
{
7878
ensure_equals("checkEqual sizes", actual.size(), expected.size());
7979
for (std::size_t i = 0; i < actual.size(); i++) {
80+
ensure_equals("hasZ does not match", actual[i]->hasZ(), expected[i]->hasZ());
81+
ensure_equals("hasM does not match", actual[i]->hasM(), expected[i]->hasM());
8082
ensure_equals_geometry(actual[i], expected[i]);
8183
}
8284
}

0 commit comments

Comments
 (0)