]> git.mxchange.org Git - simgear.git/commitdiff
Small cleanups to the SGGeo[dc] classes, provide more hooks to use them directly
authorfrohlich <frohlich>
Thu, 15 Jun 2006 08:27:31 +0000 (08:27 +0000)
committerfrohlich <frohlich>
Thu, 15 Jun 2006 08:27:31 +0000 (08:27 +0000)
13 files changed:
simgear/math/SGGeoc.hxx
simgear/math/SGGeod.hxx
simgear/math/SGMath.hxx
simgear/math/SGMathTest.cxx
simgear/math/SGQuat.hxx
simgear/math/SGVec3.hxx
simgear/math/sg_geodesy.cxx
simgear/math/sg_geodesy.hxx
simgear/scene/model/placement.cxx
simgear/scene/model/placement.hxx
simgear/timing/geocoord.cxx
simgear/timing/geocoord.h
simgear/timing/timezone.h

index a835deb17cb6ec1f5f55e6fe24e0ce03d2d8e87b..14929dbfdc580876a6410efe91116fe2ac7ae581 100644 (file)
@@ -29,9 +29,11 @@ public:
   SGGeoc(void);
   /// Initialize from a cartesian vector assumed to be in meters
   /// Note that this conversion is relatively expensive to compute
+  /// depricated
   SGGeoc(const SGVec3<double>& cart);
   /// Initialize from a geodetic position
   /// Note that this conversion is relatively expensive to compute
+  /// depricated
   SGGeoc(const SGGeod& geod);
 
   /// Factory from angular values in radians and radius in ft
@@ -42,6 +44,13 @@ public:
   static SGGeoc fromRadM(double lon, double lat, double radius);
   /// Factory from angular values in degrees and radius in m
   static SGGeoc fromDegM(double lon, double lat, double radius);
+  /// Factory to convert position from a cartesian position assumed to be
+  /// in wgs84 measured in meters
+  /// Note that this conversion is relatively expensive to compute
+  static SGGeoc fromCart(const SGVec3<double>& cart);
+  /// Factory to convert position from a geodetic position
+  /// Note that this conversion is relatively expensive to compute
+  static SGGeoc fromGeod(const SGGeod& geod);
 
   /// Return the geocentric longitude in radians
   double getLongitudeRad(void) const;
@@ -165,6 +174,26 @@ SGGeoc::fromDegM(double lon, double lat, double radius)
 #endif
 }
 
+inline
+SGGeoc
+SGGeoc::fromCart(const SGVec3<double>& cart)
+{
+  SGGeoc geoc;
+  SGGeodesy::SGCartToGeoc(cart, geoc);
+  return geoc;
+}
+
+inline
+SGGeoc
+SGGeoc::fromGeod(const SGGeod& geod)
+{
+  SGVec3<double> cart;
+  SGGeodesy::SGGeodToCart(geod, cart);
+  SGGeoc geoc;
+  SGGeodesy::SGCartToGeoc(cart, geoc);
+  return geoc;
+}
+
 inline
 double
 SGGeoc::getLongitudeRad(void) const
index 3fb6659b85163f0acafd69c1ce412d7b6b3d26de..7124fdd1e870f844b157a84a121b7c5621cf2ea3 100644 (file)
@@ -29,9 +29,11 @@ public:
   SGGeod(void);
   /// Initialize from a cartesian vector assumed to be in meters
   /// Note that this conversion is relatively expensive to compute
+  /// depricated
   SGGeod(const SGVec3<double>& cart);
   /// Initialize from a geocentric position
   /// Note that this conversion is relatively expensive to compute
+  /// depricated
   SGGeod(const SGGeoc& geoc);
 
   /// Factory from angular values in radians and elevation is 0
@@ -46,6 +48,13 @@ public:
   static SGGeod fromRadM(double lon, double lat, double elevation);
   /// Factory from angular values in degrees and elevation in m
   static SGGeod fromDegM(double lon, double lat, double elevation);
+  /// Factory to convert position from a cartesian position assumed to be
+  /// in wgs84 measured in meters
+  /// Note that this conversion is relatively expensive to compute
+  static SGGeod fromCart(const SGVec3<double>& cart);
+  /// Factory to convert position from a geocentric position
+  /// Note that this conversion is relatively expensive to compute
+  static SGGeod fromGeoc(const SGGeoc& geoc);
 
   /// Return the geodetic longitude in radians
   double getLongitudeRad(void) const;
