/* * 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.index; import java.io.PrintStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.index.strtree.AbstractNode; import org.locationtech.jts.index.strtree.Boundable; import org.locationtech.jts.index.strtree.STRtree; /** * @version 1.7 */ public class STRtreeDemo { public STRtreeDemo() { } public static class TestTree extends STRtree { public TestTree(int nodeCapacity) { super(nodeCapacity); } public List boundablesAtLevel(int level) { return super.boundablesAtLevel(level); } public AbstractNode getRoot() { return root; } public List createParentBoundables(List verticalSlice, int newLevel) { return super.createParentBoundables(verticalSlice, newLevel); } public List[] verticalSlices(List childBoundables, int size) { return super.verticalSlices(childBoundables, size); } public List createParentBoundablesFromVerticalSlice(List childBoundables, int newLevel) { return super.createParentBoundablesFromVerticalSlice(childBoundables, newLevel); } } private static void initTree(TestTree t, List sourceEnvelopes) { for (Iterator i = sourceEnvelopes.iterator(); i.hasNext(); ) { Envelope sourceEnvelope = (Envelope) i.next(); t.insert(sourceEnvelope, sourceEnvelope); } t.build(); } public static void main(String[] args) throws Exception { List envelopes = sourceData(); TestTree t = new TestTree(NODE_CAPACITY); initTree(t, envelopes); PrintStream printStream = System.out; printSourceData(envelopes, printStream); printLevels(t, printStream); } public static void printSourceData(List sourceEnvelopes, PrintStream out) { out.println("============ Source Data ============\n"); out.print("GEOMETRYCOLLECTION("); boolean first = true; for (Iterator i = sourceEnvelopes.iterator(); i.hasNext(); ) { Envelope e = (Envelope) i.next(); Geometry g = factory.createPolygon(factory.createLinearRing(new Coordinate[] { new Coordinate(e.getMinX(), e.getMinY()), new Coordinate(e.getMinX(), e.getMaxY()), new Coordinate(e.getMaxX(), e.getMaxY()), new Coordinate(e.getMaxX(), e.getMinY()), new Coordinate(e.getMinX(), e.getMinY()) }), null); if (first) { first = false; } else { out.print(","); } out.print(g); } out.println(")\n"); } private static List sourceData() { ArrayList envelopes = new ArrayList(); for (int i = 0; i < ITEM_COUNT; i++) { envelopes.add(randomRectangle().getEnvelopeInternal()); } return envelopes; } private static final double EXTENT = 100; private static final double MAX_ITEM_EXTENT = 15; private static final double MIN_ITEM_EXTENT = 3; private static final int ITEM_COUNT = 20; private static final int NODE_CAPACITY = 4; private static GeometryFactory factory = new GeometryFactory(); private static Polygon randomRectangle() { double width = MIN_ITEM_EXTENT + ((MAX_ITEM_EXTENT-MIN_ITEM_EXTENT) * Math.random()); double height = MIN_ITEM_EXTENT + ((MAX_ITEM_EXTENT-MIN_ITEM_EXTENT) * Math.random()); double bottom = EXTENT * Math.random(); double left = EXTENT * Math.random(); double top = bottom + height; double right = left + width; return factory.createPolygon(factory.createLinearRing(new Coordinate[]{ new Coordinate(left, bottom), new Coordinate(right, bottom), new Coordinate(right, top), new Coordinate(left, top), new Coordinate(left, bottom) }), null); } public static void printLevels(TestTree t, PrintStream out) { for (int i = 0; i <= t.getRoot().getLevel(); i++) { printBoundables(t.boundablesAtLevel(i), "Level " + i, out); } } public static void printBoundables(List boundables, String title, PrintStream out) { out.println("============ " + title + " ============\n"); out.print("GEOMETRYCOLLECTION("); boolean first = true; for (Iterator i = boundables.iterator(); i.hasNext(); ) { Boundable boundable = (Boundable) i.next(); if (first) { first = false; } else { out.print(","); } out.print(toString(boundable)); } out.println(")\n"); } private static String toString(Boundable b) { return "POLYGON((" + envelope(b).getMinX() + " " + envelope(b).getMinY() + ", " + envelope(b).getMinX() + " " + envelope(b).getMaxY() + ", " + envelope(b).getMaxX() + " " + envelope(b).getMaxY() + ", " + envelope(b).getMaxX() + " " + envelope(b).getMinY() + "," + envelope(b).getMinX() + " " + envelope(b).getMinY() + "))"; } private static Envelope envelope(Boundable b) { return (Envelope)b.getBounds(); } }