001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/wpvs/operation/GetView.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 Aennchenstraße 19
030 53177 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
044 package org.deegree.ogcwebservices.wpvs.operation;
045
046 import java.awt.Color;
047 import java.awt.Dimension;
048 import java.io.UnsupportedEncodingException;
049 import java.net.URLDecoder;
050 import java.util.ArrayList;
051 import java.util.List;
052 import java.util.Map;
053
054 import javax.vecmath.Point3d;
055
056 import org.deegree.framework.log.ILogger;
057 import org.deegree.framework.log.LoggerFactory;
058 import org.deegree.framework.util.CharsetUtils;
059 import org.deegree.framework.util.MimeTypeMapper;
060 import org.deegree.framework.util.StringTools;
061 import org.deegree.framework.util.TimeTools;
062 import org.deegree.i18n.Messages;
063 import org.deegree.model.crs.CRSFactory;
064 import org.deegree.model.crs.CoordinateSystem;
065 import org.deegree.model.crs.UnknownCRSException;
066 import org.deegree.model.spatialschema.Envelope;
067 import org.deegree.model.spatialschema.GeometryFactory;
068 import org.deegree.model.spatialschema.Position;
069 import org.deegree.ogcwebservices.InconsistentRequestException;
070 import org.deegree.ogcwebservices.InvalidParameterValueException;
071
072 /**
073 * This Class handles a kvp request from a client and stores it's values.
074 *
075 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a>
076 * @author last edited by: $Author: apoth $
077 *
078 * @version 2.0, $Revision: 9345 $, $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 2007) $
079 *
080 * @since 2.0
081 */
082 public class GetView extends WPVSRequestBase {
083
084 /**
085 *
086 */
087 private static final long serialVersionUID = 3147456903146907261L;
088
089 private static final ILogger LOG = LoggerFactory.getLogger( GetView.class );
090
091 private final List<String> datasets;
092
093 private double quality;
094
095 /**
096 * using deegree's Position
097 */
098 private final Point3d pointOfInterest;
099
100 private double pitch;
101
102 private double yaw;
103
104 private double roll;
105
106 private double distance;
107
108 private double angleOfView;
109
110 private final boolean transparent;
111
112 private final Dimension imageDimension;
113
114 private final String outputFormat;
115
116 private final Color backgroundColor;
117
118 private final String exceptionFormat;
119
120 private final String elevationModel;
121
122 private final Envelope boundingBox;
123
124 private final CoordinateSystem crs;
125
126 private double farClippingPlane;
127
128 private GetView( String version, String id, List<String> datasets, String elevationModel,
129 double quality, Position pointOfInterest, Envelope bbox, CoordinateSystem crs,
130 double pitch, double yaw, double roll, double distance, double angleOfView,
131 String outputFormat, Color backgroundColor, boolean transparent,
132 Dimension imageDimension, String exceptionFormat, double farClippingPlane,
133 Map<String, String> vendorSpecificParameter ) {
134 this(
135 version,
136 id,
137 datasets,
138 elevationModel,
139 quality,
140 new Point3d( pointOfInterest.getX(), pointOfInterest.getY(), pointOfInterest.getZ() ),
141 bbox, crs, pitch, yaw, roll, distance, angleOfView, outputFormat, backgroundColor,
142 transparent, imageDimension, exceptionFormat, farClippingPlane,
143 vendorSpecificParameter );
144 }
145
146 /**
147 * Trusted constructor. No parameter validity is performed. This is delegated to the factory
148 * method createGeMap.
149 *
150 * TODO the list of pars is too long, should break up into smaller classes, e.g. pars for
151 * perspective output, etc.
152 *
153 * @param version
154 * @param id
155 * @param datasets
156 * @param elevationModel
157 * @param quality
158 * @param pointOfInterest
159 * @param bbox
160 * @param crs
161 * @param pitch
162 * @param yaw
163 * @param roll
164 * @param distance
165 * @param angleOfView
166 * @param outputFormat
167 * @param backgroundColor
168 * @param transparent
169 * @param imageDimension
170 * @param exceptionFormat
171 * @param farClippingPlane
172 * @param vendorSpecificParameter
173 */
174 private GetView( String version, String id, List<String> datasets, String elevationModel,
175 double quality, Point3d pointOfInterest, Envelope bbox, CoordinateSystem crs,
176 double pitch, double yaw, double roll, double distance, double angleOfView,
177 String outputFormat, Color backgroundColor, boolean transparent,
178 Dimension imageDimension, String exceptionFormat, double farClippingPlane,
179 Map<String, String> vendorSpecificParameter ) {
180 super( version, id, vendorSpecificParameter );
181 this.datasets = datasets;
182 this.elevationModel = elevationModel;
183
184 this.quality = quality;
185 this.pointOfInterest = pointOfInterest;
186 this.boundingBox = bbox;
187 this.crs = crs;
188 this.pitch = pitch;
189 this.yaw = yaw;
190 this.roll = roll;
191 this.distance = distance;
192 this.angleOfView = angleOfView;
193 this.outputFormat = outputFormat;
194 this.backgroundColor = backgroundColor;
195 this.transparent = transparent;
196 this.imageDimension = imageDimension;
197 this.exceptionFormat = exceptionFormat;
198 this.farClippingPlane = farClippingPlane;
199
200 }
201
202 /**
203 * Factory method to create an instance of GetView from teh parameters in <code>model</code>
204 *
205 * @param requestParams
206 * a map containing request parameters and values
207 * @return a new instance of GetView
208 * @throws InconsistentRequestException
209 * if a mandatory parameter is missing
210 * @throws InvalidParameterValueException
211 * if a parameter has an illegal value
212 */
213 public static GetView create( Map<String, String> requestParams )
214 throws InconsistentRequestException, InvalidParameterValueException {
215
216 // TODO throw a proper exception, the InconsistentRequestException doesn't cover all cases
217
218 // not needed anymore
219 requestParams.remove( "REQUEST" );
220
221 String id = requestParams.remove( "ID" );
222
223 /*
224 * TODO check if this is right WPVSConfiguration configuration = (WPVSConfiguration)
225 * model.remove( "CAPABILITIES" ); if ( configuration == null ){ throw new RuntimeException (
226 * "Working site: you forgot to add config to model -> " + "see how this is done in wms" ); }
227 */
228
229 String version = requestParams.remove( "VERSION" );
230 if ( version == null ) {
231 throw new InconsistentRequestException( "'VERSION' value must be set" );
232 }
233
234 // FORMAT
235 String format = requestParams.remove( "OUTPUTFORMAT" );
236 if ( format == null ) {
237 throw new InconsistentRequestException( "OUTPUTFORMAT value must be set" );
238 }
239 try {
240 format = URLDecoder.decode( format, CharsetUtils.getSystemCharset() );
241 } catch ( UnsupportedEncodingException e1 ) {
242 LOG.logError( e1.getLocalizedMessage(), e1 );
243 }
244 if ( !MimeTypeMapper.isKnownImageType( format ) ) {
245 throw new InvalidParameterValueException(
246 StringTools.concat( 50, format,
247 " is not a valid image/result format" ) );
248 }
249
250 // TRANSPARENCY
251 boolean transparency = false;
252 String tp = requestParams.remove( "TRANSPARENT" );
253 if ( tp != null ) {
254 transparency = tp.toUpperCase().trim().equals( "TRUE" );
255 }
256
257 if ( transparency
258 && ( format.equals( "image/jpg" ) || format.equals( "image/jpeg" )
259 || format.equals( "image/bmp" ) || format.equals( "image/tif" ) || format.equals( "image/tiff" ) ) ) {
260
261 throw new InconsistentRequestException(
262 StringTools.concat(
263 100,
264 "TRANSPARENCY=true is inconsistent with OUTPUTFORMAT=",
265 format,
266 ".Valid transparent formats are 'image/gif' ",
267 "and 'image/png'." ) );
268 }
269
270 // width
271 String tmp = requestParams.remove( "WIDTH" );
272 if ( tmp == null ) {
273 throw new InconsistentRequestException( "'WIDTH' value must be set" );
274 }
275 int width = 0;
276 try {
277 width = Integer.parseInt( tmp );
278 } catch ( NumberFormatException e ) {
279 throw new InconsistentRequestException( "WIDTH must be a valid integer number" );
280 }
281
282 tmp = requestParams.remove( "HEIGHT" );
283 if ( tmp == null ) {
284 throw new InconsistentRequestException( "'HEIGHT' value must be set" );
285 }
286 int height = 0;
287 try {
288 height = Integer.parseInt( tmp );
289 } catch ( NumberFormatException e ) {
290 throw new InconsistentRequestException( "HEIGHT must be a valid integer number" );
291 }
292
293 if ( width < 0 || height < 0 ) {
294 throw new InconsistentRequestException( "WIDTH and HEIGHT must be >= 0" );
295 }
296 Dimension imgDimension = new Dimension( width, height );
297
298 Color bgColor = Color.white;
299
300 tmp = requestParams.remove( "BACKGROUNDCOLOR" );
301 if ( tmp != null ) {
302 try {
303 bgColor = Color.decode( tmp );
304 } catch ( NumberFormatException e ) {
305 throw new InconsistentRequestException(
306 StringTools.concat(
307 100,
308 "The BACKGROUNDCOLOR '",
309 tmp,
310 "' does not denote a valid hexadecimal color." ) );
311 }
312 }
313
314 String elevModel = requestParams.remove( "ELEVATIONMODEL" );
315 /*
316 * if ( elevModel == null ) { throw new InconsistentRequestException( "'ELEVATIONMODEL'
317 * value must be set" ); }
318 */
319 if ( elevModel != null ) {
320 elevModel = elevModel.trim();
321 if ( elevModel.length() == 0 ) {
322 throw new InconsistentRequestException(
323 "ELEVATIONMODEL cannot contain space characters only or be empty" );
324 }
325 }
326
327 tmp = requestParams.remove( "AOV" );
328 if ( tmp == null ) {
329 throw new InconsistentRequestException( "'AOV' value must be set" );
330 }
331
332 double aov = 0;
333 try {
334 aov = Math.toRadians( Double.parseDouble( tmp ) );
335 /**
336 * checking for > 0 || < 90
337 */
338 if ( ( aov <= 0 ) || ( aov >= 1.5707963265 ) ) {
339 throw new InvalidParameterValueException(
340 "AOV value must be a number between 0° and 180°" );
341 }
342 } catch ( NumberFormatException e ) {
343 LOG.logError( e.getLocalizedMessage(), e );
344 throw new InvalidParameterValueException( "AOV couldn't parse the aov value" );
345 }
346
347 tmp = requestParams.remove( "ROLL" );
348 if ( tmp == null ) {
349 throw new InconsistentRequestException( "'ROLL' value must be set" );
350 }
351 double roll;
352 try {
353 /**
354 * checking for > 360 && < 360
355 */
356 roll = Double.parseDouble( tmp ) % 360;
357 if ( roll < 0 )
358 roll += 360;
359 roll = Math.toRadians( roll );
360 } catch ( NumberFormatException e ) {
361 LOG.logError( e.getLocalizedMessage(), e );
362 throw new InvalidParameterValueException( "ROLL value must be a number" );
363 }
364
365 tmp = requestParams.remove( "DISTANCE" );
366 if ( tmp == null ) {
367 throw new InconsistentRequestException( "'DISTANCE' value must be set." );
368 }
369
370 double distance;
371 String mesg = "DISTANCE must be a number >= 0.";
372 try {
373 distance = Double.parseDouble( tmp );
374 if ( distance < 0 ) {
375 throw new InvalidParameterValueException( mesg );
376 }
377 } catch ( NumberFormatException e ) {
378 LOG.logError( e.getLocalizedMessage(), e );
379 throw new InvalidParameterValueException( mesg );
380 }
381
382 tmp = requestParams.remove( "PITCH" );
383 if ( tmp == null ) {
384 throw new InconsistentRequestException( "'PITCH' value must be set." );
385 }
386 double pitch = 0;
387 try {
388 pitch = Math.toRadians( Double.parseDouble( tmp ) );
389 if ( ( pitch < -1.570796327 ) || ( pitch > 1.570796327 ) ) {
390 throw new InvalidParameterValueException(
391 "PITCH value must be a number between -90° and 90°" );
392 }
393 } catch ( NumberFormatException e ) {
394 LOG.logError( e.getLocalizedMessage(), e );
395 throw new InvalidParameterValueException(
396 "PITCH value must be a number between -90° and 90°" );
397 }
398
399 tmp = requestParams.remove( "YAW" );
400 if ( tmp == null ) {
401 throw new InconsistentRequestException( "'YAW' value must be set." );
402 }
403 double yaw;
404 try {
405 double tmpYaw = Double.parseDouble( tmp ) % 360;
406 if ( tmpYaw < 0 )
407 tmpYaw += 360;
408 // YAW == 270 -> OutOfMem Error
409 // if ( tmpYaw > 89.5 && tmpYaw < 90.5 ) {
410 // tmpYaw = 91;
411 // } else if ( tmpYaw > 269.5 && tmpYaw < 270.5 ) {
412 // tmpYaw = 271;
413 // }
414 // [UT] 06.06.2005 splitter doesn't work fine for 0 (or 360) and 180
415 // if ( tmpYaw % 180 == 0 ) {
416 // tmpYaw += 0.5;
417 // }
418 yaw = Math.toRadians( tmpYaw );
419
420 } catch ( NumberFormatException e ) {
421 LOG.logError( e.getLocalizedMessage(), e );
422 throw new InvalidParameterValueException( "YAW value must be a number" );
423 }
424
425 tmp = requestParams.remove( "POI" );
426 if ( tmp == null ) {
427 throw new InconsistentRequestException( "POI value is missing." );
428 }
429 mesg = "POI value must denote a number tuple with valid x,y,z values, for example '123.45,678.90,456.123'";
430
431 try {
432 tmp = URLDecoder.decode( tmp, CharsetUtils.getSystemCharset() );
433 } catch ( UnsupportedEncodingException e ) {
434 LOG.logError( e.getLocalizedMessage(), e );
435 throw new InconsistentRequestException( e.getLocalizedMessage() );
436 }
437 String[] xyz = tmp.split( "," );
438 if ( xyz.length != 3 ) {
439 throw new InvalidParameterValueException( mesg );
440 }
441 Position poi;
442 double[] p = new double[3];
443 try {
444 p[0] = Double.parseDouble( xyz[0] );
445 p[1] = Double.parseDouble( xyz[1] );
446 p[2] = Double.parseDouble( xyz[2] );
447
448 } catch ( NumberFormatException e ) {
449 LOG.logError( e.getLocalizedMessage(), e );
450 throw new InvalidParameterValueException( mesg );
451 }
452 poi = GeometryFactory.createPosition( p );
453
454 String crsString = requestParams.remove( "CRS" );
455 CoordinateSystem crs = null;
456 if ( crsString == null ) {
457 throw new InconsistentRequestException( "CRS parameter is missing." );
458 }
459 try {
460 crsString = URLDecoder.decode( crsString, CharsetUtils.getSystemCharset() );
461 crs = CRSFactory.create( crsString );
462 } catch ( UnsupportedEncodingException e ) {
463 LOG.logError( e.getLocalizedMessage(), e );
464 } catch ( UnknownCRSException ucrse ) {
465 LOG.logError( ucrse.getLocalizedMessage(), ucrse );
466 throw new InvalidParameterValueException( ucrse.getMessage() );
467 }
468
469 String datasetsString = requestParams.remove( "DATASETS" );
470 if ( datasetsString == null ) {
471 throw new InconsistentRequestException( "'DATASETS' value must be set" );
472 }
473
474 datasetsString = datasetsString.trim();
475
476 String[] datasets = datasetsString.split( "," );
477 if ( "".equals( datasetsString ) || datasets.length == 0 ) {
478 throw new InconsistentRequestException(
479 "'DATASETS' must contain at least one dataset name, and cannot be empty (i.e. only have spaces)" );
480 }
481 List<String> datasetList = new ArrayList<String>( datasets.length );
482 for ( String dataset : datasets ) {
483 datasetList.add( dataset.trim() );
484 }
485
486 String boxstring = requestParams.remove( "BOUNDINGBOX" );
487 Envelope boundingBox = null;
488 if ( boxstring == null ) {
489 throw new InconsistentRequestException( "BOUNDINGBOX value must be set" );
490 }
491
492 try {
493 boxstring = URLDecoder.decode( boxstring, CharsetUtils.getSystemCharset() );
494 } catch ( UnsupportedEncodingException e ) {
495 LOG.logError( e.getLocalizedMessage(), e );
496 throw new InconsistentRequestException(
497 StringTools.concat(
498 100,
499 "Cannot decode BOUNDINGBOX: '",
500 boxstring,
501 " using ",
502 CharsetUtils.getSystemCharset() ) );
503 }
504
505 String[] tokens = boxstring.split( "," );
506 if ( tokens.length != 4 ) {
507 throw new InconsistentRequestException(
508 "BOUNDINGBOX value must have a value such as xmin,ymin,xmax,ymax" );
509 }
510
511 double minx;
512 double maxx;
513 double miny;
514 double maxy;
515 try {
516 minx = Double.parseDouble( tokens[0] );
517 miny = Double.parseDouble( tokens[1] );
518 maxx = Double.parseDouble( tokens[2] );
519 maxy = Double.parseDouble( tokens[3] );
520 } catch ( NumberFormatException e ) {
521 LOG.logError( e.getLocalizedMessage(), e );
522 throw new InconsistentRequestException( "BOUNDINGBOX has an illegal value: "
523 + e.getMessage() );
524 }
525
526 if ( minx >= maxx ) {
527 throw new InvalidParameterValueException( "minx must be less than maxx" );
528 }
529
530 if ( miny >= maxy ) {
531 throw new InvalidParameterValueException( "miny must be less than maxy" );
532 }
533
534 boundingBox = GeometryFactory.createEnvelope( minx, miny, maxx, maxy, crs );
535
536 /**
537 * Doing some checking of the given request parameters.
538 */
539
540 if ( !boundingBox.contains( poi ) ) {
541 throw new InconsistentRequestException( "POI (" + poi
542 + " )must be inside the Bounding box ("
543 + boundingBox + ")" );
544 }
545
546 tmp = requestParams.remove( "FARCLIPPINGPLANE" );
547 double farClippingPlane = 150000;
548 if ( tmp != null ) {
549 try {
550 farClippingPlane = Double.parseDouble( tmp );
551 } catch ( NumberFormatException e ) {
552 LOG.logError( e.getLocalizedMessage(), e );
553 throw new InvalidParameterValueException( "FarClippingPlane must be a number" );
554 }
555 }
556
557 tmp = requestParams.remove( "QUALITY" );
558 double quality = 1f;
559 if ( tmp != null ) {
560 try {
561 quality = Double.parseDouble( tmp );
562 } catch ( NumberFormatException e ) {
563 LOG.logError( e.getLocalizedMessage(), e );
564 throw new InvalidParameterValueException( "QUALITY must have a value between [0,1]" );
565 }
566 }
567
568 String exceptions = requestParams.remove( "EXCEPTIONFORMAT" );
569 if ( exceptions == null ) {
570 exceptions = "XML";
571 }
572
573 // Shouldn't this be checked for the right value ???
574 tmp = requestParams.remove( "DATETIME" );
575 if ( tmp == null ) {
576 // when the moon is in the second house,
577 // and jupiter aligns with mars.
578 // -> dawning of the age of the wpvs
579 tmp = "2007-03-21T12:00:00";
580 } else {
581 try {
582 TimeTools.createCalendar( tmp );
583 } catch ( NumberFormatException nfe ) {
584 throw new InvalidParameterValueException(
585 Messages.getMessage( "WPVS_GETVIEW_ILLEGAL_DATETIME", tmp) );
586 }
587 }
588
589 // org.deegree.framework.util.TimeTools.createCalendar( tmp );
590
591 requestParams.put( "DATETIME", tmp );
592
593 tmp = requestParams.remove( "SCALE" );
594 if ( tmp != null ) {
595 try {
596 Double.parseDouble( tmp );
597 requestParams.put( "SCALE", tmp );
598 } catch ( NumberFormatException e ) {
599 LOG.logError( e.getLocalizedMessage(), e );
600 throw new InvalidParameterValueException( e );
601 }
602 }
603
604 return new GetView( version, id, datasetList, elevModel, quality, poi, boundingBox, crs,
605 pitch, yaw, roll, distance, aov, format, bgColor, transparency,
606 imgDimension, exceptions, farClippingPlane, requestParams );
607 }
608
609 /**
610 * @return the requested angleOfView
611 */
612 public double getAngleOfView() {
613 return angleOfView;
614 }
615
616 /**
617 * @return the requested distance to the poi
618 */
619 public double getDistance() {
620 return distance;
621 }
622
623 /**
624 * @return the requested dimension of the resultimage
625 */
626 public Dimension getImageDimension() {
627 return imageDimension;
628 }
629
630 /**
631 * @return the requested pitch (rotation around the x-axis)
632 */
633 public double getPitch() {
634 return pitch;
635 }
636
637 /**
638 *
639 * @return the point of interest as Point3d
640 */
641 public Point3d getPointOfInterest() {
642 return pointOfInterest;
643 }
644
645 /**
646 * @return the quality of the textures
647 */
648 public double getQuality() {
649 return quality;
650 }
651
652 /**
653 * @return the requested roll (rotation around the y-axis)
654 */
655 public double getRoll() {
656 return roll;
657 }
658
659 /**
660 * @return if the resultimage should be transparent
661 */
662 public boolean isTransparent() {
663 return transparent;
664 }
665
666 /**
667 * @return the requested yaw (rotation around the z-axis)
668 */
669 public double getYaw() {
670 return yaw;
671 }
672
673 /**
674 * @return the requested datasets (e.g. layers or features etc.)
675 */
676 public List<String> getDatasets() {
677 return datasets;
678 }
679
680 /**
681 * @return the requested color of the background
682 */
683 public Color getBackgroundColor() {
684 return backgroundColor;
685 }
686
687 /**
688 * @return the requested format of thrown exceptions
689 */
690 public String getExceptionFormat() {
691 return exceptionFormat;
692 }
693
694 /**
695 * @return the mimetype of the resultimage
696 */
697 public String getOutputFormat() {
698 return outputFormat;
699 }
700
701 /**
702 * @return the boundingbox of the request
703 */
704 public Envelope getBoundingBox() {
705 return boundingBox;
706 }
707
708 /**
709 * @return the Coordinate System of the request
710 */
711 public CoordinateSystem getCrs() {
712 return crs;
713 }
714
715 /**
716 * @return the elevationmodel to be used.
717 */
718 public String getElevationModel() {
719 return elevationModel;
720 }
721
722 /**
723 * @return Returns the farClippingPlane.
724 */
725 public double getFarClippingPlane() {
726 return farClippingPlane;
727 }
728
729 /**
730 * @param farClippingPlane
731 * another clippingPlane distance.
732 */
733 public void setFarClippingPlane( double farClippingPlane ) {
734 this.farClippingPlane = farClippingPlane;
735 }
736
737 /**
738 * @param pitch
739 * a new pitch value
740 */
741 public void setPitch( double pitch ) {
742 this.pitch = pitch;
743 }
744
745 /**
746 * @param distance
747 * An other distance value.
748 */
749 public void setDistance( double distance ) {
750 this.distance = distance;
751 }
752
753 /**
754 * @param yaw
755 * An other yaw value.
756 */
757 public void setYaw( double yaw ) {
758 this.yaw = yaw;
759 }
760
761 /**
762 * @param angleOfView
763 * An other angleOfView value.
764 */
765 public void setAngleOfView( double angleOfView ) {
766 this.angleOfView = angleOfView;
767 }
768 }