1212package org .locationtech .jtstest .function ;
1313
1414import java .util .Arrays ;
15- import java .util .List ;
1615
16+ import org .locationtech .jts .algorithm .distance .DiscreteHausdorffDistance ;
17+ import org .locationtech .jts .coverage .CoverageCleaner ;
1718import org .locationtech .jts .coverage .CoverageGapFinder ;
1819import org .locationtech .jts .coverage .CoveragePolygonValidator ;
1920import org .locationtech .jts .coverage .CoverageSimplifier ;
2021import org .locationtech .jts .coverage .CoverageUnion ;
2122import org .locationtech .jts .coverage .CoverageValidator ;
2223import org .locationtech .jts .geom .Geometry ;
23- import org .locationtech .jts .geom .util . PolygonExtracter ;
24+ import org .locationtech .jts .geom .GeometryFactory ;
2425import org .locationtech .jtstest .geomfunction .Metadata ;
2526
2627public 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