001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2004-2006, Geotools Project Managment Committee (PMC)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: */
016: package org.geotools.validation.spatial;
017:
018: import java.util.logging.Level;
019: import java.util.logging.Logger;
020:
021: import org.geotools.feature.Feature;
022: import org.geotools.feature.FeatureType;
023: import org.geotools.validation.DefaultFeatureValidation;
024: import org.geotools.validation.ValidationResults;
025:
026: import com.vividsolutions.jts.geom.LineString;
027:
028: /**
029: * LineIsSingleSegmentFeatureValidation purpose.
030: *
031: * <p>
032: * Tests to see if a LineString is made of only one segment, meaning it only
033: * has two points. If the LineString has more than two points, the test fails.
034: * </p>
035: *
036: * <p>
037: * This method has been extended to work with MultiLineStrings - this is
038: * the most common format that shapefile appears in and as such is forcing
039: * our hand.
040: * </p>
041: *
042: * <p>
043: * Example Use:
044: * <pre><code>
045: * LineIsSingleSegmentFeatureValidation x = new LineIsSingleSegmentFeatureValidation("noSelfIntersectRoads", "Tests to see if a
046: * geometry intersects itself", new String[] {"road"});
047: * </code></pre>
048: * </p>
049: *
050: * @author bowens, Refractions Research, Inc.
051: * @author $Author: jive $ (last modification)
052: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/extension/validation/src/main/java/org/geotools/validation/spatial/LineMustBeASinglePartValidation.java $
053: * @version $Id: LineMustBeASinglePartValidation.java 27862 2007-11-12 19:51:19Z desruisseaux $
054: */
055: public class LineMustBeASinglePartValidation extends
056: DefaultFeatureValidation {
057: /** The logger for the validation module. */
058: private static final Logger LOGGER = org.geotools.util.logging.Logging
059: .getLogger("org.geotools.validation");
060:
061: /**
062: * LineIsSingleSegmentFeatureValidation constructor.
063: *
064: * <p>
065: * Description
066: * </p>
067: */
068: public LineMustBeASinglePartValidation() {
069: }
070:
071: /**
072: * Override getPriority.
073: *
074: * <p>
075: * Sets the priority level of this validation.
076: * </p>
077: *
078: * @return <code>PRIORITY_SIMPLE</code>
079: *
080: * @see org.geotools.validation.Validation#getPriority()
081: */
082: public int getPriority() {
083: return PRIORITY_SIMPLE;
084: }
085:
086: /**
087: * Override validate.
088: *
089: * <p>
090: * Tests to see if a LineString is made of only one segment, meaning it
091: * only has two points. If the LineString has more than two points, the
092: * test fails.
093: * </p>
094: *
095: * @param feature The Feature to be validated
096: * @param type The FeatureTypeInfo of the feature
097: * @param results The storage for error messages.
098: *
099: * @return True if the feature is simple (one segment).
100: *
101: * @see org.geotools.validation.FeatureValidation#validate(org.geotools.feature.Feature,
102: * org.geotools.feature.FeatureTypeInfo,
103: * org.geotools.validation.ValidationResults)
104: */
105: public boolean validate(Feature feature, FeatureType type,
106: ValidationResults results) {
107: LOGGER.setLevel(Level.ALL);
108:
109: LineString line = null;
110: try {
111: line = getDefaultLineString(feature);
112: } catch (ClassCastException wrongType) {
113: results.warning(feature, wrongType.getMessage());
114: return true;
115: }
116: if (line == null) {
117: // Geometry was null - user can check with nullZero
118: return true;
119: }
120: final int NUMBER_OF_POINTS = line.getNumPoints();
121: if (NUMBER_OF_POINTS < 2) {
122: results
123: .error(feature,
124: "LineString contains too few points");
125: return false;
126: } else if (NUMBER_OF_POINTS > 2) {
127: // log the error and return
128: String message = "LineString is not single part (contains "
129: + (NUMBER_OF_POINTS - 1) + " segments)";
130: results.error(feature, message);
131: LOGGER.log(Level.FINEST, getName() + "(" + feature.getID()
132: + "):" + message);
133:
134: return false;
135: }
136: LOGGER.log(Level.FINEST, getName() + "(" + feature.getID()
137: + ") passed");
138: return true;
139: }
140: }
|