简单GPS数据处理(gps数据分析)

int ParseGPSData(char *szGPSData, TGPSPosition *pGPSPosition)
{
	// NMEA 0183格式:$GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E
	char *pBegin;
	char *pTemp;
	char *pTime;
	char szTime[3];
	char *pbAvail;
	char *pLatitude;
	char *pBearing;
	char *pbEasting;
	char *pDate;
	char *pSpeed;
	char szDate[3];
	char *pLongitude;
	char *pbNorthing;
	int Y;
	int X;
	TGPSPosition *pGPSPosition;
	memset(pGPSPosition, 0, sizeof(TGPSPosition));

	pBegin = strstr(szGPSData, "$");
	if (pBegin == NULL)
	{
		return -1;
	}
	pTemp = strstr(pBegin+3, "RMC");
	if (pTemp != (pBegin+3))
	{
		return -1;
	}

	//时间
	pBegin = strchr(pBegin, ',');
	if (pBegin == NULL)
	{
		return -2;
	}
	pTime = pBegin + 1;
	memset(szTime, 0, sizeof(szTime));
	szTime[0] = pTime[0];
	szTime[1] = pTime[1];
	pGPSPosition->wFixHour = atoi(szTime);
	memset(szTime, 0, sizeof(szTime));
	szTime[0] = pTime[2];
	szTime[1] = pTime[3];
	pGPSPosition->wFixMinute = atoi(szTime);
	memset(szTime, 0, sizeof(szTime));
	szTime[0] = pTime[4];
	szTime[1] = pTime[5];
	pGPSPosition->wFixSecond = atoi(szTime);

	//是否否有效的GPS
	pBegin = strchr(pTime, ',');
	if (pBegin == NULL)
	{
		return -2;
	}
	pbAvail = pBegin+1;
	if (*pbAvail != 'A') 
	{
		return -3;
	}

	//纬度
	pBegin = strchr(pbAvail, ',');
	if (pBegin == NULL)
	{
		return -5;
	}
	pLatitude = pBegin + 1;
	pGPSPosition->dbLatitude = atof(pLatitude)/100;
	Y = (int)pGPSPosition->dbLatitude; 
	pGPSPosition->dbLatitude = pGPSPosition->dbLatitude - Y;
	pGPSPosition->dbLatitude = pGPSPosition->dbLatitude*100/60 + Y;
	/*
	if (thePrefile.m_dbMaxY < pGPSPosition->dbLatitude 
		|| thePrefile.m_dbMinY > pGPSPosition->dbLatitude)
	{
		return - 5;
	}
	*/

	//是否北半球
	pBegin = strchr(pLatitude, ',');
	if (pBegin == NULL)
	{
		return -2;
	}
	pbNorthing = pBegin+1;
	if (*pbNorthing == 'N') 
	{
		pGPSPosition->bNorthing = XOS_TRUE;
	}
	else if (*pbNorthing == 'S') 
	{
		pGPSPosition->bNorthing = XOS_FALSE;
	}
	else
	{
		return -4;
	}

	//经度
	pBegin = strchr(pbNorthing, ',');
	if (pBegin == NULL)
	{
		return -5;
	}
	pLongitude = pBegin + 1;
	pGPSPosition->dbLongitude = atof(pLongitude)/100;
	X = (int)pGPSPosition->dbLongitude; 
	pGPSPosition->dbLongitude = pGPSPosition->dbLongitude - X;
	pGPSPosition->dbLongitude = pGPSPosition->dbLongitude*100/60 + X;
	/*
	if (thePrefile.m_dbMaxX < pGPSPosition->dbLongitude 
		|| thePrefile.m_dbMinX > pGPSPosition->dbLongitude)
	{
		return - 5;
	}
	*/

	//是否东半球
	pBegin = strchr(pLongitude, ',');
	if (pBegin == NULL)
	{
		return -6;
	}
	pbEasting = pBegin+1;
	if (*pbEasting == 'E') 
	{
		pGPSPosition->bEasting = XOS_TRUE;
	}
	else if (*pbEasting == 'W') 
	{
		pGPSPosition->bEasting = XOS_FALSE;
	}
	else
	{
		return -7;
	}

	//速度
	pBegin = strchr(pbEasting, ',');
	if (pBegin == NULL)
	{
		return -8;
	}
	pSpeed = pBegin + 1;
	pGPSPosition->dbSpeed = atof(pSpeed)*1.852;
	if (pGPSPosition->dbSpeed > 150)
	{
		return -9;
	}

	//方向
	pBegin = strchr(pSpeed, ',');
	if (pBegin == NULL)
	{
		return -10;
	}
	pBearing = pBegin + 1;
	pGPSPosition->dbBearing = atof(pBearing);

	//日期
	pBegin = strchr(pBearing, ',');
	if (pBegin == NULL)
	{
		return -11;
	}
	pDate = pBegin + 1;
	memset(szDate, 0, sizeof(szDate));
	szDate[0] = pDate[0];
	szDate[1] = pDate[1];
	pGPSPosition->wFixDay = atoi(szDate);
	memset(szDate, 0, sizeof(szDate));
	szDate[0] = pDate[2];
	szDate[1] = pDate[3];
	pGPSPosition->wFixMonth = atoi(szTime);
	memset(szDate, 0, sizeof(szDate));
	szDate[0] = pDate[4];
	szDate[1] = pDate[5];
	pGPSPosition->wFixYear = atoi(szDate);

	if ((pGPSPosition->dbLatitude == 0) && (pGPSPosition->dbLongitude == 0))
	{
		return -12;
	}

	return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不被定义的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值