001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/graphics/sld/LinePlacement.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/deegree/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstr. 19
030 53115 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042 ---------------------------------------------------------------------------*/
043 package org.deegree.graphics.sld;
044
045 import org.deegree.framework.xml.Marshallable;
046 import org.deegree.model.feature.Feature;
047 import org.deegree.model.filterencoding.FilterEvaluationException;
048
049 /**
050 * Incarnation of an sld:LinePlacement-element.
051 * <p>
052 * Contains some deegree-specific extensions:
053 * <ul>
054 * <li>PerpendicularOffset: may be used as defined by the OGC, but it can also be set to one of the
055 * special values 'center', 'above', 'below', 'auto'
056 * <li>Gap: defines the distance between two captions on the line string
057 * <li>LineWidth: provides the thickness of the styled line (needed as information for the correct
058 * positioning of labels above and below the line string)
059 * </ul>
060 * <p>
061 *
062 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider</a>
063 * @version $Revision: 9340 $ $Date: 2007-12-27 13:32:12 +0100 (Do, 27 Dez 2007) $
064 */
065
066 public class LinePlacement implements Marshallable {
067
068 public final static int TYPE_ABSOLUTE = 0;
069
070 public final static int TYPE_ABOVE = 1;
071
072 public final static int TYPE_BELOW = 2;
073
074 public final static int TYPE_CENTER = 3;
075
076 public final static int TYPE_AUTO = 4;
077
078 private ParameterValueType perpendicularOffset = null;
079
080 private ParameterValueType lineWidth = null;
081
082 private ParameterValueType gap = null;
083
084 public LinePlacement( ParameterValueType perpendicularOffset, ParameterValueType lineWidth, ParameterValueType gap ) {
085 this.perpendicularOffset = perpendicularOffset;
086 this.lineWidth = lineWidth;
087 this.gap = gap;
088 }
089
090 /**
091 * returns the gap as
092 *
093 * @see ParameterValueType
094 * @return
095 */
096 public ParameterValueType getGap() {
097 return gap;
098 }
099
100 /**
101 * returns the line width as
102 *
103 * @see ParameterValueType
104 * @return
105 */
106 public ParameterValueType getLineWidth() {
107 return lineWidth;
108 }
109
110 /**
111 * returns the perpendicular offset as
112 *
113 * @see ParameterValueType
114 * @return
115 */
116 public ParameterValueType getPerpendicularOffset() {
117 return perpendicularOffset;
118 }
119
120 /**
121 * The PerpendicularOffset element of a LinePlacement gives the perpendicular distance away from
122 * a line to draw a label. The distance is in pixels and is positive to the left-hand side of
123 * the line string. Negative numbers mean right. The default offset is 0.
124 * <p>
125 * deegree-specific extension: if the element has one of the values: 'center', 'above', 'below',
126 * 'auto', the return value is invalid
127 * <p>
128 *
129 * @param feature
130 * specifies the <tt>Feature</tt> to be used for evaluation of the underlying
131 * 'sld:ParameterValueType'
132 * @return the offset (only valid if type is TYPE_ABSOLUTE)
133 * @throws FilterEvaluationException
134 * if the evaluation fails
135 */
136 public double getPerpendicularOffset( Feature feature )
137 throws FilterEvaluationException {
138
139 double pValue = 0.0;
140
141 if ( perpendicularOffset != null ) {
142 String stringValue = perpendicularOffset.evaluate( feature );
143 if ( ( !stringValue.equals( "center" ) ) && ( !stringValue.equals( "above" ) )
144 && ( !stringValue.equals( "below" ) ) && ( !stringValue.equals( "auto" ) ) ) {
145 try {
146 pValue = Double.parseDouble( stringValue );
147 } catch ( NumberFormatException e ) {
148 throw new FilterEvaluationException(
149 "Element 'PerpendicularOffset' "
150 + "must be equal to 'center', 'above', 'below' or 'auto' or it "
151 + "must denote a valid double value!" );
152 }
153
154 }
155 }
156 return pValue;
157 }
158
159 /**
160 * @see org.deegree.graphics.sld.LinePlacement#getPerpendicularOffset(Feature)
161 * <p>
162 * @param perpendicularOffset
163 */
164 public void setPerpendicularOffset( double perpendicularOffset ) {
165 ParameterValueType pvt = StyleFactory.createParameterValueType( "" + perpendicularOffset );
166 this.perpendicularOffset = pvt;
167 }
168
169 /**
170 * Returns the placement type (one of the constants defined in <tt>LinePlacement</tt>).
171 * <p>
172 *
173 * @param feature
174 * @return
175 * @throws FilterEvaluationException
176 */
177 public int getPlacementType( Feature feature )
178 throws FilterEvaluationException {
179 int type = TYPE_ABSOLUTE;
180
181 if ( perpendicularOffset != null ) {
182 String stringValue = perpendicularOffset.evaluate( feature );
183 if ( stringValue.equals( "center" ) ) {
184 type = TYPE_CENTER;
185 } else if ( stringValue.equals( "above" ) ) {
186 type = TYPE_ABOVE;
187 } else if ( stringValue.equals( "below" ) ) {
188 type = TYPE_BELOW;
189 } else if ( stringValue.equals( "auto" ) ) {
190 type = TYPE_AUTO;
191 }
192 }
193 return type;
194 }
195
196 /**
197 * Sets the placement type (one of the constants defined in <tt>LinePlacement</tt>).
198 * <p>
199 *
200 * @param placementType
201 */
202 public void setPlacementType( int placementType ) {
203 ParameterValueType pvt = null;
204 String type = null;
205 if ( placementType == 1 ) {
206 type = "above";
207 } else if ( placementType == 2 ) {
208 type = "below";
209 } else if ( placementType == 3 ) {
210 type = "center";
211 } else if ( placementType == 4 ) {
212 type = "auto";
213 }
214 pvt = StyleFactory.createParameterValueType( "" + type );
215 this.perpendicularOffset = pvt;
216 }
217
218 /**
219 * Provides the thickness of the styled line (needed as information for the correct positioning
220 * of labels above and below the line string).
221 * <p>
222 *
223 * @param feature
224 * @return
225 * @throws FilterEvaluationException
226 */
227 public double getLineWidth( Feature feature )
228 throws FilterEvaluationException {
229 double width = 3;
230
231 if ( lineWidth != null ) {
232 width = Double.parseDouble( lineWidth.evaluate( feature ) );
233 }
234 return width;
235 }
236
237 /**
238 * Provides the thickness of the styled line (needed as information for the correct positioning
239 * of labels above and below the line string).
240 * <p>
241 *
242 * @param lineWidth
243 * the lineWidth to be set
244 */
245 public void setLineWidth( double lineWidth ) {
246 ParameterValueType pvt = StyleFactory.createParameterValueType( "" + lineWidth );
247 this.lineWidth = pvt;
248 }
249
250 /**
251 * Defines the distance between two captions on the line string. One unit is the width of the
252 * label caption.
253 * <p>
254 *
255 * @param feature
256 * @return
257 * @throws FilterEvaluationException
258 */
259 public int getGap( Feature feature )
260 throws FilterEvaluationException {
261 int gapValue = 6;
262
263 if ( gap != null ) {
264 gapValue = Integer.parseInt( gap.evaluate( feature ) );
265 }
266 return gapValue;
267 }
268
269 /**
270 * Defines the distance between two captions on the line string. One unit is the width of the
271 * label caption.
272 * <p>
273 *
274 * @param gap
275 * the gap to be set
276 */
277 public void setGap( int gap ) {
278 ParameterValueType pvt = StyleFactory.createParameterValueType( "" + gap );
279 this.gap = pvt;
280 }
281
282 /**
283 * exports the content of the Font as XML formated String
284 *
285 * @return xml representation of the Font
286 */
287 public String exportAsXML() {
288
289 StringBuffer sb = new StringBuffer( 1000 );
290 sb.append( "<LinePlacement>" );
291 if ( perpendicularOffset != null ) {
292 sb.append( "<PerpendicularOffset>" );
293 sb.append( ( (Marshallable) perpendicularOffset ).exportAsXML() );
294 sb.append( "</PerpendicularOffset>" );
295 }
296 if ( lineWidth != null ) {
297 sb.append( "<LineWidth>" );
298 sb.append( ( (Marshallable) lineWidth ).exportAsXML() );
299 sb.append( "</LineWidth>" );
300 }
301 if ( gap != null ) {
302 sb.append( "<Gap>" );
303 sb.append( ( (Marshallable) gap ).exportAsXML() );
304 sb.append( "</Gap>" );
305 }
306 sb.append( "</LinePlacement>" );
307
308 return sb.toString();
309 }
310 }