]> git.mxchange.org Git - simgear.git/blobdiff - simgear/metar/MetarStation.cpp
Various MSVC fixes.
[simgear.git] / simgear / metar / MetarStation.cpp
index 22d4902711f528bf0c9ccdf4187d18bbbd6a7773..9000ae5ce9e347cece8cff1624a65e017c93c3ba 100644 (file)
@@ -1,22 +1,18 @@
 // Metar station implementation code
 
+#include <simgear/compiler.h>
+
+#include STL_IOSTREAM
 #include <stdio.h>
 
 #include "MetarStation.h"
 #include <algorithm>
-#define TESTPROG
-#ifndef TESTPROG
-// options is too tightly integrated into FlightGear to use in a test program
-#include <Main/options.hxx>
-#endif
-#include <simgear/misc/fgpath.hxx>
-
-
-std::vector< CMetarStation *> METAR_Stations;
 
-int CMetarStation::initialized( CMetarStation::initialize() );
-
-std::string CMetarStation::tempName;
+#if !defined (SG_HAVE_NATIVE_SGI_COMPILERS)
+SG_USING_STD(ostream);
+SG_USING_STD(cout);
+SG_USING_STD(endl);
+#endif
 
 
 double CMetarStation::decodeDMS( char *b )
@@ -50,9 +46,12 @@ double CMetarStation::decodeDMS( char *b )
                // Direction (E W N S)
                if ( *b == 'W' || *b == 'S' ) r = -r;
        }
-       return r * DEG_TO_RAD;
+       return r * SGD_DEGREES_TO_RADIANS;
 }
 
+// Constructor
+// Decodes METAR station string of this format:
+// KPUB;72;464;Pueblo, Pueblo Memorial Airport;CO;United States;4;38-17-24N;104-29-54W;38-17-03N;104-29-43W;1440;1420;P
 
 CMetarStation::CMetarStation( 
        char *s )
@@ -81,149 +80,139 @@ CMetarStation::CMetarStation(
        s = t; t = strchr( s, ';' ); *t = 0; t++;
        double ulongitude = decodeDMS( s );
        s = t; t = strchr( s, ';' ); *t = 0; t++;
-       double altitude = atoi( s ) * FEET_TO_METER;
+       double altitude = atoi( s ) * SG_FEET_TO_METER;
+       m_altitude = (int)altitude;
        s = t; t = strchr( s, ';' ); *t = 0; t++;
-       double ualtitude = atoi( s ) * FEET_TO_METER;
-       Point3D p( longitude, latitude, altitude+EQUATORIAL_RADIUS_M );
+       double ualtitude = atoi( s ) * SG_FEET_TO_METER;
+       Point3D p( longitude, latitude, altitude+SG_EQUATORIAL_RADIUS_M );
        m_locationPolar = p;
        m_locationCart = sgPolarToCart3d( p );
-       Point3D up( ulongitude, ulatitude, ualtitude+EQUATORIAL_RADIUS_M );
+       Point3D up( ulongitude, ulatitude, ualtitude+SG_EQUATORIAL_RADIUS_M );
        m_upperLocationPolar = up;
        m_upperLocationCart = sgPolarToCart3d( up );
        s = t;
        m_pFlag = s[0];
 }
-               // Constructor
-               // Decodes METAR station string of this format:
-               // KPUB;72;464;Pueblo, Pueblo Memorial Airport;CO;United States;4;38-17-24N;104-29-54W;38-17-03N;104-29-43W;1440;1420;P
+               
+
+
+void CMetarStation::dump()
+{
+       cout << "ID:" << ID();
+       cout << endl;
+       cout << "number:" << number();
+       cout << endl;
+       cout << "name:" << name();
+       cout << endl;
+       cout << "state:" << state();
+       cout << endl;
+       cout << "country:" << country();
+       cout << endl;
+       cout << "region:" << region();
+       cout << endl;
+       cout << "Location (cart):" << locationCart();
+       cout << endl;
+       cout << "Location (polar):" << locationPolar();
+       cout << endl;
+       cout << "Upper Location (cart):" << upperLocationCart();
+       cout << endl;
+       cout << "Upper Location (polar):" << upperLocationPolar();
+       cout << endl;
+       cout << "P flag:" << pFlag();
+       cout << endl;
+}
+
 
 
-int CMetarStation::initialize()
+CMetarStationDB::CMetarStationDB(const char * dbPath) 
 {
     // Read the list of metar stations, decoding and adding to global list.
 
     CMetarStation *m;
     char buf[256];
 
-    // Goto the Flight Gear installation directory
-#ifdef TESTPROG
-    //FGPath weatherPath( "/mkv/Build/FlightGear" );
-    FGPath weatherPath( ":Data" );
-#else
-    FGPath weatherPath( current_options.get_fg_root() );
-#endif
 
-    weatherPath.append( "Weather" );
-    weatherPath.append( "MetarStations" );
     // Open the metar station list
-    FILE *f = fopen( weatherPath.c_str(), "r" );
+    FILE *f = fopen( dbPath, "r" );
        
 
     if ( f != NULL ) {
        // Read each line, create an instance of a station, and add it to the vector
        while ( fgets( buf, 256, f) != NULL && feof( f ) == 0 ) {
-           //std::cout << buf << std::endl;
+           // cout << buf << endl;
            m = new CMetarStation( buf );
            //m->dump();
-           METAR_Stations.push_back( m );
+           METAR_Stations[m->ID()]=( m );
        }
        
        // Close the list
        fclose( f );
-       // std::cout << METAR_Stations.size() << " Metar stations" << std::endl;
-       return 1;
+       // cout << METAR_Stations.size() << " Metar stations" << endl;
+       
     } else {
-       // std::cout << "Could not open MetarStations file " << std::endl;
-       return 0;
+       // cout << "Could not open MetarStations file " << endl;
+       
     }
 }
 
 