@@ -191,6 +200,26 @@ SGGeod::fromDegM(double lon, double lat, double elevation)
 #endif
 }
 
+inline
+SGGeod
+SGGeod::fromCart(const SGVec3<double>& cart)
+{
+  SGGeod geod;
+  SGGeodesy::SGCartToGeod(cart, geod);
+  return geod;
+}
+
+inline
+SGGeod
+SGGeod::fromGeoc(const SGGeoc& geoc)
+{
+  SGVec3<double> cart;
+  SGGeodesy::SGGeocToCart(geoc, cart);
+  SGGeod geod;
+  SGGeodesy::SGCartToGeod(cart, geod);
+  return geod;
+}
+
 inline
 double
 SGGeod::getLongitudeRad(void) const
index 024fe4c19ee1194289ecc0b26d1f5954318420b0..73ec59a02a744d9a693e02363c4ec20e6240e285 100644 (file)
@@ -27,9 +27,9 @@
 #include "SGGeodesy.hxx"
 #include "SGVec3.hxx"
 #include "SGVec4.hxx"
-#include "SGQuat.hxx"
-#include "SGMatrix.hxx"
 #include "SGGeoc.hxx"
 #include "SGGeod.hxx"
+#include "SGQuat.hxx"
+#include "SGMatrix.hxx"
 
 #endif
index cd193177a6ad378a5690f22756736745f68359af..3f0d5cc67fc136fc3d9b456522885cf471f052f6 100644 (file)
@@ -213,16 +213,16 @@ GeodesyTest(void)
   geod0 = SGGeod::fromDegM(30, 20, 17);
 
   // Test the conversion routines to cartesian coordinates
-  cart0 = geod0;
-  geod1 = cart0;
+  cart0 = SGVec3<double>::fromGeod(geod0);
+  geod1 = SGGeod::fromCart(cart0);
   if (epsDeg < fabs(geod0.getLongitudeDeg() - geod1.getLongitudeDeg()) ||
       epsDeg < fabs(geod0.getLatitudeDeg() - geod1.getLatitudeDeg()) ||
       epsM < fabs(geod0.getElevationM() - geod1.getElevationM()))
     return false;
 
   // Test the conversion routines to radial coordinates
-  geoc0 = cart0;
-  cart1 = geoc0;
+  geoc0 = SGGeoc::fromCart(cart0);
+  cart1 = SGVec3<double>::fromGeoc(geoc0);
   if (!equivalent(cart0, cart1))
     return false;
 
@@ -346,8 +346,8 @@ main(void)
     return EXIT_FAILURE;
 
   // Check geodetic/geocentric/cartesian conversions
-//   if (!GeodesyTest())
-//     return EXIT_FAILURE;
+  if (!GeodesyTest())
+    return EXIT_FAILURE;
 
   // Check interaction with sg*/sgd*
   if (!sgInterfaceTest())
index 36a140d6097dd3928fb9f22f5d24fc9398b44e5d..0a4aee06976e0132bc26a09a250c12cbe44063b2 100644 (file)
@@ -110,6 +110,11 @@ public:
   static SGQuat fromLonLatDeg(T lon, T lat)
   { return fromLonLatRad(SGMisc<T>::deg2rad(lon), SGMisc<T>::deg2rad(lat)); }
 
