/*
* Copyright (c) 2016 Vivid Solutions.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
*
* http://www.eclipse.org/org/documents/edl-v10.php.
*/
package org.locationtech.jts.operation.union;
import java.util.Collection;
import java.util.Iterator;
import org.locationtech.jts.algorithm.match.AreaSimilarityMeasure;
import org.locationtech.jts.algorithm.match.HausdorffSimilarityMeasure;
import org.locationtech.jts.algorithm.match.SimilarityMeasureCombiner;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.PrecisionModel;
import org.locationtech.jts.io.WKTReader;
/**
* Compares the results of CascadedPolygonUnion to Geometry.union()
* using shape similarity measures.
*
* @author mbdavis
*
*/
public class CascadedPolygonUnionTester
{
public static final double MIN_SIMILARITY_MEAURE = 0.999999;;
static PrecisionModel pm = new PrecisionModel();
static GeometryFactory fact = new GeometryFactory(pm, 0);
static WKTReader wktRdr = new WKTReader(fact);
GeometryFactory geomFact = new GeometryFactory();
public CascadedPolygonUnionTester() {
}
public boolean test(Collection geoms, double minimumMeasure)
{
//System.out.println("Computing Iterated union");
Geometry union1 = unionIterated(geoms);
//System.out.println("Computing Cascaded union");
Geometry union2 = unionCascaded(geoms);
//System.out.println("Testing similarity with min measure = " + minimumMeasure);
double areaMeasure = (new AreaSimilarityMeasure()).measure(union1, union2);
double hausMeasure = (new HausdorffSimilarityMeasure()).measure(union1, union2);
double overallMeasure = SimilarityMeasureCombiner.combine(areaMeasure, hausMeasure);
//System.out.println(
// "Area measure = " + areaMeasure
// + " Hausdorff measure = " + hausMeasure
// + " Overall = " + overallMeasure);
return overallMeasure > minimumMeasure;
}
/*
private void OLDdoTest(String filename, double distanceTolerance)
throws IOException, ParseException
{
WKTFileReader fileRdr = new WKTFileReader(filename, wktRdr);
List geoms = fileRdr.read();
//System.out.println("Computing Iterated union");
Geometry union1 = unionIterated(geoms);
//System.out.println("Computing Cascaded union");
Geometry union2 = unionCascaded(geoms);
//System.out.println("Testing similarity with tolerance = " + distanceTolerance);
boolean isSameWithinTolerance = SimilarityValidator.isSimilar(union1, union2, distanceTolerance);
assertTrue(isSameWithinTolerance);
}
*/
public Geometry unionIterated(Collection geoms)
{
Geometry unionAll = null;
int count = 0;
for (Iterator i = geoms.iterator(); i.hasNext(); ) {
Geometry geom = (Geometry) i.next();
if (unionAll == null) {
unionAll = (Geometry) geom.clone();
}
else {
unionAll = unionAll.union(geom);
}
count++;
if (count % 100 == 0) {
System.out.print(".");
// System.out.println("Adding geom #" + count);
}
}
return unionAll;
}
public Geometry unionCascaded(Collection geoms)
{
return CascadedPolygonUnion.union(geoms);
}
}