Skip to content

Commit 4907d59

Browse files
committed
Add envelope condition in support of RelateNG
1 parent 6201229 commit 4907d59

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

include/geos/noding/MCIndexSegmentSetMutualIntersector.h

+18-3
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@
2020
#include <geos/index/strtree/TemplateSTRtree.h> // inherited
2121

2222
namespace geos {
23+
namespace geom {
24+
class Envelope;
25+
}
2326
namespace index {
24-
class SpatialIndex;
27+
class SpatialIndex;
2528
}
2629
namespace noding {
27-
class SegmentString;
28-
class SegmentIntersector;
30+
class SegmentString;
31+
class SegmentIntersector;
2932
}
3033
}
3134

@@ -51,6 +54,17 @@ class MCIndexSegmentSetMutualIntersector : public SegmentSetMutualIntersector {
5154
, nOverlaps(0)
5255
, overlapTolerance(p_tolerance)
5356
, indexBuilt(false)
57+
, envelope(nullptr)
58+
{}
59+
60+
MCIndexSegmentSetMutualIntersector(const geom::Envelope* p_envelope)
61+
: monoChains()
62+
, indexCounter(0)
63+
, processCounter(0)
64+
, nOverlaps(0)
65+
, overlapTolerance(0.0)
66+
, indexBuilt(false)
67+
, envelope(p_envelope)
5468
{}
5569

5670
MCIndexSegmentSetMutualIntersector()
@@ -117,6 +131,7 @@ class MCIndexSegmentSetMutualIntersector : public SegmentSetMutualIntersector {
117131
*/
118132
bool indexBuilt;
119133
MonoChains indexChains;
134+
const geom::Envelope* envelope;
120135

121136
void addToIndex(SegmentString* segStr);
122137

src/noding/MCIndexSegmentSetMutualIntersector.cpp

+11-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*
1313
**********************************************************************/
1414

15+
#include <geos/geom/Envelope.h>
1516
#include <geos/noding/MCIndexSegmentSetMutualIntersector.h>
1617
#include <geos/noding/SegmentSetMutualIntersector.h>
1718
#include <geos/noding/SegmentString.h>
@@ -47,8 +48,14 @@ MCIndexSegmentSetMutualIntersector::addToMonoChains(SegmentString* segStr)
4748
{
4849
if (segStr->size() == 0)
4950
return;
51+
MonoChains segChains;
5052
MonotoneChainBuilder::getChains(segStr->getCoordinates(),
51-
segStr, monoChains);
53+
segStr, segChains);
54+
for (auto& mc : segChains) {
55+
if (envelope == nullptr || envelope->intersects(mc.getEnvelope())) {
56+
monoChains.push_back(mc);
57+
}
58+
}
5259
}
5360

5461

@@ -89,7 +96,9 @@ MCIndexSegmentSetMutualIntersector::process(SegmentString::ConstVect* segStrings
8996
{
9097
if (!indexBuilt) {
9198
for (auto& mc: indexChains) {
92-
index.insert(&(mc.getEnvelope(overlapTolerance)), &mc);
99+
if (envelope == nullptr || envelope->intersects(mc.getEnvelope())) {
100+
index.insert(&(mc.getEnvelope(overlapTolerance)), &mc);
101+
}
93102
}
94103
indexBuilt = true;
95104
}

0 commit comments

Comments
 (0)