NETGeographicLib  1.43
NETGeographicLib.h
Go to the documentation of this file.
1 #pragma once
2 /**
3  * \file NETGeographicLib/NETGeographicLib.h
4  * \brief Header for NETGeographicLib::NETGeographicLib objects
5  *
6  * NETGeographicLib is copyright (c) Scott Heiman (2013)
7  * GeographicLib is Copyright (c) Charles Karney (2010-2012)
8  * <charles@karney.com> and licensed under the MIT/X11 License.
9  * For more information, see
10  * http://geographiclib.sourceforge.net/
11  **********************************************************************/
12 #include <string>
13 
14 using namespace System;
15 
16 namespace NETGeographicLib
17 {
18  enum class captype {
19  CAP_NONE = 0U,
20  CAP_C1 = 1U<<0,
21  CAP_C1p = 1U<<1,
22  CAP_C2 = 1U<<2,
23  CAP_C3 = 1U<<3,
24  CAP_C4 = 1U<<4,
25  CAP_ALL = 0x1FU,
26  CAP_MASK = CAP_ALL,
27  OUT_ALL = 0x7F80U,
28  OUT_MASK = 0xFF80U,
29  };
30 
31  /**
32  * Bit masks for what calculations to do. These masks do double duty.
33  * They signify to the GeodesicLine::GeodesicLine constructor and to
34  * Geodesic::Line what capabilities should be included in the GeodesicLine
35  * object. They also specify which results to return in the general
36  * routines Geodesic::GenDirect and Geodesic::GenInverse routines.
37  **********************************************************************/
38  public enum class Mask {
39  /**
40  * No capabilities, no output.
41  * @hideinitializer
42  **********************************************************************/
43  NONE = 0U,
44  /**
45  * Calculate latitude \e lat2. (It's not necessary to include this as a
46  * capability to GeodesicLine because this is included by default.)
47  * @hideinitializer
48  **********************************************************************/
49  LATITUDE = 1U<<7 | unsigned(captype::CAP_NONE),
50  /**
51  * Calculate longitude \e lon2.
52  * @hideinitializer
53  **********************************************************************/
54  LONGITUDE = 1U<<8 | unsigned(captype::CAP_C3),
55  /**
56  * Calculate azimuths \e azi1 and \e azi2. (It's not necessary to
57  * include this as a capability to GeodesicLine because this is included
58  * by default.)
59  * @hideinitializer
60  **********************************************************************/
61  AZIMUTH = 1U<<9 | unsigned(captype::CAP_NONE),
62  /**
63  * Calculate distance \e s12.
64  * @hideinitializer
65  **********************************************************************/
66  DISTANCE = 1U<<10 | unsigned(captype::CAP_C1),
67  /**
68  * Allow distance \e s12 to be used as input in the direct geodesic
69  * problem.
70  * @hideinitializer
71  **********************************************************************/
72  DISTANCE_IN = 1U<<11 | unsigned(captype::CAP_C1) |
73  unsigned(captype::CAP_C1p),
74  /**
75  * Calculate reduced length \e m12.
76  * @hideinitializer
77  **********************************************************************/
78  REDUCEDLENGTH = 1U<<12 | unsigned(captype::CAP_C1) |
79  unsigned(captype::CAP_C2),
80  /**
81  * Calculate geodesic scales \e M12 and \e M21.
82  * @hideinitializer
83  **********************************************************************/
84  GEODESICSCALE = 1U<<13 | unsigned(captype::CAP_C1) |
85  unsigned(captype::CAP_C2),
86  /**
87  * Calculate area \e S12.
88  * @hideinitializer
89  **********************************************************************/
90  AREA = 1U<<14 | unsigned(captype::CAP_C4),
91  /**
92  * Do not wrap the \e lon2 in the direct calculation.
93  * @hideinitializer
94  **********************************************************************/
95  LONG_NOWRAP = 1U<<15,
96  /**
97  * All capabilities, calculate everything.
98  * @hideinitializer
99  **********************************************************************/
100  ALL = unsigned(captype::OUT_ALL) | unsigned(captype::CAP_ALL),
101  };
102 
103  /**
104  * @brief The version information.
105  **********************************************************************/
106  public ref class VersionInfo
107  {
108  private:
109  VersionInfo() {}
110  public:
111  /**
112  * @return The version string.
113  *******************************************************************/
114  static System::String^ GetString();
115  /**
116  * @return The major version.
117  *******************************************************************/
118  static int MajorVersion();
119  /**
120  * @return The minor version.
121  *******************************************************************/
122  static int MinorVersion();
123  /**
124  * @return The patch number.
125  *******************************************************************/
126  static int Patch();
127  };
128 
129  /**
130  * @brief Exception class for NETGeographicLib
131  **********************************************************************/
132  public ref class GeographicErr : public System::Exception
133  {
134  public:
135  /**
136  * @brief Creates an exception using an unmanaged string.
137  * @param[in] msg The error string.
138  ******************************************************************/
139  GeographicErr( const char* msg ) :
140  System::Exception( gcnew System::String( msg ) ) {}
141  /**
142  * @brief Creates an exception using a managed string.
143  * @param[in] msg The error string.
144  ******************************************************************/
145  GeographicErr( System::String^ msg ) : System::Exception( msg ) {}
146  };
147 
148  ref class StringConvert
149  {
151  public:
152  static std::string ManagedToUnmanaged( System::String^ s );
153  static System::String^ UnmanagedToManaged( const std::string& s )
154  { return gcnew System::String( s.c_str() ); }
155  };
156 
157  /**
158  * @brief Physical constants
159  *
160  * References:<br>
161  * http://www.orekit.org/static/apidocs/org/orekit/utils/Constants.html<br>
162  * A COMPENDIUM OF EARTH CONSTANTS RELEVANT TO AUSTRALIAN GEODETIC SCIENCE<br>
163  * http://espace.library.curtin.edu.au/R?func=dbin-jump-full&local_base=gen01-era02&object_id=146669
164  **********************************************************************/
165  public ref class Constants
166  {
167  private:
168  Constants() {}
169  public:
170 
171  /**
172  * @brief WGS72 Parameters
173  **********************************************************************/
174  ref class WGS72
175  {
176  private:
177  WGS72() {}
178  // The equatorial radius in meters.
179  static const double m_MajorRadius = 6378135.0;
180  // The flattening of the ellipsoid
181  static const double m_Flattening = 1.0 / 298.26;
182  // The gravitational constant in meters<sup>3</sup>/second<sup>2</sup>.
183  static const double m_GravitationalConstant = 3.986008e+14;
184  // The spin rate of the Earth in radians/second.
185  static const double m_EarthRate = 7.292115147e-5;
186  // dynamical form factor
187  static const double m_J2 = 1.0826158e-3;
188  public:
189  //! The equatorial radius in meters.
190  static property double MajorRadius { double get() { return m_MajorRadius; } }
191  //! The flattening of the ellipsoid
192  static property double Flattening { double get() { return m_Flattening; } }
193  //! The gravitational constant in meters<sup>3</sup>/second<sup>2</sup>.
194  static property double GravitationalConstant { double get() { return m_GravitationalConstant; } }
195  //! The spin rate of the Earth in radians/second.
196  static property double EarthRate { double get() { return m_EarthRate; } }
197  //! The dynamical form factor (J2).
198  static property double J2 { double get() { return m_J2; } }
199  };
200 
201  /**
202  * @brief WGS84 Parameters
203  **********************************************************************/
204  ref class WGS84
205  {
206  private:
207  WGS84() {}
208  // The equatorial radius in meters.
209  static const double m_MajorRadius = 6378137.0;
210  // The flattening of the ellipsoid
211  static const double m_Flattening = 1.0 / 298.257223563;
212  // The gravitational constant in meters<sup>3</sup>/second<sup>2</sup>.
213  // I have also seen references that set this value to 3.986004418e+14.
214  // The following value is used to maintain consistency with GeographicLib.
215  static const double m_GravitationalConstant = 3.986005e+14;
216  // The spin rate of the Earth in radians/second.
217  static const double m_EarthRate = 7.292115e-5;
218  // dynamical form factor
219  static const double m_J2 = 1.08263e-3;
220  public:
221  //! The equatorial radius in meters.
222  static property double MajorRadius { double get() { return m_MajorRadius; } }
223  //! The flattening of the ellipsoid
224  static property double Flattening { double get() { return m_Flattening; } }
225  //! The gravitational constant in meters<sup>3</sup>/second<sup>2</sup>.
226  static property double GravitationalConstant { double get() { return m_GravitationalConstant; } }
227  //! The spin rate of the Earth in radians/second.
228  static property double EarthRate { double get() { return m_EarthRate; } }
229  //! The dynamical form factor (J2).
230  static property double J2 { double get() { return m_J2; } }
231  };
232 
233  /**
234  * @brief GRS80 Parameters
235  **********************************************************************/
236  ref class GRS80
237  {
238  private:
239  GRS80() {}
240  // The equatorial radius in meters.
241  static const double m_MajorRadius = 6378137.0;
242  // The flattening of the ellipsoid
243  static const double m_Flattening = 1.0 / 298.257222100882711;
244  // The gravitational constant in meters<sup>3</sup>/second<sup>2</sup>.
245  static const double m_GravitationalConstant = 3.986005e+14;
246  // The spin rate of the Earth in radians/second.
247  static const double m_EarthRate = 7.292115e-5;
248  // dynamical form factor
249  static const double m_J2 = 1.08263e-3;
250  public:
251  //! The equatorial radius in meters.
252  static property double MajorRadius { double get() { return m_MajorRadius; } }
253  //! The flattening of the ellipsoid
254  static property double Flattening { double get() { return m_Flattening; } }
255  //! The gravitational constant in meters<sup>3</sup>/second<sup>2</sup>.
256  static property double GravitationalConstant { double get() { return m_GravitationalConstant; } }
257  //! The spin rate of the Earth in radians/second.
258  static property double EarthRate { double get() { return m_EarthRate; } }
259  //! The dynamical form factor (J2).
260  static property double J2 { double get() { return m_J2; } }
261  };
262  };
263 } // namespace NETGeographicLib
Exception class for NETGeographicLib.
static System::String ^ UnmanagedToManaged(const std::string &s)
GeographicErr(const char *msg)
Creates an exception using an unmanaged string.
GeographicErr(System::String^ msg)
Creates an exception using a managed string.
The version information.