00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef GRIBFILEINDEX_H_
00028 #define GRIBFILEINDEX_H_
00029 #include <boost/date_time/posix_time/posix_time.hpp>
00030 #include <boost/filesystem.hpp>
00031 #include <vector>
00032 #include "fimex/XMLDoc.h"
00033 #include "fimex/GridDefinition.h"
00034 #include <boost/date_time/posix_time/posix_time_types.hpp>
00035
00036
00037 struct grib_handle;
00038
00039 namespace MetNoFimex
00040 {
00041 class GribFileMessage
00042 {
00043 public:
00044 GribFileMessage();
00045 GribFileMessage(boost::shared_ptr<grib_handle> gh, const std::string& fileURL, long filePos, long msgPos);
00046 GribFileMessage(boost::shared_ptr<XMLDoc>, std::string nsPrefix, xmlNodePtr node);
00047 ~GribFileMessage();
00048
00050 bool isValid() const {return fileURL_ != "";}
00052 std::string toString() const;
00054 const long getEdition() const;
00055 const std::string& getFileURL() const;
00056 const size_t getFilePosition() const;
00058 const size_t getMessageNumber() const;
00059 const std::string& getName() const;
00060 const std::string& getShortName() const;
00061 boost::posix_time::ptime getDateTime() const;
00062 long getLevelNumber() const;
00063 long getLevelType() const;
00069 const std::vector<long>& getParameterIds() const;
00070 const std::string& getTypeOfGrid() const;
00071 const GridDefinition& getGridDefinition() const;
00072 private:
00073 std::string fileURL_;
00074 size_t filePos_;
00075 size_t msgPos_;
00076 std::string parameterName_;
00077 std::string shortName_;
00078
00079
00080 std::vector<long> gridParmeterIds_;
00081 long edition_;
00082 long dataTime_;
00083 long dataDate_;
00084 long levelType_;
00085 long levelNo_;
00086 std::string typeOfGrid_;
00087 GridDefinition gridDefinition_;
00088 };
00089
00091 class GribFileMessageEqualTime : public std::unary_function<bool, const GribFileMessage&> {
00092 public:
00093 GribFileMessageEqualTime(boost::posix_time::ptime time) : time_(time) {}
00094 ~GribFileMessageEqualTime() {}
00095 bool operator()(const GribFileMessage& gfm) { return gfm.getDateTime() == time_; }
00096 private:
00097 boost::posix_time::ptime time_;
00098 };
00099
00101 class GribFileMessageEqualLevelTime : public std::unary_function<bool, const GribFileMessage&> {
00102 public:
00103 GribFileMessageEqualLevelTime(long edition, long levelType, long levelNo, boost::posix_time::ptime time) : edition_(edition), levelType_(levelType), levelNo_(levelNo), time_(time) {}
00104 ~GribFileMessageEqualLevelTime() {}
00105 bool operator()(const GribFileMessage& gfm) { return (gfm.getEdition() == edition_) && (gfm.getLevelType() == levelType_) && (gfm.getLevelNumber() == levelNo_) && (gfm.getDateTime() == time_); }
00106 private:
00107 long edition_;
00108 long levelType_;
00109 long levelNo_;
00110 boost::posix_time::ptime time_;
00111 };
00112
00121 size_t gribDataRead(const GribFileMessage& gfm, std::vector<double>& data, double missingValue);
00122
00123 class GribFileIndex
00124 {
00125 public:
00126 GribFileIndex();
00140 GribFileIndex(boost::filesystem::path gribFilePath, bool ignoreExistingXml = false);
00141 virtual ~GribFileIndex();
00142 const std::vector<GribFileMessage>& listMessages() const {return messages_;}
00143 const std::string& getUrl() const {return url_;}
00144 private:
00145 std::string url_;
00146 std::vector<GribFileMessage> messages_;
00147 void initByGrib(boost::filesystem::path gribFilePath);
00148 void initByXML(boost::filesystem::path xmlFilePath);
00149 };
00150
00152 std::ostream& operator<<(std::ostream& os, const GribFileMessage& gfm);
00154 std::ostream& operator<<(std::ostream& os, const GribFileIndex& gfm);
00155
00156
00157 }
00158
00159
00160 #endif