1 /********************************************************************** 2 zyGrib: meteorological GRIB file viewer 3 Copyright (C) 2008 - Jacques Zaninetti - http://www.zygrib.org 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation, either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 ***********************************************************************/ 18 19 /************************* 20 Reader for a GRIB file 21 22 *************************/ 23 24 #ifndef GRIBREADER_H 25 #define GRIBREADER_H 26 27 #include "wx/wxprec.h" 28 29 #ifndef WX_PRECOMP 30 #include "wx/wx.h" 31 #endif //precompiled headers 32 33 34 #include <iostream> 35 #include <cmath> 36 #include <vector> 37 #include <set> 38 #include <map> 39 40 41 #include "GribRecord.h" 42 #include "zuFile.h" 43 44 //=============================================================== 45 class GribReader 46 { 47 public: 48 GribReader(); 49 GribReader(const wxString fname); 50 ~GribReader(); 51 52 void openFile(const wxString fname); isOk()53 bool isOk() {return ok;} getFileSize()54 long getFileSize() {return fileSize;} getFileName()55 wxString getFileName() {return fileName;} 56 57 int getNumberOfGribRecords(int dataType,int levelType,int levelValue); 58 int getTotalNumberOfGribRecords(); 59 60 GribRecord * getGribRecord(int dataType,int levelType,int levelValue, time_t date); 61 62 GribRecord * getFirstGribRecord(); 63 GribRecord * getFirstGribRecord(int dataType,int levelType,int levelValue); 64 65 std::vector<GribRecord *> * getListOfGribRecords(int dataType,int levelType,int levelValue); 66 67 // double getHoursBeetweenGribRecords() {return hoursBetweenRecords;} getListDates()68 std::set<time_t> getListDates() {return setAllDates;} getNumberOfDates()69 int getNumberOfDates() {return setAllDates.size();} getRefDate()70 time_t getRefDate() {return setAllDates.size()>0 ? 71 *setAllDates.begin() : 0;} 72 73 // Valeur pour un point et une date quelconques 74 double getTimeInterpolatedValue (int dataType,int levelType,int levelValue, double px, double py, time_t date); 75 76 // Crée un GribRecord interpolé 77 GribRecord * getTimeInterpolatedGribRecord (int dataType,int levelType,int levelValue, time_t date); 78 79 double computeDewPoint(double lon, double lat, time_t date); 80 81 int getDewpointDataStatus(int levelType,int levelValue); 82 83 enum GribFileDataStatus {DATA_IN_FILE, NO_DATA_IN_FILE, COMPUTED_DATA}; 84 85 void copyFirstCumulativeRecord (); 86 //void removeFirstCumulativeRecord (); 87 void copyMissingWaveRecords (); 88 void copyFirstCumulativeRecord (int dataType,int levelType,int levelValue); 89 //void removeFirstCumulativeRecord (int dataType,int levelType,int levelValue); 90 void copyMissingWaveRecords (int dataType,int levelType,int levelValue); 91 92 void computeAccumulationRecords (int dataType, int levelType, int levelValue); 93 getGribMap()94 std::map < std::string, std::vector<GribRecord *>* > * getGribMap(){ return &mapGribRecords; } //dsr 95 96 private: 97 bool ok; 98 wxString fileName; 99 ZUFILE *file; 100 long fileSize; 101 // double hoursBetweenRecords; 102 int dewpointDataStatus; 103 104 std::map < std::string, std::vector<GribRecord *>* > mapGribRecords; 105 106 void storeRecordInMap(GribRecord *rec); 107 108 void readGribFileContent(); 109 void readAllGribRecords(); 110 void createListDates(); 111 double computeHoursBeetweenGribRecords(); 112 std::set<time_t> setAllDates; 113 114 void clean_vector(std::vector<GribRecord *> &ls); 115 void clean_all_vectors(); 116 std::vector<GribRecord *> * getFirstNonEmptyList(); 117 118 // Interpolation between 2 GribRecord 119 double get2GribsInterpolatedValueByDate ( 120 double px, double py, time_t date, 121 GribRecord *before, GribRecord *after); 122 123 // Détermine les GribRecord qui encadrent une date 124 void findGribsAroundDate (int dataType,int levelType,int levelValue, time_t date, 125 GribRecord **before, GribRecord **after); 126 }; 127 128 129 #endif 130