/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2011, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.grid; import org.geotools.grid.ortholine.OrthoLineFeatureBuilder; import java.util.Collection; import org.geotools.data.DataUtilities; import org.geotools.data.collection.ListFeatureCollection; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.grid.ortholine.OrthoLineBuilder; import org.geotools.grid.ortholine.OrthoLineDef; import org.geotools.referencing.CRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * A utility class to create line grids with basic attributes. * @author mbedward * @since 8.0 * * * @source $URL: http://svn.osgeo.org/geotools/trunk/modules/unsupported/grid/src/main/java/org/geotools/grid/Lines.java $ * @version $Id: Grids.java 37149 2011-05-10 11:47:02Z mbedward $ */ public class Lines { /** * Creates a grid of ortho-lines. Lines are parallel to the bounding envelope's * X-axis, Y-axis or both according to the provided line definitions. * * @param bounds the bounding envelope * @param lineDefs one or more ortho-line definitions * @return the vector grid of lines * * @see OrthoLineDef */ public static SimpleFeatureSource createOrthoLines(ReferencedEnvelope bounds, Collection<OrthoLineDef> lineDefs) { return createOrthoLines(bounds, lineDefs, 0.0); } /** * Creates a grid of ortho-lines. Lines are parallel to the bounding envelope's * X-axis, Y-axis or both according to the provided line definitions. * Densified lines (lines strings with additional vertices along their length) can be * created by setting the value of {@code vertexSpacing} greater than zero; if so, any * lines more than twice as long as this value will be densified. * * @param bounds the bounding envelope * @param lineDefs one or more ortho-line definitions * @param vertexSpacing maximum distance between adjacent vertices along a line * @return the vector grid of lines */ public static SimpleFeatureSource createOrthoLines(ReferencedEnvelope bounds, Collection<OrthoLineDef> lineDefs, double vertexSpacing) { return createOrthoLines(bounds, lineDefs, vertexSpacing, new OrthoLineFeatureBuilder(bounds.getCoordinateReferenceSystem())); } /** * Creates a grid of ortho-lines. Lines are parallel to the bounding envelope's * X-axis, Y-axis or both according to the provided line definitions. * Line features will be created using the supplied feature builder. * Densified lines (lines strings with additional vertices along their length) can be * created by setting the value of {@code vertexSpacing} greater than zero; if so, any * lines more than twice as long as this value will be densified. * * @param bounds the bounding envelope * @param lineDefs one or more ortho-line definitions * @param vertexSpacing maximum distance between adjacent vertices along a line * @param lineFeatureBuilder feature build to create line features * @return the vector grid of lines */ public static SimpleFeatureSource createOrthoLines(ReferencedEnvelope bounds, Collection<OrthoLineDef> lineDefs, double vertexSpacing, GridFeatureBuilder lineFeatureBuilder) { if (bounds == null || bounds.isEmpty() || bounds.isNull()) { throw new IllegalArgumentException("The bounds should not be null or empty"); } if (lineDefs == null || lineDefs.isEmpty()) { throw new IllegalArgumentException("One or more line controls must be provided"); } CoordinateReferenceSystem boundsCRS = bounds.getCoordinateReferenceSystem(); CoordinateReferenceSystem builderCRS = lineFeatureBuilder.getType().getCoordinateReferenceSystem(); if (boundsCRS != null && builderCRS != null && !CRS.equalsIgnoreMetadata(boundsCRS, builderCRS)) { throw new IllegalArgumentException("Different CRS set for bounds and the feature builder"); } final SimpleFeatureCollection fc = new ListFeatureCollection(lineFeatureBuilder.getType()); OrthoLineBuilder lineBuilder = new OrthoLineBuilder(bounds); lineBuilder.buildGrid(lineDefs, lineFeatureBuilder, vertexSpacing, fc); return DataUtilities.source(fc); } }