00001
00040 #ifndef INC_MI32_GPSDBASE_H
00041 #define INC_MI32_GPSDBASE_H
00042
00043 #ifndef INC_MI32_DATETIME_H
00044 #include <mi32/datetime.h>
00045 #endif
00046
00047 #ifndef INC_MI32_FILEPATH_H
00048 #include <mi32/filepath.h>
00049 #endif
00050
00051 #ifndef INC_MI32_SPATREF_H
00052 #include <mi32/spatref.h>
00053 #endif
00054
00055 #ifndef INC_MGUI_DLGSHELL_H
00056 #include <mgui/dlgshell.h>
00057 #endif
00058
00059 #ifndef INC_MGUI_COMBOBOX_H
00060 #include <mgui/combobox.h>
00061 #endif
00062
00063 #ifndef INC_MGUI_FORMRADIOBUTTONS_H
00064 #include <mgui/formradiobuttons.h>
00065 #endif
00066
00067 #ifndef INC_MGUI_FORMBTXT_H
00068 #include <mgui/formbtxt.h>
00069 #endif
00070
00071 #ifndef INC_VECTOR
00072 #include <vector>
00073 #define INC_VECTOR
00074 #endif
00075
00076
00078 class GPSDATABASE {
00079 public:
00081 enum GPSMETHOD {
00082 GPSMETHOD_Interpolate,
00083 GPSMETHOD_Closest
00084 };
00085
00087 GPSDATABASE ( );
00088
00090 ~GPSDATABASE () { }
00091
00093 class LOGPARMS {
00094 public:
00095 enum DATEFORMAT {
00096 DATEFORMAT_YYYYMMDD,
00097 DATEFORMAT_YYYY_MM_DD,
00098 DATEFORMAT_MMDDYYYY,
00099 DATEFORMAT_MM_DD_YYYY,
00100 DATEFORMAT_DDMMYYYY,
00101 DATEFORMAT_DD_MM_YYYY,
00102 DATEFORMAT_YYMMDD,
00103 DATEFORMAT_YY_MM_DD,
00104 DATEFORMAT_MMDDYY,
00105 DATEFORMAT_MM_DD_YY,
00106 DATEFORMAT_DDMMYY,
00107 DATEFORMAT_DD_MM_YY
00108 };
00109
00110 enum TIMEFORMAT {
00111 TIMEFORMAT_HHMMSS,
00112 TIMEFORMAT_HH_MM_SS
00113 };
00114
00115 LOGPARMS(
00116 int XField,
00117 int YField,
00118 int ZField,
00119 int XDirField,
00120 int YDirField,
00121 int DateField,
00122 int TimeField,
00123 int HeadingField,
00124 int SpeedField,
00125 MISTRING delimiter,
00126 int NumHeaderLines = 0,
00127 DATEFORMAT DateFmt = DATEFORMAT_YYYYMMDD,
00128 TIMEFORMAT TimeFmt = TIMEFORMAT_HHMMSS,
00129 DMSTYPE LatLonFmt = DMSTYPE_DecDeg,
00130 bool IsColumnFormat = false
00131 );
00132
00133 LOGPARMS();
00134
00135 ~LOGPARMS() {}
00136
00137 int GetXField() const {return m_XField;}
00138 void SetXField(int XField) {m_XField = XField;}
00139
00140 int GetYField() const {return m_YField;}
00141 void SetYField(int YField) {m_YField = YField;}
00142
00143 int GetXDirField() const {return m_XDirField;}
00144 void SetXDirField(int XDirField) {m_XDirField = XDirField;}
00145
00146 int GetYDirField() const {return m_YDirField;}
00147 void SetYDirField(int YDirField) {m_YDirField = YDirField;}
00148
00149 int GetZField() const {return m_ZField;}
00150 void SetZField(int ZField) {m_ZField = ZField;}
00151
00152 int GetDateField() const {return m_DateField;}
00153 void SetDateField(int DateField) {m_DateField = DateField;}
00154
00155 int GetTimeField() const {return m_TimeField;}
00156 void SetTimeField(int TimeField) {m_TimeField = TimeField;}
00157
00158 int GetHeadingField() const {return m_HeadingField;}
00159 void SetHeadingField(int HeadingField) {m_HeadingField = HeadingField;}
00160
00161 int GetSpeedField() const {return m_SpeedField;}
00162 void SetSpeedField(int SpeedField) {m_SpeedField = SpeedField;}
00163
00164 DATEFORMAT GetDateFmt() const {return m_DateFmt;}
00165 void SetDateFmt(DATEFORMAT DateFmt) {m_DateFmt = DateFmt;}
00166
00167 TIMEFORMAT GetTimeFmt() const {return m_TimeFmt;}
00168 void SetTimeFmt(TIMEFORMAT TimeFmt) {m_TimeFmt = TimeFmt;}
00169
00170 DMSTYPE GetLatLonFmt() const {return m_LatLonFmt;}
00171 void SetLatLonFmt(DMSTYPE LatLonFmt) {m_LatLonFmt = LatLonFmt;}
00172
00173 int GetNumHeaderLines() const {return m_NumHeaderLines;}
00174 void SetNumHeaderLines(int NumHeaderLines) {m_NumHeaderLines = NumHeaderLines;}
00175
00176 SPATREF::COORDREFSYS GetCrs() const {return m_crs;}
00177 void SetCrs(SPATREF::COORDREFSYS crs) {m_crs = crs;}
00178
00179 const MISTRING& GetDelimiter () const {return m_Delimiter;}
00180 void SetDelimiter (MISTRING val) {m_Delimiter= val;}
00181
00182 bool GetIsColumnFormat () const {return m_IsColumnFormat;}
00183 void SetIsColumnFormat (bool val) {m_IsColumnFormat = val;}
00184
00185 private:
00186 int m_XField;
00187 int m_YField;
00188 int m_ZField;
00189 int m_XDirField;
00190 int m_YDirField;
00191 int m_DateField;
00192 int m_TimeField;
00193 int m_HeadingField;
00194 int m_SpeedField;
00195 DATEFORMAT m_DateFmt;
00196 TIMEFORMAT m_TimeFmt;
00197 DMSTYPE m_LatLonFmt;
00198 int m_NumHeaderLines;
00199 SPATREF::COORDREFSYS m_crs;
00200 MISTRING m_Delimiter;
00201 bool m_IsColumnFormat;
00202 };
00203
00205 class POINTRECORD {
00206 public:
00207 POINTRECORD();
00208 POINTRECORD(const POINTRECORD& rhs);
00209 ~POINTRECORD() {}
00210
00211 int GetLogNumber() const {return m_lognumber;}
00212 void SetLogNumber(int lognumber) {m_lognumber = lognumber;}
00213
00214 DATETIME GetDateTime() const {return m_datetime;}
00215 void SetDateTime(const DATETIME& datetime) {m_datetime = datetime;}
00216
00217 DPOINT3D GetLocation() const {return m_location;}
00218 void SetLocation(const DPOINT3D& location) {m_location = location;}
00219
00220 double GetHeading() const {return m_heading;}
00221 void SetHeading(double heading) {m_heading = heading;}
00222
00223 double GetSpeed() const {return m_speed;}
00224 void SetSpeed(double speed) {m_speed = speed;}
00225
00226 bool operator< (const POINTRECORD& rhs ) const {return (m_datetime < rhs.m_datetime);}
00227
00228 private:
00229 int m_lognumber;
00230 DATETIME m_datetime;
00231 DPOINT3D m_location;
00232 double m_heading;
00233 double m_speed;
00234 };
00235
00237 class LOGRECORD {
00238 public:
00240 enum LOGFORMAT {
00241 LOGFORMAT_GPX = 1,
00242 LOGFORMAT_NMEA = 2,
00243 LOGFORMAT_MI = 3,
00244 LOGFORMAT_TEXT = 4
00245 };
00246
00247 LOGRECORD();
00248 LOGRECORD(const LOGRECORD& rhs);
00249 ~LOGRECORD() {}
00250
00251 LOGFORMAT GetLogFormat() const {return m_logformat;}
00252 void SetLogFormat(LOGFORMAT logfmt) {m_logformat = logfmt;}
00253
00254 FILEPATH GetLogPath() const {return m_logpath;}
00255 void SetLogPath(const FILEPATH& logpath) {m_logpath = logpath;}
00256
00257 MISTRING GetLogName() const {return m_logname;}
00258 void SetLogName(const MISTRING& logname) {m_logname = logname;}
00259
00260 int GetLogNumber() const {return m_lognumber;}
00261 void SetLogNumber(int lognumber) {m_lognumber = lognumber;}
00262
00263 DATETIME GetStartDateTime() const {return m_startdatetime;}
00264 void SetStartDateTime(const DATETIME& datetime) {m_startdatetime = datetime;}
00265 DATETIME GetEndDateTime() const {return m_enddatetime;}
00266 void SetEndDateTime(const DATETIME& datetime) {m_enddatetime = datetime;}
00267
00268 private:
00269 FILEPATH m_logpath;
00270 MISTRING m_logname;
00271 int m_lognumber;
00272 LOGFORMAT m_logformat;
00273
00274 DATETIME m_startdatetime;
00275 DATETIME m_enddatetime;
00276 };
00277
00278 #ifdef USE_MGUI
00280 class DLG_IMPORTTXT : public MGUI::DLGSHELL {
00281 public:
00282 DLG_IMPORTTXT ();
00283 virtual ~DLG_IMPORTTXT ();
00284
00285 GPSDATABASE::LOGPARMS GetParms() const {return m_parms;}
00286 bool GetOkPressed() const {return m_OkPressed;}
00287
00288 private:
00289 GPSDATABASE::LOGPARMS m_parms;
00290 SPATREF::COORDREFSYS m_crs;
00291
00292 MGUI::FORM_EDIT_NUMBER m_NumHeaderLines;
00293 MGUI::FORM_EDIT_NUMBER m_XField;
00294 MGUI::FORM_EDIT_NUMBER m_YField;
00295 MGUI::FORM_EDIT_NUMBER m_XDirField;
00296 MGUI::FORM_EDIT_NUMBER m_YDirField;
00297 MGUI::FORM_EDIT_NUMBER m_ZField;
00298 MGUI::FORM_EDIT_NUMBER m_DateField;
00299 MGUI::FORM_EDIT_NUMBER m_TimeField;
00300 MGUI::FORM_EDIT_NUMBER m_HeadingField;
00301 MGUI::FORM_EDIT_NUMBER m_SpeedField;
00302 MGUI::FORM_COMBOBOX m_LatLonFmt;
00303 MGUI::FORM_COMBOBOX m_DateFmt;
00304 MGUI::FORM_COMBOBOX m_TimeFmt;
00305 MGUI::FORM_RADIOBUTTONS m_IsColumn;
00306 MGUI::FORM_EDIT_STRING m_DelimitedByEdit;
00307 MGUI::FORM_BUTTONTEXT m_FormCRS;
00308 bool m_OkPressed;
00309 void OnSetFormat();
00310 void OnSelectCRS();
00311
00312 virtual ERRVALUE v_CreateContent();
00313 virtual void v_OnOK();
00314 virtual void v_OnCancel();
00315 };
00316 #endif
00317
00319 void SetOffset (INT32 offset);
00320
00322 DATETIME& ApplyOffset(DATETIME datetime);
00323
00325 ERRVALUE ReadLog (const FILEPATH& logpath);
00326
00328 ERRVALUE ReadLogText (
00329 const FILEPATH& logpath,
00330 const LOGPARMS& logparms
00331 );
00332
00334 void Compute (
00335 const DATETIME& datetime,
00336 POINTRECORD& OutputRecord,
00337 POINTRECORD& PrevRecord,
00338 POINTRECORD& NextRecord,
00339 GPSMETHOD method = GPSMETHOD_Interpolate,
00340 double errortime = 60.0
00341 );
00342
00345 ERRVALUE AddLogPath (
00346 const FILEPATH& logpath,
00347 int& lognumber
00348 );
00351 ERRVALUE AddLogName (
00352 const MISTRING& logname,
00353 int& lognumber
00354 );
00356 ERRVALUE GetLog (
00357 UINT32 index,
00358 LOGRECORD& log
00359 );
00361 ERRVALUE GetLog (
00362 int lognumber,
00363 LOGRECORD& log
00364 );
00366 ERRVALUE GetLog (
00367 const FILEPATH& logpath,
00368 LOGRECORD& log
00369 );
00371 ERRVALUE RemoveLog (int lognumber);
00373 ERRVALUE RemoveLog (const FILEPATH& logpath);
00375 void RemoveAllLogs ();
00376
00379 ERRVALUE AddPoint (POINTRECORD record);
00381 ERRVALUE GetPoint (
00382 UINT32 index,
00383 POINTRECORD& record
00384 );
00386 ERRVALUE GetPoint (
00387 const DATETIME& datetime,
00388 POINTRECORD& record
00389 );
00391 ERRVALUE RemovePoint (UINT32 index);
00393 ERRVALUE RemovePoint (const DATETIME& datetime);
00395 ERRVALUE RemovePoints (int lognumber);
00396
00398 UINT32 GetNumLogs () const {return m_LogList.size();}
00400 UINT32 GetNumPoints () const {return m_PointList.size();}
00401
00403 ERRVALUE GetLogPath (
00404 int lognumber,
00405 FILEPATH& logpath
00406 );
00408 ERRVALUE GetLogNum (
00409 const FILEPATH& logpath,
00410 int& lognumber
00411 );
00412
00414 std::vector<LOGRECORD>& GetLogList ();
00416 std::vector<POINTRECORD>& GetPointList ();
00418 double GetOffset() const {return (m_offset); };
00419
00420 private:
00421 #ifndef GENERATING_DOXYGEN_OUTPUT
00423 ERRVALUE ScanLine (
00424 const LOGPARMS& settings,
00425 char *linebuf,
00426 DPOINT3D& location,
00427 DATETIME& datetime,
00428 double& heading,
00429 double& speed
00430 );
00432 std::vector<LOGRECORD> m_LogList;
00434 std::vector<POINTRECORD> m_PointList;
00436 INT32 m_offset;
00438 int m_lognum;
00440 DATETIME m_datetime;
00441 #endif
00442 };
00443 #endif //INC_MI32_GPSDATABASE_H