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

2023-01-04 14:25:55 浏览数 (2)

代码语言:javascript复制
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;

代码语言:javascript复制
	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 人点赞