001: /*
002: * The JTS Topology Suite is a collection of Java classes that
003: * implement the fundamental operations required to validate a given
004: * geo-spatial data set to a known topological specification.
005: *
006: * Copyright (C) 2001 Vivid Solutions
007: *
008: * This library is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Lesser General Public
010: * License as published by the Free Software Foundation; either
011: * version 2.1 of the License, or (at your option) any later version.
012: *
013: * This library is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public
019: * License along with this library; if not, write to the Free Software
020: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021: *
022: * For more information, contact:
023: *
024: * Vivid Solutions
025: * Suite #1A
026: * 2328 Government Street
027: * Victoria BC V8T 5G5
028: * Canada
029: *
030: * (250)385-6040
031: * www.vividsolutions.com
032: */
033: package com.vividsolutions.jts.generator;
034:
035: import java.util.ArrayList;
036:
037: import com.vividsolutions.jts.geom.*;
038:
039: /**
040: *
041: * Cascades the effort of creating a set of topologically valid geometries.
042: *
043: * @author David Zwiers, Vivid Solutions.
044: */
045: public class MultiGenerator extends GeometryGenerator {
046:
047: private GeometryGenerator generator = null;
048: private int numberGeometries = 2;
049: private int generationAlgorithm = 0;
050:
051: /**
052: * Grid style blocks
053: */
054: public static final int BOX = 0;
055: /**
056: * vertical strips
057: */
058: public static final int VERT = 1;
059: /**
060: * Horizontal strips
061: */
062: public static final int HORZ = 2;
063:
064: /**
065: * @param generator
066: */
067: public MultiGenerator(GeometryGenerator generator) {
068: this .generator = generator;
069: }
070:
071: /**
072: * Creates a geometry collection representing the set of child geometries created.
073: *
074: * @see #setNumberGeometries(int)
075: * @see com.vividsolutions.jts.generator.GeometryGenerator#create()
076: *
077: * @see #BOX
078: * @see #VERT
079: * @see #HORZ
080: *
081: * @throws NullPointerException when the generator is missing
082: * @throws IllegalStateException when the number of child geoms is too small
083: * @throws IllegalStateException when the selected alg. is invalid
084: */
085: public Geometry create() {
086: if (generator == null)
087: throw new NullPointerException("Missing child generator");
088:
089: if (numberGeometries < 1)
090: throw new IllegalStateException(
091: "Too few child geoms to create");
092:
093: ArrayList geoms = new ArrayList(numberGeometries);
094:
095: GridGenerator grid = GeometryGenerator.createGridGenerator();
096: grid.setBoundingBox(boundingBox);
097: grid.setGeometryFactory(geometryFactory);
098:
099: switch (generationAlgorithm) {
100: case BOX:
101:
102: int nrow = (int) Math.sqrt(numberGeometries);
103: int ncol = numberGeometries / nrow;
104: grid.setNumberRows(nrow);
105: grid.setNumberColumns(ncol);
106:
107: break;
108: case VERT:
109:
110: grid.setNumberRows(1);
111: grid.setNumberColumns(numberGeometries);
112:
113: break;
114: case HORZ:
115:
116: grid.setNumberRows(numberGeometries);
117: grid.setNumberColumns(1);
118:
119: break;
120: default:
121: throw new IllegalStateException("Invalid Alg. Specified");
122: }
123:
124: while (grid.canCreate()) {
125: generator.setBoundingBox(grid.createEnv());
126: geoms.add(generator.create());
127: }
128:
129: // yes ... there are better ways
130: if (generator instanceof PointGenerator) {
131: return geometryFactory.createMultiPoint((Point[]) geoms
132: .toArray(new Point[numberGeometries]));
133: } else {
134: if (generator instanceof LineStringGenerator) {
135: return geometryFactory
136: .createMultiLineString((LineString[]) geoms
137: .toArray(new LineString[numberGeometries]));
138: } else {
139: if (generator instanceof PolygonGenerator) {
140: return geometryFactory
141: .createMultiPolygon((Polygon[]) geoms
142: .toArray(new Polygon[numberGeometries]));
143: } else {
144: // same as multi
145: return geometryFactory
146: .createGeometryCollection((Geometry[]) geoms
147: .toArray(new Geometry[numberGeometries]));
148: }
149: }
150: }
151: }
152:
153: /**
154: * @return Returns the numberGeometries.
155: */
156: public int getNumberGeometries() {
157: return numberGeometries;
158: }
159:
160: /**
161: * @param numberGeometries The numberGeometries to set.
162: */
163: public void setNumberGeometries(int numberGeometries) {
164: this .numberGeometries = numberGeometries;
165: }
166:
167: /**
168: * @return Returns the generator.
169: */
170: public GeometryGenerator getGenerator() {
171: return generator;
172: }
173:
174: /**
175: * @see com.vividsolutions.jts.generator.GeometryGenerator#setBoundingBox(com.vividsolutions.jts.geom.Envelope)
176: */
177: public void setBoundingBox(Envelope boundingBox) {
178: super .setBoundingBox(boundingBox);
179: if (generator != null)
180: generator.setBoundingBox(boundingBox);
181: }
182:
183: /**
184: * @see com.vividsolutions.jts.generator.GeometryGenerator#setDimensions(int)
185: */
186: public void setDimensions(int dimensions) {
187: super .setDimensions(dimensions);
188: if (generator != null)
189: generator.setDimensions(dimensions);
190: }
191:
192: /**
193: * @see com.vividsolutions.jts.generator.GeometryGenerator#setGeometryFactory(com.vividsolutions.jts.geom.GeometryFactory)
194: */
195: public void setGeometryFactory(GeometryFactory geometryFactory) {
196: super.setGeometryFactory(geometryFactory);
197: if (generator != null)
198: generator.setGeometryFactory(geometryFactory);
199: }
200: }
|