Skip to content

Commit e7cd7cf

Browse files
authored
Add CoverageCleaner (#1126)
1 parent 7835f24 commit e7cd7cf

File tree

7 files changed

+1163
-20
lines changed

7 files changed

+1163
-20
lines changed

modules/app/src/main/java/org/locationtech/jtstest/function/CoverageFunctions.java

Lines changed: 118 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@
1212
package org.locationtech.jtstest.function;
1313

1414
import java.util.Arrays;
15-
import java.util.List;
1615

16+
import org.locationtech.jts.algorithm.distance.DiscreteHausdorffDistance;
17+
import org.locationtech.jts.coverage.CoverageCleaner;
1718
import org.locationtech.jts.coverage.CoverageGapFinder;
1819
import org.locationtech.jts.coverage.CoveragePolygonValidator;
1920
import org.locationtech.jts.coverage.CoverageSimplifier;
2021
import org.locationtech.jts.coverage.CoverageUnion;
2122
import org.locationtech.jts.coverage.CoverageValidator;
2223
import org.locationtech.jts.geom.Geometry;
23-
import org.locationtech.jts.geom.util.PolygonExtracter;
24+
import org.locationtech.jts.geom.GeometryFactory;
2425
import org.locationtech.jtstest.geomfunction.Metadata;
2526

2627
public class CoverageFunctions {
@@ -48,9 +49,9 @@ public static Geometry validateWithGaps(Geometry geom,
4849
}
4950

5051
public static Geometry findGaps(Geometry geom,
51-
@Metadata(title="Gap width")
52-
double gapWidth) {
53-
return CoverageGapFinder.findGaps(toGeometryArray(geom),gapWidth);
52+
@Metadata(title="Max Gap Width")
53+
double maxGapWidth) {
54+
return CoverageGapFinder.findGaps(toGeometryArray(geom), maxGapWidth);
5455
}
5556

5657
@Metadata(description="Fast Union of a coverage")
@@ -125,7 +126,7 @@ public static Geometry simplifyTolerances(Geometry coverage,
125126
Geometry[] cov = toGeometryArray(coverage);
126127
double[] tolerances = tolerances(tolerancesCSV, cov.length);
127128
Geometry[] result = CoverageSimplifier.simplify(cov, tolerances);
128-
return FunctionsUtil.buildGeometry(result);
129+
return coverage.getFactory().createGeometryCollection(result);
129130
}
130131

131132
private static double[] tolerances(String csvList, int len) {
@@ -137,6 +138,117 @@ private static double[] tolerances(String csvList, int len) {
137138
return tols;
138139
}
139140

141+
//-------------------------------------------------------
142+
143+
public static Geometry clean(Geometry coverage,
144+
@Metadata(title="Snap Distance")
145+
double snapDistance,
146+
@Metadata(title="Max Gap Width")
147+
double maxGapWidth) {
148+
Geometry[] cov = toGeometryArray(coverage);
149+
Geometry[] result = CoverageCleaner.clean(cov, snapDistance, maxGapWidth);
150+
return coverage.getFactory().createGeometryCollection(result);
151+
}
152+
153+
public static Geometry cleanSnap(Geometry coverage,
154+
@Metadata(title="Snap Distance")
155+
double snapDistance) {
156+
Geometry[] cov = toGeometryArray(coverage);
157+
Geometry[] result = CoverageCleaner.clean(cov, snapDistance, 0);
158+
return coverage.getFactory().createGeometryCollection(result);
159+
}
160+
161+
public static Geometry cleanMergeMaxArea(Geometry coverage,
162+
@Metadata(title="Max Gap Width")
163+
double maxGapWidth) {
164+
Geometry[] cov = toGeometryArray(coverage);
165+
Geometry[] result = CoverageCleaner.cleanOverlapGap(cov, CoverageCleaner.MERGE_MAX_AREA,
166+
maxGapWidth);
167+
return coverage.getFactory().createGeometryCollection(result);
168+
}
169+
170+
public static Geometry cleanMergeMinArea(Geometry coverage,
171+
@Metadata(title="Max Gap Width")
172+
double maxGapWidth) {
173+
Geometry[] cov = toGeometryArray(coverage);
174+
Geometry[] result = CoverageCleaner.cleanOverlapGap(cov, CoverageCleaner.MERGE_MIN_AREA,
175+
maxGapWidth);
176+
return coverage.getFactory().createGeometryCollection(result);
177+
}
178+
179+
public static Geometry cleanGapWidth(Geometry coverage,
180+
@Metadata(title="Max Gap Width")
181+
double maxGapWidth) {
182+
Geometry[] cov = toGeometryArray(coverage);
183+
Geometry[] result = CoverageCleaner.cleanGapWidth(cov, maxGapWidth);
184+
return coverage.getFactory().createGeometryCollection(result);
185+
}
186+
187+
public static Geometry cleanedOverlaps(Geometry coverage) {
188+
Geometry[] cov = toGeometryArray(coverage);
189+
CoverageCleaner cc = new CoverageCleaner(cov);
190+
cc.clean();
191+
Geometry[] overlaps = GeometryFactory.toGeometryArray(
192+
cc.getOverlaps());
193+
return coverage.getFactory().createGeometryCollection(overlaps);
194+
}
195+
196+
public static Geometry cleanedOverlapsSnap(Geometry coverage,
197+
@Metadata(title="Snap Distance")
198+
double snapDistance) {
199+
Geometry[] cov = toGeometryArray(coverage);
200+
CoverageCleaner cc = new CoverageCleaner(cov);
201+
cc.setSnappingDistance(snapDistance);
202+
cc.clean();
203+
Geometry[] overlaps = GeometryFactory.toGeometryArray(
204+
cc.getOverlaps());
205+
return coverage.getFactory().createGeometryCollection(overlaps);
206+
}
207+
208+
public static Geometry cleanedGaps(Geometry coverage,
209+
@Metadata(title="Max Gap Width")
210+
double maxGapWidth) {
211+
Geometry[] cov = toGeometryArray(coverage);
212+
CoverageCleaner cc = new CoverageCleaner(cov);
213+
cc.setGapMaximumWidth(maxGapWidth);
214+
cc.clean();
215+
Geometry[] gaps = GeometryFactory.toGeometryArray(
216+
cc.getMergedGaps());
217+
return coverage.getFactory().createGeometryCollection(gaps);
218+
}
219+
220+
public static Geometry cleanedGapsSnap(Geometry coverage,
221+
@Metadata(title="Snap Distance")
222+
double snapDistance,
223+
@Metadata(title="Max Gap Width")
224+
double maxGapWidth) {
225+
Geometry[] cov = toGeometryArray(coverage);
226+
CoverageCleaner cc = new CoverageCleaner(cov);
227+
cc.setSnappingDistance(snapDistance);
228+
cc.setGapMaximumWidth(maxGapWidth);
229+
cc.clean();
230+
Geometry[] gaps = GeometryFactory.toGeometryArray(
231+
cc.getMergedGaps());
232+
return coverage.getFactory().createGeometryCollection(gaps);
233+
}
234+
235+
//--------------------------------------------------
236+
237+
public static Geometry maxDistances(Geometry coverage1, Geometry coverage2) {
238+
if (coverage1.getNumGeometries() != coverage2.getNumGeometries()) {
239+
throw new IllegalArgumentException("Coverages must have same number of elements");
240+
}
241+
Geometry[] hd = new Geometry[coverage1.getNumGeometries()];
242+
for (int i = 0; i < coverage1.getNumGeometries(); i++) {
243+
Geometry e1 = coverage1.getGeometryN(i);
244+
Geometry e2 = coverage2.getGeometryN(i);
245+
hd[i] = DiscreteHausdorffDistance.distanceLine(e1, e2);
246+
}
247+
return coverage1.getFactory().createGeometryCollection(hd);
248+
}
249+
250+
//====================================================================
251+
140252
private static Double[] toDoubleArray(String csvList) {
141253
return Arrays.stream(csvList.split(",")).map(Double::parseDouble).toArray(Double[]::new);
142254
}

0 commit comments

Comments
 (0)