+  /// Return a quaternion rotation the the horizontal local frame from given
+  /// longitude and latitude
+  static SGQuat fromLonLat(const SGGeod& geod)
+  { return fromLonLatRad(geod.getLongitudeRad(), geod.getLatitudeRad()); }
+
   /// Create a quaternion from the angle axis representation
   static SGQuat fromAngleAxis(T angle, const SGVec3<T>& axis)
   {
index 4bd1cc3824fc3bbc377255c5e8c8a10b9e3fc0cb..1d2a16277a92434f9f39b833934d75366c6532af 100644 (file)
@@ -45,10 +45,12 @@ public:
   { _data[0] = data[0]; _data[1] = data[1]; _data[2] = data[2]; }
   /// Constructor. Initialize by a geodetic coordinate
   /// Note that this conversion is relatively expensive to compute
+  /// depricated
   SGVec3(const SGGeod& geod)
   { SGGeodesy::SGGeodToCart(geod, *this); }
   /// Constructor. Initialize by a geocentric coordinate
   /// Note that this conversion is relatively expensive to compute
+  /// depricated
   SGVec3(const SGGeoc& geoc)
   { SGGeodesy::SGGeocToCart(geoc, *this); }
 
@@ -125,11 +127,58 @@ public:
   static SGVec3 e3(void)
   { return SGVec3(0, 0, 1); }
 
+  /// Constructor. Initialize by a geodetic coordinate
+  /// Note that this conversion is relatively expensive to compute
+  static SGVec3 fromGeod(const SGGeod& geod);
+  /// Constructor. Initialize by a geocentric coordinate
+  /// Note that this conversion is relatively expensive to compute
+  static SGVec3 fromGeoc(const SGGeoc& geoc);
+
 private:
   /// The actual data
   T _data[3];
 };
 
+template<>
+inline
+SGVec3<double>
+SGVec3<double>::fromGeod(const SGGeod& geod)
+{
+  SGVec3<double> cart;
+  SGGeodesy::SGGeodToCart(geod, cart);
+  return cart;
+}
+
+template<>
+inline
+SGVec3<float>
+SGVec3<float>::fromGeod(const SGGeod& geod)
+{
+  SGVec3<double> cart;
+  SGGeodesy::SGGeodToCart(geod, cart);
+  return SGVec3<float>(cart(0), cart(1), cart(2));
+}
+
+template<>
+inline
+SGVec3<double>
+SGVec3<double>::fromGeoc(const SGGeoc& geoc)
+{
+  SGVec3<double> cart;
+  SGGeodesy::SGGeocToCart(geoc, cart);
+  return cart;
+}
+
+template<>
+inline
+SGVec3<float>
+SGVec3<float>::fromGeoc(const SGGeoc& geoc)
+{
+  SGVec3<double> cart;
+  SGGeodesy::SGGeocToCart(geoc, cart);
+  return SGVec3<float>(cart(0), cart(1), cart(2));
+}
+
 /// Unary +, do nothing ...
 template<typename T>
 inline
index 4de126d5848c145ea3448574a3bbc491c63b1adf..adba76bc3f75f2ffa8d35bec4b2ee8f333f8c7dd 100644 (file)
@@ -73,10 +73,9 @@ static inline double M0( double e2 ) {
 }
 
 
-// given, alt, lat1, lon1, az1 and distance (s), calculate lat2, lon2
+// given, lat1, lon1, az1 and distance (s), calculate lat2, lon2
 // and az2.  Lat, lon, and azimuth are in degrees.  distance in meters