-int CMetarStation::sameName( CMetarStation *m )
-{
-       return m->m_ID == tempName;
-}
-
-
-CMetarStation *CMetarStation::find( std::string stationID )
-{
-       tempName = stationID;
-       CMetarStation **m = std::find_if( METAR_Stations.begin(), METAR_Stations.end(), sameName );
-       if ( m != METAR_Stations.end() ) return *m;
-       return 0;
-}
-
-double bestDist;
-CMetarStation *bestStation;
-Point3D curLocation;
 
-void findHelper( CMetarStation *s )
+CMetarStation * CMetarStationDB::find( std::string stationID )
 {
-       double dist = s->locationCart().distance3Dsquared( curLocation );
-       if (dist < bestDist )
-       {
-               bestDist = dist;
-               bestStation = s;
-       }
+    std::map<std::string,CMetarStation*>::iterator target;
+    target = METAR_Stations.find(stationID);
+  if(target!= METAR_Stations.end() )
+      return target->second;
+  else 
+      return NULL;
 }
 
-CMetarStation *CMetarStation::find( Point3D locationCart )
-{
-       bestDist = 99999999;
-       bestStation = 0;
-       curLocation = locationCart;
-
-       for_each( findHelper );
-       return bestStation;
-}
 
 
-void CMetarStation::for_each( void f( CMetarStation *s ) )
+CMetarStation * CMetarStationDB::find( Point3D locationCart )
 {
-       std::for_each( METAR_Stations.begin(), METAR_Stations.end(), f );
+    std::map<std::string,CMetarStation*>::iterator itr;
+    double bestDist = 99999999;
+    CMetarStation *bestStation = NULL;
+    Point3D curLocation = locationCart;
+    itr = METAR_Stations.begin(); 
+    while(itr != METAR_Stations.end()) 
+      {
+       double dist = itr->second->locationCart().distance3Dsquared( curLocation );
+       if (dist < bestDist )
+         {
+           bestDist = dist;
+           bestStation = itr->second;
+         }
+       itr++;
+      }
+    
+    return bestStation;
 }
 
 
-void CMetarStation::dump()
-{
-       std::cout << "ID:" << ID();
-       std::cout << std::endl;
-       std::cout << "number:" << number();
-       std::cout << std::endl;
-       std::cout << "name:" << name();
-       std::cout << std::endl;
-       std::cout << "state:" << state();
-       std::cout << std::endl;
-       std::cout << "country:" << country();
-       std::cout << std::endl;
-       std::cout << "region:" << region();
-       std::cout << std::endl;
-       std::cout << "Location (cart):" << locationCart();
-       std::cout << std::endl;
-       std::cout << "Location (polar):" << locationPolar();
-       std::cout << std::endl;
-       std::cout << "Upper Location (cart):" << upperLocationCart();
-       std::cout << std::endl;
-       std::cout << "Upper Location (polar):" << upperLocationPolar();
-       std::cout << std::endl;
-       std::cout << "P flag:" << pFlag();
-       std::cout << std::endl;
+CMetarStationDB::~CMetarStationDB() {
+    std::map<std::string,CMetarStation*>::iterator itr;
+    for(itr = METAR_Stations.begin(); itr != METAR_Stations.end(); itr++) 
+      {
+       delete itr->second;
+    }
 }
 
-std::ostream&
+ostream&
 operator << ( ostream& out, const CMetarStation& p )
 {
     return out 
-               << "ID:" << p.m_ID << std::endl
-               << "number:" << p.m_number << std::endl
-               << "name:" << p.m_name << std::endl
-               << "state:" << p.m_state << std::endl
-               << "country:" << p.m_country << std::endl
-               << "region:" << p.m_region << std::endl
-               << "Location (cart):" << p.m_locationCart << std::endl
-               << "Location (polar):" << p.m_locationCart << std::endl
-               << "Upper Location (cart):" << p.m_upperLocationCart << std::endl
-               << "Upper Location (polar):" << p.m_upperLocationPolar << std::endl
-               << "P flag:" << p.m_pFlag << std::endl;
+               << "ID:" << p.m_ID << endl
+               << "number:" << p.m_number << endl
+               << "name:" << p.m_name << endl
+               << "state:" << p.m_state << endl
+               << "country:" << p.m_country << endl
+               << "region:" << p.m_region << endl
+               << "Location (cart):" << p.m_locationCart << endl
+               << "Location (polar):" << p.m_locationCart << endl
+               << "Upper Location (cart):" << p.m_upperLocationCart << endl
+               << "Upper Location (polar):" << p.m_upperLocationPolar << endl
+               << "P flag:" << p.m_pFlag << endl;
 }