根据GPS数据统计里程数(VC++)
2014-06-20 14:01
260 查看
代码片段个人收藏
/************************************************************************/ /* 根据返回的GPS获取里程数 */ /************************************************************************/ const double EARTH_RADIUS = 6378.137; const double PI = 3.1415926; double rad(double d) { return d * PI / 180.0; } //计算两个坐标之间的距离-纬度1,经度1,纬度2,经度2 double GetDistance(double StartLong,double StartLat,double EndLong,double EndLat)//(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(EndLat); double radLat2 = rad(StartLat); double a = radLat1 - radLat2; double b = rad(EndLong) - rad(StartLong); double s = 2 * asin(sqrt(pow(sin(a/2),2) + cos(radLat1)*cos(radLat2)*pow(sin(b/2),2))); s = s * EARTH_RADIUS; s= (s*10000)/10000; return s; }
//输入设备号 起始时间 结束时间 间距 char* selectGPSInfo(char* str_id,char* str_start,char*str_end,char*str_jump) { typedef struct s_NV_GPS_FILEHEAD { char szDeviceID[10]; // 设备ID. char szCompanyName[40]; // 公司名称. char szVehicleNo[20]; // 车牌号. char szDriverName[40]; // 司机姓名. char szLineNo[20]; // 线路号. char ucFlag; //0:老结构体 1:新结构体 char Reserved[381]; // 保留字节. }s_NV_GPS_FILEHEAD; //GSensor参数 typedef struct s_NV_GPS_GSensor { bool bValid; //信息有效性 float fAccelate_X; //x方向加速度(单位:g) float fAccelate_Y; //y方向加速度(单位:g) float fAccelate_Z; //z方向加速度(单位:g) }s_NV_GPS_GSensor; //GyroSensor typedef struct s_NV_GPS_GyroSensor { bool bValid; //信息有效性 float fCorner; //转角加速度(单位:g) }s_NV_GPS_GyroSensor; //GPS状态 typedef struct s_NV_GPS_Status { bool bValid; //信息有效性 bool bKeyValid; //车钥匙有效性 bool bBrakeValid; //刹车信号有效性 bool bLeftValid; //左转有效性 bool bRightValid; //右转有效性 bool bGPSModuleValid; //GPS模块有效性 }s_NV_GPS_Status; //GPS基础信息 typedef struct s_NV_GPS_BaseInfo { bool bValid; //信息有效性 double dbLongitude; //经度(>0:东经,<0:西经) double dbLatitude; //纬度(>0:南纬,<0:北纬) float fDirect; //方向(0~360°) float fSpeed; //速度(千米/小时,负数无效) }s_NV_GPS_BaseInfo; //GPS扩展信息 typedef struct s_NV_GPS_ExternInfo { bool bValid; //信息有效性 short sHigh; //海拔高度 char cSatelliteNumber; //卫星数量 float fTemperature; //温度(摄氏度,>=-10000无效) }s_NV_GPS_ExternInfo; typedef struct s_NV_GPS_All { s_NV_GPS_BaseInfo stBaseInfo; //基础信息 s_NV_GPS_Status stStatus; //状态数据 s_NV_GPS_GSensor stGSensor; //G-Sensor数据 s_NV_GPS_GyroSensor stGyroSensor; //Gyro-Sensor数据 s_NV_GPS_ExternInfo stExternInfo; //扩展信息 char szTime[24]; //时间(如:2010-10-10 10:10:10) }s_NV_GPS_All; s_NV_GPS_FILEHEAD first; s_NV_GPS_All second; CString The_id = str_id; CString The_start = str_start; CString The_end = str_end; CString The_jump = str_jump; double jing,wei; //保存上次的经纬度,以删除重合的点 int the_last = 0; //判断第一次的经纬度 string the_to_all; CString now_time; /*number是为了判断传过来的间隔时间的问题*/ int number = 1; char *to_all = (char *)malloc(524287*sizeof(char)*3); memset(to_all,0,sizeof(to_all)); /*首先判断起始时间和结束时间,如果起始时间大于结束时间,返回4*/ if(The_start.Compare(The_end) >= 0) { // to_all = "4"; sprintf(to_all, "%d,", 4); return to_all; } int offset = 0; char *p_The_jump = (LPSTR)(LPCTSTR)The_jump; /*将间隔时间转化为整形int*/ int The_jump_time = _ttoi(The_jump); /*起始的年月日 -9去掉00:00:00*/ CString The_start_time ; The_start_time = The_start.Left(The_start.GetLength() - 9); /*结束的年月日 -9去掉00:00:00*/ CString The_end_time ; The_end_time = The_end.Left(The_end.GetLength() - 9); // CString to_search("e://GPSTrack//2013-05-14//72958//2013-05-14.gpx"); CString to_search("e://GPSTrack//"); CString first_day = The_start_time; int day_num = 1; int test2 = 0; /*首先判断起始时间和终止时间是否为同一天,如果不是的话就读取多个文件*/ while(first_day.Compare(The_end_time) != 0) { //WriteLog(File, Line,"首先判断起始时间和终止时间是否为同一天,如果不是的话就读取多个文件"); CString to_search("e://GPSTrack//"); to_search += first_day; to_search += "//"; to_search += The_id; to_search += "//"; to_search += first_day; to_search += ".gpx"; char *p_to_search = (LPSTR)(LPCTSTR)to_search; //WriteLog(File, Line,(LPSTR)(LPCTSTR)to_search); FILE* file1; /*检测传过来的车牌和文件中读取的车牌是否一致*/ CString check_id; file1 = fopen(p_to_search,"rb+"); if(file1 == NULL) { /*时间加 1 再比较*/ //CString first_day = "2010-09-30 10:22:01"; int nYear1, nMonth1, nDate1, nHour1 =0, nMin1=0, nSec1=0; sscanf(first_day,"%d-%d-%d",&nYear1,&nMonth1,&nDate1,&nHour1,&nMin1,&nSec1); CTime t2(nYear1, nMonth1, nDate1, nHour1, nMin1, nSec1); CTimeSpan ts2(1,0,0,0);//一天 t2+= ts2;//t1 = 2007-9-1 first_day = t2.Format("%Y-%m-%d"); //WriteLog(File, Line,"..时间加 1 再比较"); continue; } fread(&first,sizeof(first),1,file1); check_id = first.szDeviceID; if(check_id.Compare(The_id)) { /*如果读到的车牌号和传过来的参数不一致,返回1*/ //to_all = "1"; sprintf(to_all, "%d,", 1); return to_all; } if(day_num == 1) { /*读一回,只有起始时间的限制而没有结束时间*/ //WriteLog(File, Line,"读一回,只有起始时间的限制而没有结束时间"); double jing,wei; while(1) { int ret = fread(&second,sizeof(second),1,file1); if(ret == 0) { break; } now_time = second.szTime; if(the_last == 0) { if(The_start.CompareNoCase(now_time) <= 0) { offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLongitude); offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLatitude); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fDirect); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fSpeed); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.sHigh); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.cSatelliteNumber); offset += sprintf(to_all + offset, "%s;", second.szTime); if(offset > 524287*3 -100) { return to_all; } jing = second.stBaseInfo.dbLongitude; wei = second.stBaseInfo.dbLatitude; the_last++; } else { continue; } } if(The_start.CompareNoCase(now_time) <= 0 && second.stExternInfo.cSatelliteNumber > 3 && (jing != second.stBaseInfo.dbLongitude) && (wei != second.stBaseInfo.dbLatitude)) { if(number == The_jump_time) { offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLongitude); offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLatitude); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fDirect); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fSpeed); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.sHigh); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.cSatelliteNumber); offset += sprintf(to_all + offset, "%s;", second.szTime); if(offset > 524287*3 -100) { return to_all; } number = 0; } number++; test2++; } jing = second.stBaseInfo.dbLongitude; wei = second.stBaseInfo.dbLatitude; fflush(NULL); } } else { //WriteLog(File, Line,"中间天数"); while(1) { int ret = fread(&second,sizeof(second),1,file1); if(ret == 0) { break; } now_time = second.szTime; if(second.stExternInfo.cSatelliteNumber > 3 && (jing != second.stBaseInfo.dbLongitude) && (wei != second.stBaseInfo.dbLatitude)) { if(number == The_jump_time) { offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLongitude); offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLatitude); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fDirect); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fSpeed); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.sHigh); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.cSatelliteNumber); offset += sprintf(to_all + offset, "%s;", second.szTime); if(offset > 524287*3 -100) { return to_all; } number = 0; } number++; test2++; } jing = second.stBaseInfo.dbLongitude; wei = second.stBaseInfo.dbLatitude; fflush(NULL); } } /*时间加 1 再比较*/ int nYear1, nMonth1, nDate1, nHour1 = 0, nMin1 = 0, nSec1 = 0; sscanf(first_day, "%d-%d-%d", &nYear1, &nMonth1, &nDate1, &nHour1, &nMin1, &nSec1); CTime t2(nYear1, nMonth1, nDate1, nHour1, nMin1, nSec1); CTimeSpan ts2(1,0,0,0);//一天 t2+= ts2;//t1 = 2007-9-1 first_day = t2.Format("%Y-%m-%d"); day_num++; fclose(file1); } //WriteLog(File, Line,"首先判断是第一次读还是已经读了几天的,如果是后者,则此次只有结束时间的限制"); /*首先判断是第一次读还是已经读了几天的,如果是后者,则此次只有结束时间的限制*/ if(day_num == 1) //则是前者 { /*直接复制下面的代码*/ //WriteLog(File, Line,"只有一天"); CString to_search("e://GPSTrack//"); to_search += first_day; to_search += "//"; to_search += The_id; to_search += "//"; to_search += first_day; to_search += ".gpx"; char *p_to_search = (LPSTR)(LPCTSTR)to_search; FILE* file1; /*检测传过来的车牌和文件中读取的车牌是否一致*/ CString check_id; file1 = fopen(p_to_search,"rb+"); if(file1 == NULL) { /*文件存在但打不开,返回3*/ // to_all = "3"; sprintf(to_all, "%d,", 3); return to_all; } fread(&first,sizeof(first),1,file1); check_id = first.szDeviceID; if(check_id.Compare(The_id)) { /*如果读到的车牌号和传过来的参数不一致,返回1*/ to_all = "1"; return to_all; } while(1) { int ret = fread(&second,sizeof(second),1,file1); if(ret == 0) { fclose(file1); break; } now_time = second.szTime; if(The_end.CompareNoCase(now_time) < 0) { break; } if(the_last == 0) { if(The_start.CompareNoCase(now_time) <= 0&&(second.stBaseInfo.dbLongitude)>0 &&(second.stBaseInfo.dbLatitude)>0&&second.stExternInfo.cSatelliteNumber > 3) { offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLongitude); offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLatitude); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fDirect); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fSpeed); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.sHigh); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.cSatelliteNumber); offset += sprintf(to_all + offset, "%s;", second.szTime); if(offset > 524287*3 -100) { return to_all; } jing = second.stBaseInfo.dbLongitude; wei = second.stBaseInfo.dbLatitude; the_last++; } else { continue; } } if(The_start.CompareNoCase(now_time) <= 0 && The_end.CompareNoCase(now_time) >= 0 && second.stExternInfo.cSatelliteNumber > 3 && (jing != second.stBaseInfo.dbLongitude) && (wei != second.stBaseInfo.dbLatitude)) { if(number == The_jump_time) { offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLongitude); offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLatitude); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fDirect); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fSpeed); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.sHigh); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.cSatelliteNumber); offset += sprintf(to_all + offset, "%s;", second.szTime); printf("5#########%s#######\n",first.szDeviceID); if(offset > 524287*3 -100) { return to_all; } number = 0; } number++; } jing = second.stBaseInfo.dbLongitude; wei = second.stBaseInfo.dbLatitude; fflush(NULL); } } else { //WriteLog(File, Line,"最后一天"); CString to_search("e://GPSTrack//"); to_search += first_day; to_search += "//"; to_search += The_id; to_search += "//"; to_search += first_day; to_search += ".gpx"; char *p_to_search = (LPSTR)(LPCTSTR)to_search; FILE* file1; /*检测传过来的车牌和文件中读取的车牌是否一致*/ CString check_id; /*如果前面几天的数据不存在,最后一天再打不开的话就返回错误码 11*/ file1 = fopen(p_to_search,"rb+"); if(file1 == NULL && test2 == 0) { /*文件存在但打不开,返回3*/ to_all = "11"; return to_all; } if(file1 == NULL) { return to_all; } fread(&first,sizeof(first),1,file1); check_id = first.szDeviceID; if(check_id.Compare(The_id)) { /*如果读到的车牌号和传过来的参数不一致,返回1*/ to_all = "1"; return to_all; } number = 0; while(1) { int ret = fread(&second,sizeof(second),1,file1); if(ret == 0) { fclose(file1); break; } now_time = second.szTime; if(The_end.CompareNoCase(now_time) < 0) { break; } if(The_end.CompareNoCase(now_time) >= 0 && second.stExternInfo.cSatelliteNumber > 3 && (jing != second.stBaseInfo.dbLongitude) && (wei != second.stBaseInfo.dbLatitude)) { if(number == The_jump_time) { offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLongitude); offset += sprintf(to_all + offset, "%lf,", second.stBaseInfo.dbLatitude); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fDirect); offset += sprintf(to_all + offset, "%f,", second.stBaseInfo.fSpeed); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.sHigh); offset += sprintf(to_all + offset, "%d,", second.stExternInfo.cSatelliteNumber); offset += sprintf(to_all + offset, "%s;", second.szTime); printf("6#########%s#######\n",first.szDeviceID); if(offset > 524287*3 -100) { return to_all; } number = 0; } number++; } jing = second.stBaseInfo.dbLongitude; wei = second.stBaseInfo.dbLatitude; fflush(NULL); } } return to_all; }
char*GPSinfo2 = selectGPSInfo("80002", "2014-05-23 00:00:00", "2014-05-23 05:00:00", "100"); /************************************************************************/ /* 插入晚上的数据 */ /************************************************************************/ CString cstr1=GPSinfo_Night.c_str(); CStringArray GPSALL_N; SplitString(cstr1,";",GPSALL_N,TRUE); if (GPSALL_N.GetSize()==1) { continue; } CStringArray GPSALL_D; CString cstr=GPSinfo_Day.c_str(); SplitString(cstr,";",GPSALL_D,TRUE); printf("数组的长度%d\n",GPSALL_D.GetSize()); if (GPSALL_D.GetSize()==1) { printf("错错错"); continue; } for(int i=0;i<GPSALL_N.GetSize()-1;++i){ CStringArray GPSInfo_N; SplitString(GPSALL_N[i],",",GPSInfo_N,TRUE); gps.setLongitude(GPSInfo_N[0].GetBuffer(0)); gps.setLatitude(GPSInfo_N[1].GetBuffer(0)); gps.setDirect(GPSInfo_N[2].GetBuffer(0)); gps.setSpeed(GPSInfo_N[3].GetBuffer(0)); gps.setHigh(GPSInfo_N[4].GetBuffer(0)); gps.setSatelliteNum(GPSInfo_N[5].GetBuffer(0)); gps.setTime(GPSInfo_N[6].GetBuffer(0)); gpslist_Night.push_back(gps); } list<GPS>::iterator it=gpslist_Night.begin(); printf("数组的长度%d\n",GPSALL_N.GetSize()); printf("链表的长度%d\n",gpslist_Night.size()); double StartPosLa1 =atof((gpslist_Night.front().getLatitude().c_str())); double StartPosLo1 =atof((gpslist_Night.front().getLongitude().c_str())); printf("设备号是%s \n",s.GetBuffer(0)); printf("经纬度起始:%lf %lf \n",StartPosLo1,StartPosLa1); for(it;it!=gpslist_Night.end();++it){ double EndPosLa1=atof((*it).getLatitude().c_str()); double EndPosLo1=atof((*it).getLongitude().c_str()); double speed1=atof((*it).getSpeed().c_str()); //计算距离 CarDistance_N=GetDistance(StartPosLa1, StartPosLo1, EndPosLa1, EndPosLo1); sum_N += CarDistance_N; if(speed1>(double)MINSPEED && speed1<(double)MAXSPEED) { ValidDistance_N = GetDistance(StartPosLa1, StartPosLo1, EndPosLa1, EndPosLo1); }else{ ValidDistance_N = 0; } ValidSum_N += ValidDistance_N; StartPosLa1 = EndPosLa1; StartPosLo1 = EndPosLo1; printf("晚上每一段的距离%f,总距离%f\n",CarDistance_N,sum_N); }
=================================================================================================================
程序猿和程序媛必备的咖啡-OneDay咖啡生活-https://shop110384469.taobao.com/
相关文章推荐
- MySQL根据时间按年月日分组统计数据
- JQuery EasyUI 根据数据动态生成datagrid,统计常用
- mysql语句 一个表统计每天产生的不同类型数据 根据类型字段 统计每天有多少
- 根据自己的博客数据统计国内IT人群
- mysql关于根据日期统计月份整合数据的相关语句
- 根据数据自动生成的条型统计图表
- mysql如何根据日期统计数据
- 求思路:递归查询后,数据根据父节点分组统计!!!
- Canvas根据数据绘制饼形统计图
- 通过Python根据汉语水平词汇与汉字等级大纲进行数据统计
- 根据GPS数据获得国家名、城市名
- mysql count()根据表达式统计数据
- Excel如何直接根据数据画出统计图
- thinkphp 查询数据库数据根据两个字段group,且统计条数用法
- 根据访客日志统计访客数据
- Aspose.Cells 根据Excel模板导出数据统计
- JQuery EasyUI 根据数据动态生成datagrid,统计常用
- easyUI数据统计列表中根据单元格数值控制显示效果
- oracle根据时间对数据进行统计每天生成的量
- 根据表中的时间戳字段统计每天数据的数量