-int geo_direct_wgs_84 ( double alt, double lat1,
-                        double lon1, double az1,
+int geo_direct_wgs_84 ( double lat1, double lon1, double az1,
                         double s, double *lat2, double *lon2,
                         double *az2 )
 {
@@ -160,16 +159,15 @@ int geo_direct_wgs_84 ( double alt, double lat1,
        double dM = a*M0(e2) - s;
        double paz = ( phi1 < 0.0 ? 180.0 : 0.0 );
         double zero = 0.0f;
-       return geo_direct_wgs_84( alt, zero, lon1, paz, dM, lat2, lon2, az2 );
+       return geo_direct_wgs_84( zero, lon1, paz, dM, lat2, lon2, az2 );
     } 
 }
 
 
-// given alt, lat1, lon1, lat2, lon2, calculate starting and ending
+// given lat1, lon1, lat2, lon2, calculate starting and ending
 // az1, az2 and distance (s).  Lat, lon, and azimuth are in degrees.
 // distance in meters
-int geo_inverse_wgs_84( double alt, double lat1,
-                        double lon1, double lat2,
+int geo_inverse_wgs_84( double lat1, double lon1, double lat2,
                        double lon2, double *az1, double *az2,
                         double *s )
 {
@@ -192,14 +190,14 @@ int geo_inverse_wgs_84( double alt, double lat1,
        return 0;
     } else if(  fabs(cosphi1) < testv ) {
        // initial point is polar
-       int k = geo_inverse_wgs_84( alt, lat2,lon2,lat1,lon1, az1,az2,s );
+       int k = geo_inverse_wgs_84( lat2,lon2,lat1,lon1, az1,az2,s );
        k = k; // avoid compiler error since return result is unused
        b = *az1; *az1 = *az2; *az2 = b;
        return 0;
     } else if( fabs(cosphi2) < testv ) {
        // terminal point is polar
         double _lon1 = lon1 + 180.0f;
-       int k = geo_inverse_wgs_84( alt, lat1, lon1, lat1, _lon1, 
+       int k = geo_inverse_wgs_84( lat1, lon1, lat1, _lon1, 
                                    az1, az2, s );
        k = k; // avoid compiler error since return result is unused
        *s /= 2.0;
@@ -211,8 +209,8 @@ int geo_inverse_wgs_84( double alt, double lat1,
     {
        // Geodesic passes through the pole (antipodal)
        double s1,s2;
-       geo_inverse_wgs_84( alt, lat1,lon1, lat1,lon2, az1,az2, &s1 );
-       geo_inverse_wgs_84( alt, lat2,lon2, lat1,lon2, az1,az2, &s2 );
+       geo_inverse_wgs_84( lat1,lon1, lat1,lon2, az1,az2, &s1 );
+       geo_inverse_wgs_84( lat2,lon2, lat1,lon2, az1,az2, &s2 );
        *az2 = *az1;
        *s = s1 + s2;
        return 0;
index c2f9b291c29dde6a07685370d2102ee1a41305f4..32df3008cee8e3b760c20192d104db8c903a795b 100644 (file)
@@ -4,18 +4,6 @@
 #include <simgear/math/point3d.hxx>
 #include "SGMath.hxx"
 
-// Returns the insersection of the line joining the center of the
-// earth and the specified cylindrical point with the surface of the
-// WGS84 ellipsoid.  Works by finding a normalization constant (in
-// squashed space) that places the squashed point on the surface of
-// the sphere.
-inline double seaLevelRadius(double r, double z)
-{
-    double sr = r * SGGeodesy::SQUASH;
-    double zz = z*z;
-    return SGGeodesy::POLRAD*sqrt((r*r + zz)/(sr*sr + zz));
-}
-
 /** 
  * Convert from geocentric coordinates to geodetic coordinates
  * @param lat_geoc (in) Geocentric latitude, radians, + = North
@@ -56,11 +44,12 @@ inline void sgGeodToGeoc(double lat_geod, double alt,
                          double *sl_radius, double *lat_geoc)
 {
   SGVec3<double> cart;
-  SGGeodesy::SGGeodToCart(SGGeod::fromRadM(0, lat_geod, alt), cart);
+  SGGeod geod = SGGeod::fromRadM(0, lat_geod, alt);
+  SGGeodesy::SGGeodToCart(geod, cart);
   SGGeoc geoc;
   SGGeodesy::SGCartToGeoc(cart, geoc);
   *lat_geoc = geoc.getLatitudeRad();
-  *sl_radius = seaLevelRadius(cart(0), cart(2));
+  *sl_radius = SGGeodesy::SGGeodToSeaLevelRadius(geod);
 }
 
 
@@ -130,7 +119,7 @@ inline Point3D sgGeodToCart(const Point3D& geod)
 /**
  * Given a starting position and an offset radial and distance,
  * calculate an ending positon on a wgs84 ellipsoid.
- * @param alt (in) meters
+ * @param alt (in) meters (unused)
  * @param lat1 (in) degrees
  * @param lon1 (in) degrees
  * @param az1 (in) degrees
@@ -139,16 +128,39 @@ inline Point3D sgGeodToCart(const Point3D& geod)
  * @param lon2 (out) degrees
  * @param az2 (out) return course in degrees
  */
-int geo_direct_wgs_84 ( double alt, double lat1,
-                        double lon1, double az1, 
+int geo_direct_wgs_84 ( double lat1, double lon1, double az1, 
                        double s, double *lat2, double *lon2,
                         double *az2 );
+inline int geo_direct_wgs_84 ( double alt, double lat1,
+                        double lon1, double az1, 
+                       double s, double *lat2, double *lon2,
+                        double *az2 )
+{ return geo_direct_wgs_84(lat1, lon1, az1, s, lat2, lon2, az2); }
 
+/**
+ * Given a starting position and an offset radial and distance,
+ * calculate an ending positon on a wgs84 ellipsoid.
+ * @param p1 (in) geodetic position
+ * @param az1 (in) degrees
+ * @param s (in) distance in meters
+ * @param p2 (out) geodetic position
+ * @param az2 (out) return course in degrees
+ */
+inline int geo_direct_wgs_84(const SGGeod& p1, double az1,
+                             double s, SGGeod& p2, double *az2 )
+{
+  double lat2, lon2;
+  int ret = geo_direct_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
+                              az1, s, &lat2, &lon2, az2);
+  p2.setLatitudeDeg(lat2);
+  p2.setLongitudeDeg(lon2);
+  return ret;
+}
 
 /**
  * Given an altitude and two sets of (lat, lon) calculate great circle
  * distance between them as well as the starting and ending azimuths.
- * @param alt (in) meters
+ * @param alt (in) meters (unused)
  * @param lat1 (in) degrees
  * @param lon1 (in) degrees
  * @param lat2 (in) degrees
@@ -157,9 +169,31 @@ int geo_direct_wgs_84 ( double alt, double lat1,
  * @param az2 (out) end heading degrees
  * @param s (out) distance meters
  */
-int geo_inverse_wgs_84( double alt, double lat1,
-                        double lon1, double lat2,
+int geo_inverse_wgs_84( double lat1, double lon1, double lat2,
                        double lon2, double *az1, double *az2,
                         double *s );
+inline int geo_inverse_wgs_84( double alt, double lat1,
+                               double lon1, double lat2,
+                               double lon2, double *az1, double *az2,
+                               double *s )
+{ return geo_inverse_wgs_84(lat1, lon1, lat2, lon2, az1, az2, s); }
+
+
+/**
+ * Given an altitude and two sets of (lat, lon) calculate great circle
+ * distance between them as well as the starting and ending azimuths.
+ * @param p1 (in) first position
+ * @param p2 (in) fsecond position
+ * @param az1 (out) start heading degrees
+ * @param az2 (out) end heading degrees
+ * @param s (out) distance meters
+ */
+inline int geo_inverse_wgs_84(const SGGeod& p1, const SGGeod& p2,
+                              double *az1, double *az2, double *s )
+{
+  return geo_inverse_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
+                            p2.getLatitudeDeg(), p2.getLongitudeDeg(),
+                            az1, az2, s);
+}
 
 #endif // _SG_GEODESY_HXX
index f5c483fc6d583c815dec812c6190e2f1856930aa..32cfbe2c590f948e5a10f9d63bdd4b0b89001f2b 100644 (file)
@@ -102,6 +102,14 @@ SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
   _elev_ft = elev_ft;
 }
 
+void
+SGModelPlacement::setPosition(const SGGeod& position)
+{
+  _lon_deg = position.getLongitudeDeg();
+  _lat_deg = position.getLatitudeDeg();
+  _elev_ft = position.getElevationFt();
+}
+
 void
 SGModelPlacement::setRollDeg (double roll_deg)
 {
@@ -129,4 +137,10 @@ SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
   _heading_deg = heading_deg;
 }
 
+void
+SGModelPlacement::setOrientation (const SGQuatd& orientation)
+{
+  orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
+}
+
 // end of model.cxx
index 1b6654feb9bd8656d651de13d8765dd0d1f449e8..962139ea068eb06d9f77c1c0d4d3ce4dbe8ee492 100644 (file)
@@ -66,6 +66,7 @@ public:
   virtual void setLatitudeDeg (double lat_deg);
   virtual void setElevationFt (double elev_ft);
   virtual void setPosition (double lon_deg, double lat_deg, double elev_ft);
+  void setPosition(const SGGeod& position);
 
   virtual double getRollDeg () const { return _roll_deg; }
   virtual double getPitchDeg () const { return _pitch_deg; }
@@ -76,6 +77,7 @@ public:
   virtual void setHeadingDeg (double heading_deg);
   virtual void setOrientation (double roll_deg, double pitch_deg,
                                double heading_deg);
+  void setOrientation(const SGQuatd& orientation);
   
   ssgPlacementTransform * getTransform(void)
   { return _position; }
index 56b7f1a28bfa0e841a6ef75a4374af54b2d6ed16..9cb9f38b2a4e2ed28ad2c5bd158decbb717d0235 100644 (file)
@@ -27,8 +27,8 @@
  * written for FlightGear, in order to store Timezone control points. 
  *
  ************************************************************************/
+#include <simgear/math/SGMath.hxx>
 #include "geocoord.h"
-#include <plib/sg.h>
 
 SGGeoCoord::SGGeoCoord(const SGGeoCoord& other)
 {
@@ -36,57 +36,20 @@ SGGeoCoord::SGGeoCoord(const SGGeoCoord& other)
   lon = other.lon;
 }
 
-// double SGGeoCoord::getAngle(const SGGeoCoord& other) const
-// {
-//   Vector first(      getX(),       getY(),       getZ());
-//   Vector secnd(other.getX(), other.getY(), other.getZ());
-//     double
-//       dot = VecDot(first, secnd),
-//       len1 = first.VecLen(),
-//       len2 = secnd.VecLen(),
-//       len = len1 * len2,
-//       angle = 0;
-//     //printf ("Dot: %f, len1: %f len2: %f\n", dot, len1, len2);
-//     /*Vector pPos = prevPos - Reference->prevPos;
-//       Vector pVel = prevVel - Reference->prevVel;*/
-
-
-//     if ( ( (dot / len) < 1) && (dot / len > -1) && len )
-//             angle = acos(dot / len);
-//     return angle;
-// }
-
-// SGGeoCoord* SGGeoCoordContainer::getNearest(const SGGeoCoord& ref) const
-// {
-//   float angle, maxAngle = 180;
-
-//   SGGeoCoordVectorConstIterator i, nearest;
-//   for (i = data.begin(); i != data.end(); i++)
-//     {
-//       angle = SGD_RADIANS_TO_DEGREES * (*i)->getAngle(ref);
-//       if (angle < maxAngle)
-//     {
-//       maxAngle = angle;
-//       nearest = i;
-//     }
-//     }
-//   return *nearest;
-// }
-
-
 SGGeoCoord* SGGeoCoordContainer::getNearest(const SGGeoCoord& ref) const
 {
-  sgVec3 first, secnd;
-  float dist, maxDist=SG_MAX;
-  sgSetVec3( first, ref.getX(), ref.getY(), ref.getZ());
+  if (data.empty())
+    return 0;
+
+  float maxCosAng = -2;
+  SGVec3f refVec(ref.getX(), ref.getY(), ref.getZ());
   SGGeoCoordVectorConstIterator i, nearest;
-  for (i = data.begin(); i != data.end(); i++)
+  for (i = data.begin(); i != data.end(); ++i)
     {
-      sgSetVec3(secnd, (*i)->getX(), (*i)->getY(), (*i)->getZ());
-      dist = sgDistanceSquaredVec3(first, secnd);
-      if (dist < maxDist)
+      float cosAng = dot(refVec, SGVec3f((*i)->getX(), (*i)->getY(), (*i)->getZ()));
+      if (maxCosAng < cosAng)
        {
-         maxDist = dist;
+         maxCosAng = cosAng;
          nearest = i;
        }
     }
index dbea68c253bab9ce728c0af395daae9f8866a27e..956e1189f1ca4b778fbee390192d28d35d45d229 100644 (file)
 
 
 #include <math.h>
-#include <string>
-#include STL_IOSTREAM
-//#include <streambuf> // looks like streambuf does not exist on linux.
-// But it looks like it isn't used anyways -:)
 #include <vector>
 
 SG_USING_NAMESPACE(std);
@@ -66,8 +62,6 @@ public:
   float getZ()   const { return sin(SGD_DEGREES_TO_RADIANS*lat); };
 
 
-  //double getAngle(const SGGeoCoord& other) const;
-  virtual void print() {} ; 
   virtual const char * getDescription() {return 0;};
 };
 
index 2efdafffb40b7f75ac44a98cc9d651cc24786dce..aa282b546ca5196d616c5ae667d58989298072e5 100644 (file)
@@ -28,6 +28,7 @@
 #define _TIMEZONE_H_
 
 #include <stdio.h>
+#include <string>
 
 #include <simgear/timing/geocoord.h>
 
@@ -84,11 +85,6 @@ public:
      */
     virtual ~SGTimeZone() { };
   
-    /**
-     * Print the descriptor string
-     */
-    virtual void print() { printf("%s", descriptor.c_str()); }
-
     /**
      * Return the descriptor string
      * @return descriptor string (char array)