LRAUV  revA
Location.h
Go to the documentation of this file.
1 
10 #ifndef LOCATION_H_
11 #define LOCATION_H_
12 
13 #include "I1D.h"
14 #include "units/Unit.h"
15 #include "utils/Str.h"
16 
17 //class RingBufferVoid;
18 
38 class Location: public I1D<double>
39 {
40 public:
42  Location( const Unit& unit );
43 
45  Location( const Unit& unit, const double& lat, const double& lon, bool scaleValues = true );
46 
48  Location( const Location& value );
49  /*
51  Location( const Unit& unit, const void *binary );
52  */
54  virtual ~Location()
55  {}
56  ;
57 
59  //void* operator new( size_t size );
60 
62  //void operator delete( void* p );
63 
64  const double getLat( const Unit& unit ) const;
65 
66  const double getLon( const Unit& unit ) const;
67 
68  void setLat( const Unit& unit, const double& lat );
69 
70  void setLon( const Unit& unit, const double& lat );
71 
73  Location* copy() const;
74  /*
76  virtual void minus( const DataValue* rhs, DataValue* assignTo ) const;
77 
79  virtual void times( const double rhs, DataValue* assignTo ) const;
80 
82  virtual double absDiff( const DataValue* rhs ) const;
83  */
85  virtual bool copyTo( const Unit& unit, unsigned char& assignTo ) const
86  {
87  return false;
88  }
89 
91  virtual bool copyTo( const Unit& unit, float& assignTo ) const
92  {
93  return false;
94  }
95 
97  virtual bool copyTo( const Unit& unit, double& assignTo ) const
98  {
99  return false;
100  }
101 
103  virtual bool copyTo( const Unit& unit, double& assignTo, unsigned int dim ) const;
104 
106  virtual bool copyTo( const Unit& unit, int& assignTo ) const
107  {
108  return false;
109  }
110  /*
112  virtual int compare( const Unit& unit, const unsigned char& compareTo ) const
113  {
114  return -1;
115  }
116 
118  virtual int compare( const Unit& unit, const double& compareTo ) const
119  {
120  return -1;
121  }
122 
124  virtual int compare( const Unit& unit, const float& compareTo ) const
125  {
126  return -1;
127  }
128 
130  virtual int compare( const Unit& unit, const int& compareTo ) const
131  {
132  return -1;
133  }
134 
136  virtual int compare( const DataValue& compareTo ) const;
137 
139  virtual bool equals( const Unit& unit, const unsigned char& compareTo ) const
140  {
141  return false;
142  }
143 
145  virtual bool equals( const Unit& unit, const double& compareTo ) const
146  {
147  return false;
148  }
149 
151  virtual bool equals( const Unit& unit, const float& compareTo ) const
152  {
153  return false;
154  }
155 
157  virtual bool equals( const Unit& unit, const int& compareTo ) const
158  {
159  return false;
160  }
161 
163  virtual bool equals( const DataValue& compareTo ) const;
164  */
166  bool setFrom( const Unit& unit, unsigned char value )
167  {
168  return false;
169  }
170 
172  bool setFrom( const Unit& unit, double value )
173  {
174  return false;
175  }
176 
178  bool setFrom( const Unit& unit, float value )
179  {
180  return false;
181  }
182 
184  bool setFrom( const Unit& unit, int value )
185  {
186  return false;
187  }
188 
190  bool setFrom( const DataValue& value );
191 
192  // as a Str
193  Str toString( const Unit& unit ) const;
194  /*
198  unsigned int toStream( OutStream& outStream ) const;
199 
203  void fromBinary( const void *buffer );
204  */
205  Location& operator=( const Location& rhs );
206 
207  Location& operator+=( const Location& rhs );
208 
209  Location& operator-=( const Location& rhs );
210 
211  const Location operator+( const Location& rhs ) const;
212 
213  const Location operator-( const Location& rhs ) const;
214 
215  bool isNan() const;
216 
217  // Gives the bearing (in radians) between two locations (in radians).
218  static double GetBearing( const double& latitude0, const double& longitude0, const double& latitude1, const double& longitude1 );
219 
220  // Gives the bearing (in radians) between this location and another (in radians).
221  double getBearing( const double& latitude, const double& longitude ) const;
222 
223  // Gives the bearing (in radians) between this location and another.
224  double getBearing( const Location& location1 ) const;
225 
226  // Calculates the vector (in meters) between two locations (in radians).
227  static void CalcVector( const double& lat0, const double& lon0, const double& lat1, const double& lon1, double& toEast, double& toNorth );
228 
229  // Calculates the vector (in meters) between this location and another.
230  void calcVector( const Location& location1, double& toEast, double& toNorth ) const;
231 
232  // Gives the distance (in meters) between two locations (in radians).
233  static double GetDistance( const double& latitude0, const double& longitude0, const double& latitude1, const double& longitude1 );
234 
235  // Gives the distance (in meters) between two locations (in radians).
236  // Derived from Spherical Law of Cosines, no inverse trig.
237  // Less accurate at long distances (0.25% error at 4000km), but very accurate for short distances
238  static double GetDistanceFast( const double& latitude0, const double& longitude0, const double& latitude1, const double& longitude1 );
239 
240  // Gives the distance (in meters) between this location and another (in radians).
241  double getDistance( const double& latitude, const double& longitude ) const;
242 
243  // Gives the distance (in meters) between this location and another.
244  double getDistance( const Location& location1 ) const;
245 
246  // Gives the distance (in meters) between this location and another using the fast algorithm described above.
247  double getDistanceFast( const Location& location1 ) const;
248 
249  static void AtBearing( const float bearing, const float distance, double& lat, double& lon );
250 
251  static void AtBearingEllipsoid( const float bearing, const float distance, double& lat, double& lon );
252 
253  // Given a heading (the parameter "bearing"), and a distance, sets this location
254  void atBearing( const double bearing, const double distance );
255 
256  // Calculate a new latitude due to an absolute change in northings
257  static double NorthingsDelta( const double startLat, const float northingsDelta );
258 
259  // Calculate a new longitude due to an absolute change in eastings
260  static double EastingsDelta( const double startLat, const double startLon, const float eastingsDelta );
261 
262  // Adjust latitude & longitude for an absolute change in northings and eastings
263  static void Delta( double& lat, double& lon, double northings, double eastings );
264 
265  // Haversine function
266  static double HavSin( double angle );
267 
268  static const double EARTH_RADIUS;
269  static const double EARTH_RADIUS_INVERTED;
270 
273  virtual double* getPtr1d()
274  {
275  return value_;
276  }
277 
279  virtual int getM() const
280  {
281  return 2;
282  }
283 
284 protected:
285 
287  Location();
288 
289  // The actual data
290  double value_[2];
291 
293  double& lat_;
294 
296  double& lon_;
297 
299  //static RingBufferVoid* MallocRing_;
300 
302  //class StaticDestructor
303  //{
304  //public:
305  // ~StaticDestructor();
306  //};
307 
309  //static Location::StaticDestructor StaticDestructor_;
310 
311 };
312 
313 #endif /*LOCATION_H_*/
static void Delta(double &lat, double &lon, double northings, double eastings)
Definition: Location.cpp:442
double & lon_
Longitude, in radians east.
Definition: Location.h:296
static double HavSin(double angle)
Definition: Location.cpp:447
double getDistanceFast(const Location &location1) const
Definition: Location.cpp:343
bool setFrom(const Unit &unit, float value)
set from float value
Definition: Location.h:178
static double EastingsDelta(const double startLat, const double startLon, const float eastingsDelta)
Definition: Location.cpp:434
virtual ~Location()
Destructor.
Definition: Location.h:54
const Location operator+(const Location &rhs) const
Definition: Location.cpp:270
bool setFrom(const Unit &unit, int value)
set int value
Definition: Location.h:184
virtual bool copyTo(const Unit &unit, float &assignTo) const
Copy value to float.
Definition: Location.h:91
Definition: I1D.h:17
double value_[2]
Definition: Location.h:290
double & lat_
Latitude, in radians north.
Definition: Location.h:293
static double GetBearing(const double &latitude0, const double &longitude0, const double &latitude1, const double &longitude1)
Definition: Location.cpp:289
Str toString(const Unit &unit) const
Definition: Location.cpp:213
void calcVector(const Location &location1, double &toEast, double &toNorth) const
Definition: Location.cpp:315
const double getLat(const Unit &unit) const
Override new.
Definition: Location.cpp:64
bool isNan() const
Definition: Location.cpp:265
A DataValue is an abstract base class for a data value and associated engineering units of the value...
Definition: DataValue.h:35
Location & operator=(const Location &rhs)
Definition: Location.cpp:244
Location * copy() const
Return a pointer to a new copy.
Definition: Location.cpp:113
virtual bool copyTo(const Unit &unit, double &assignTo) const
Copy value to double.
Definition: Location.h:97
const Location operator-(const Location &rhs) const
Definition: Location.cpp:275
bool setFrom(const Unit &unit, double value)
set from double value
Definition: Location.h:172
static double GetDistanceFast(const double &latitude0, const double &longitude0, const double &latitude1, const double &longitude1)
Definition: Location.cpp:328
double getDistance(const double &latitude, const double &longitude) const
Definition: Location.cpp:333
Location & operator+=(const Location &rhs)
Definition: Location.cpp:251
Replacement for standard template class string.
Definition: Str.h:12
Location & operator-=(const Location &rhs)
Definition: Location.cpp:258
static double GetDistance(const double &latitude0, const double &longitude0, const double &latitude1, const double &longitude1)
Definition: Location.cpp:320
virtual bool copyTo(const Unit &unit, unsigned char &assignTo) const
Copy value to unsigned char.
Definition: Location.h:85
void setLon(const Unit &unit, const double &lat)
Definition: Location.cpp:79
double getBearing(const double &latitude, const double &longitude) const
Definition: Location.cpp:296
virtual double * getPtr1d()
Implement abstract I1D method Note that Location, when accessed via I1D methods, returns RADIANS...
Definition: Location.h:273
void atBearing(const double bearing, const double distance)
Definition: Location.cpp:421
virtual int getM() const
Implement abstract I2D method.
Definition: Location.h:279
Contains the Unit class declaration.
static const double EARTH_RADIUS
Definition: Location.h:268
const double getLon(const Unit &unit) const
Definition: Location.cpp:69
virtual bool copyTo(const Unit &unit, int &assignTo) const
Copy value to unsigned int.
Definition: Location.h:106
static double NorthingsDelta(const double startLat, const float northingsDelta)
Definition: Location.cpp:427
static void AtBearing(const float bearing, const float distance, double &lat, double &lon)
Definition: Location.cpp:348
static void CalcVector(const double &lat0, const double &lon0, const double &lat1, const double &lon1, double &toEast, double &toNorth)
Definition: Location.cpp:309
Wraps a pair of double precision (8-byte) floating point numbers and units for storage in a DataEleme...
Definition: Location.h:38
Code that represents an engineering unit.
Definition: Unit.h:24
static void AtBearingEllipsoid(const float bearing, const float distance, double &lat, double &lon)
Calculates destination point given start point lat/long, bearing & distance, using Vincenty inverse f...
Definition: Location.cpp:373
void setLat(const Unit &unit, const double &lat)
Definition: Location.cpp:74
static const double EARTH_RADIUS_INVERTED
Definition: Location.h:269
Location()
Protected Empty constructor for use by DataEntry class.
Definition: Location.cpp:281
bool setFrom(const Unit &unit, unsigned char value)
set from unsigned char value
Definition: Location.h:166