/* * 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 test.jts.perf.operation.union; import java.util.Iterator; import java.util.List; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.PrecisionModel; import org.locationtech.jts.io.WKTReader; import org.locationtech.jts.io.WKTWriter; import org.locationtech.jts.operation.union.CascadedPolygonUnion; import org.locationtech.jts.util.Stopwatch; public class UnionPerfTester { public static final int CASCADED = 1; public static final int ITERATED = 2; public static final int BUFFER0 = 3; public static final int ORDERED = 4; public static void run(String testName, int testType, List polys) { UnionPerfTester test = new UnionPerfTester(polys); test.run(testName, testType); } public static void runAll(List polys) { UnionPerfTester test = new UnionPerfTester(polys); test.runAll(); } static final int MAX_ITER = 1; static PrecisionModel pm = new PrecisionModel(); static GeometryFactory fact = new GeometryFactory(pm, 0); static WKTReader wktRdr = new WKTReader(fact); static WKTWriter wktWriter = new WKTWriter(); Stopwatch sw = new Stopwatch(); GeometryFactory factory = new GeometryFactory(); private List polys; public UnionPerfTester(List polys) { this.polys = polys; } public void runAll() { System.out.println("# items: " + polys.size()); run("Cascaded", CASCADED, polys); // run("Buffer-0", BUFFER0, polys); run("Iterated", ITERATED, polys); } public void run(String testName, int testType) { System.out.println(); System.out.println("======= Union Algorithm: " + testName + " ==========="); Stopwatch sw = new Stopwatch(); for (int i = 0; i < MAX_ITER; i++) { Geometry union = null; switch (testType) { case CASCADED: union = unionCascaded(polys); break; case ITERATED: union = unionAllSimple(polys); break; case BUFFER0: union = unionAllBuffer(polys); break; } // printFormatted(union); } System.out.println("Finished in " + sw.getTimeString()); } void printFormatted(Geometry geom) { WKTWriter writer = new WKTWriter(); System.out.println(writer.writeFormatted(geom)); } public Geometry unionAllSimple(List 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 unionAllBuffer(List geoms) { Geometry gColl = factory.buildGeometry(geoms); Geometry unionAll = gColl.buffer(0.0); return unionAll; } public Geometry unionCascaded(List geoms) { return CascadedPolygonUnion.union(geoms); } /* public Geometry unionAllOrdered(List geoms) { // return OrderedUnion.union(geoms); } */ void printItemEnvelopes(List tree) { Envelope itemEnv = new Envelope(); for (Iterator i = tree.iterator(); i.hasNext(); ) { Object o = i.next(); if (o instanceof List) { printItemEnvelopes((List) o); } else if (o instanceof Geometry) { itemEnv.expandToInclude( ((Geometry) o).getEnvelopeInternal()); } } System.out.println(factory.toGeometry(itemEnv)); } }