⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpsdrawmap.cpp

📁 用VC写的监控中心后台程序。 代码全
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	DataLibStart = GetColorBList(&m_cCurrMapInfo.lCurrColorBList,DataLibStart);

	m_cCurrMapInfo.ClearRoadList(m_cCurrMapInfo.lCurrRoadList);
	DataLibStart = GetRoadPlainPoint(&m_cCurrMapInfo.lCurrRoadList,DataLibStart);

	m_cCurrMapInfo.ClearCrossList();
	GetRoadCrossPoint(&m_cCurrMapInfo.lCurrCrossList,DataLibStart);

	return true;
}

long CGpsDrawMap::GetColorBList(CObList *ColorBList,long StartAddr)
{
	CGpsColorBlock	*pBlock;
	CGpsColorBlock	cBlock;
	CGpsPoint		*pPoint;
	short			i,j;

	StartAddr += ColorBTotalBytes;
	cBlock.m_ColorBlockTotal = GetTwoBNum(FileContent,StartAddr);

	StartAddr += cBlock.m_ColorBlock_Bytes;
	for(i = 0; i < cBlock.m_ColorBlockTotal; i++) {
		pBlock = new CGpsColorBlock;
		ColorBList->AddHead(pBlock);
		pBlock->m_ColorBlockTotal = cBlock.m_ColorBlockTotal;

		pBlock->m_ColorValue = GetTwoBNum(FileContent,StartAddr);
		StartAddr += cBlock.m_ColorValue_Bytes;

		pBlock->m_ColorBlock_PointTotal = GetTwoBNum(FileContent,StartAddr);
		StartAddr += cBlock.m_ColorBlock_PointTotal_Bytes;

		for(j = 0; j < pBlock->m_ColorBlock_PointTotal; j++) {
			pPoint = new CGpsPoint;
			pBlock->ColorBlockPointList.AddHead(pPoint);
			GetPointNE(FileContent,&StartAddr,&pPoint->m_dgx,&pPoint->m_dgy);
			CovertNEXY(pPoint, m_cCurrMapInfo.CoeffNE_XY, true);
		}
	}

	return StartAddr;
}

long CGpsDrawMap::GetRoadPlainPoint(CObList *RoadList,long BufPos)
{
	CSmallRoadStruct	*pSmallRoad;
	CGpsRoadStruct		*pRoad;
	CRoadPoint			*pRoadPoint;
	long				RoadTotal,i,j,k;
	BYTE				DispLevel;
	
	RoadTotal	= GetFourBNum(FileContent,BufPos);
	BufPos += LibTotalBytes;

	for(i = 0; i < RoadTotal; i++) {
		pRoad = new CGpsRoadStruct;
		RoadList->AddHead(pRoad);

		pRoad->BigRoad_Serial = GetOneBNum(FileContent,BufPos);
		BufPos += pRoad->BigRoad_SN_Bytes;
		pRoad->m_BigRoad_Number = GetTwoBNum(FileContent,BufPos);
		BufPos += pRoad->m_byBigRoad_Number_Bytes;

		pRoad->SmallRoadTotal = GetOneBNum(FileContent,BufPos);
		BufPos += pRoad->SmallRoadTotal_Bytes;
		pRoad->m_byIsHelpRoad = GetOneBNum(FileContent,BufPos);
		BufPos += pRoad->m_byHelpRoad_Bytes;

		for(j = 0; j < pRoad->SmallRoadTotal; j++) {
			pSmallRoad = new CSmallRoadStruct;
			pRoad->SmallRoadList.AddHead(pSmallRoad);

			GetLenArray(pSmallRoad->SmallRoad_SerialNumber,pSmallRoad->SmallRoad_SN_Bytes,FileContent,BufPos);
			BufPos += pSmallRoad->SmallRoad_SN_Bytes;
			GetLenArray((BYTE*)pSmallRoad->RoadName,pSmallRoad->RoadName_Bytes,FileContent,BufPos);
			BufPos += pSmallRoad->RoadName_Bytes;
			pSmallRoad->Road_SD = GetOneBNum(FileContent,BufPos);
			BufPos += pSmallRoad->Road_SD_Bytes;
			DispLevel = GetOneBNum(FileContent,BufPos);
			pSmallRoad->RoadorName_DispLevel = GetOneBNum(FileContent,BufPos);
			BufPos += pSmallRoad->DispLevel_Bytes;
			pSmallRoad->SmallRoad_PointTotal = GetTwoBNum(FileContent,BufPos);
			BufPos += pSmallRoad->PointTotal_Bytes;

			for(k = 0; k < pSmallRoad->SmallRoad_PointTotal; k++) {
				pRoadPoint = new CRoadPoint;
				pSmallRoad->RoadPointList.AddHead(pRoadPoint);

				GetLenArray(pRoadPoint->BigRoad_SerialNumber,pRoadPoint->BigRoad_SN_Bytes,FileContent,BufPos);
				BufPos += pRoadPoint->BigRoad_SN_Bytes;
				GetPointNE(FileContent,&BufPos,&pRoadPoint->m_dgx,&pRoadPoint->m_dgy);
				pRoadPoint->OutOfMap = GetOneBNum(FileContent,BufPos);
				BufPos += pRoadPoint->OutOfMap_Bytes;
				BufPos += pRoadPoint->OutOfMap_Bytes;

				CovertNEXY(pRoadPoint, m_cCurrMapInfo.CoeffNE_XY, true);
			}
		}
	}

	return BufPos;
}

long CGpsDrawMap::GetRoadCrossPoint(CObList *CrossList,long BufPos)
{
	CGpsRoadCrossPoint	*pCross;
	long				CrossTotal,i;

	CrossTotal	= GetFourBNum(FileContent,BufPos);
	BufPos += LibTotalBytes;

	for(i = 0; i < CrossTotal; i++) {
		pCross = new CGpsRoadCrossPoint;
		CrossList->AddHead(pCross);

		GetPointNE(FileContent,&BufPos,&pCross->m_dgx,&pCross->m_dgy);

		pCross->m_CrossRoad1_Serial = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad1_Serial_Bytes;
		pCross->m_CrossRoad1_Number = GetTwoBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad1_Number_Bytes;
		pCross->m_CrossRoad1_Level  = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad1_Level_Bytes;

		pCross->m_CrossRoad2_Serial = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad2_Serial_Bytes;
		pCross->m_CrossRoad2_Number = GetTwoBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad2_Number_Bytes;
		pCross->m_CrossRoad2_Level  = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad2_Level_Bytes;

		pCross->m_CrossRoad3_Serial = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad3_Serial_Bytes;
		pCross->m_CrossRoad3_Number = GetTwoBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad3_Number_Bytes;
		pCross->m_CrossRoad3_Level  = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad3_Level_Bytes;

		pCross->m_CrossRoad4_Serial = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad4_Serial_Bytes;
		pCross->m_CrossRoad4_Number = GetTwoBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad4_Number_Bytes;
		pCross->m_CrossRoad4_Level  = GetOneBNum(FileContent,BufPos);
		BufPos += pCross->m_CrossRoad4_Level_Bytes;

		CovertNEXY(pCross, m_cCurrMapInfo.CoeffNE_XY, true);
	}

	return BufPos;
}

//Get Sign Lib...
long CGpsDrawMap::GetSignLibAddr(char *SignLibName)
{
	long		InfoAddr,SignStartAddr,SignEndAddr,i,RetAddr = -1;
	char		SignFileName[GpsLibFileLen + 1];

	InfoAddr = m_cFatStruct.m_lSignLibAddr;
	for(i = 0; i < m_cFatStruct.m_lSignLibTotal; i++) {
		ClearBYTEArr(SignFileName,GpsLibFileLen + 1);
		GetLibInfo(FileContent,InfoAddr,SignFileName,&SignStartAddr,&SignEndAddr);
		InfoAddr += LibInfoBytes;						//链接库在FAT表中占用的字节数
		if(CompareTwoArr(SignFileName,SignLibName) == 1) {
			RetAddr = SignStartAddr;
			break;
		}
	}

	return RetAddr;
}

bool CGpsDrawMap::GetSignLib(char *SignLibName,CObList *SignList,bool Del)
{
	long		SignLibStart;
	
	SignLibStart = GetSignLibAddr(SignLibName);
	if(SignLibStart == -1)	return false;

	if(!GetSignList(SignList,SignLibStart,Del))	return false;

	return true;
}

BYTE CGpsDrawMap::GetSignList(CObList *SignList,long StartAddr,bool Del)
{
	BYTE		Ret = 0;
	long		Total;
	char		CurrPath[500];
	CString		Path;

	ClearBYTEArr(CurrPath,500);
	::GetCurrentDirectory(500,CurrPath);
	Path = CurrPath;

	//Get Building
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,1,false,Del,Path + BuildingIconName))	Ret++;

	//Get Hotel
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,2,false,Del,Path + HotelIconName))	Ret++;

	//Get Company
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfCompany_Bytes,3,true,Del,Path + CompanyIconName))	Ret++;

	//Get Amusement
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,4,false,Del,Path + AmusementIconName))	Ret++;

	//Get PlaceName
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,5,false,Del,Path + PlaceNameIconName))	Ret++;

	//跳过道路名层
	Total = GetFourBNum(FileContent,StartAddr);
	StartAddr += (LibTotalBytes + Total * SignRoadNameObjectBytes);

	//Get Government
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,7,false,Del,Path + GovernmentIconName))	Ret++;

	//Get Traffic
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,8,false,Del,Path + TrafficIconName))	Ret++;

	//Get Shopping
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,9,false,Del,Path + ShoppingIconName))	Ret++;

	//Get Education
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,10,false,Del,Path + EducationIconName))	Ret++;

	//Get AfterService
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfAfterService_Bytes,11,false,Del))	Ret++;

	//Get Hospital
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOthers_Bytes,12,false,Del,Path + HospitalIconName))	Ret++;

	//Get Project
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfProject_Bytes,13,false,Del,Path + ProjectIconName))	Ret++;

	//Get Oil
	if(GetSignObjectList(SignList,StartAddr,SignObjectOfOil_Bytes,14,false,Del,Path + OilIconName))		Ret++;

	return Ret;
}

bool CGpsDrawMap::GetSignObjectList(CObList *SignList,long &StartAddr,BYTE SignObject_Bytes,
									BYTE SignType,bool IsCompany,bool Del,CString IconName)
{
	CGpsSignObject		*pSign;
	long				SignTotal,i;
	bool				Flag = false;

	SignTotal = GetFourBNum(FileContent,StartAddr);
	StartAddr += LibTotalBytes;
	for(i = 0; i < SignTotal; i++) {
		pSign = new CGpsSignObject(SignObject_Bytes);
		if(SignObject_Bytes > SignObjectOfOil_Bytes) {
			GetLenArray((BYTE*)pSign->m_pSignObjectName,SignObject_Bytes,FileContent,StartAddr);
			StartAddr += SignObject_Bytes;

			GetPointNE(FileContent,&StartAddr,&pSign->m_dgx,&pSign->m_dgy);

			pSign->m_arrSignObject_Serial1 = GetOneBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Serial1_Bytes;
			pSign->m_arrSignObject_Number1 = GetTwoBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Number1_Bytes;
			pSign->m_arrSignObject_Serial2 = GetOneBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Serial2_Bytes;
			pSign->m_arrSignObject_Number2 = GetTwoBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Number2_Bytes;

			GetLenArray((BYTE*)pSign->m_arrSignObjectDispLevel,pSign->m_bySignDispLevel_Bytes,FileContent,StartAddr);
			StartAddr += pSign->m_bySignDispLevel_Bytes;

			if(IsCompany) {
				GetLenArray((BYTE*)pSign->m_arrSignAdvertise,pSign->m_bySignAdvertise_Bytes,FileContent,StartAddr);
				StartAddr += pSign->m_bySignAdvertise_Bytes;
			}
		}
		else {
			pSign->m_dgy	= GetFourBNum(FileContent,StartAddr);
			StartAddr += pSign->m_gyBytes;

			pSign->m_dgx	= GetFourBNum(FileContent,StartAddr);
			StartAddr += pSign->m_gxBytes;

			pSign->m_arrSignObject_Serial1 = GetOneBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Serial1_Bytes;
			pSign->m_arrSignObject_Number1 = GetTwoBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Number1_Bytes;
			pSign->m_arrSignObject_Serial2 = GetOneBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Serial2_Bytes;
			pSign->m_arrSignObject_Number2 = GetTwoBNum(FileContent,StartAddr);
			StartAddr += pSign->m_bySignObject_Number2_Bytes;
		}
		pSign->m_sIconName	= IconName;
		pSign->m_bySignType	= SignType;

		CovertNEXY(pSign, m_cCurrMapInfo.CoeffNE_XY, true);

		if(Del) {
			//只显示当前图标志物
			if((pSign->m_lx > m_cCurrMapInfo.m_lWnd_Max_X) || (pSign->m_lx < 0) ||
			   (pSign->m_ly > m_cCurrMapInfo.m_lWnd_Max_Y) || (pSign->m_ly < 0)) {
				delete pSign;
				continue;
			}
		}

		SignList->AddHead(pSign);
	}
	if(SignList->GetCount())	Flag = true;

	return Flag;
}

bool CGpsDrawMap::CalcNE2XY(double gx,double gy,long &x,long &y)
{
	if(!IsValidNE(gx,gy))	return false;

	CGpsPoint	cPoint;

	cPoint.m_dgx	= gx;
	cPoint.m_dgy	= gy;

	CovertNEXY(&cPoint, m_cCurrMapInfo.CoeffNE_XY, true);

	x	= cPoint.m_lx;
	y	= cPoint.m_ly;

	return true;
}

/*************Get Library Infomation*************/
void CGpsDrawMap::GetLibInfo(BYTE *Buf,long InfoAddr,char *FileName,long *StartAddr,long *EndAddr)
{
	for(long i = 0; i < GpsLibFileLen; i++){
		FileName[i] = Buf[InfoAddr + i];
	}

	InfoAddr  += GpsLibFileLen;
	*StartAddr = GetFourBNum(Buf,InfoAddr);
	InfoAddr  += LibAddrBytes;
	*EndAddr   = GetFourBNum(Buf,InfoAddr);
}

/*************Calculate NE*************/
double CGpsDrawMap::CovertNE(long lTemp)
{
	double Ret,dTemp;
	dTemp = lTemp % 360000;
	Ret  = (lTemp / 360000) * 100 + dTemp / 6000;

	return Ret;
}

long CGpsDrawMap::CovertToLongNE(double dTemp)
{
	long	lTmp;
	lTmp = (long)( dTemp / 100);
	lTmp = (long)((lTmp  * 3600 + (dTemp - lTmp * 100) * 60) * 100);

	return lTmp;
}

void CGpsDrawMap::GetLinkLibThreePoint(BYTE * BUF,long StartAddr,ChangeTriangle * ThreePoint)
{
	long	BufPos;
	long	ltmp;

	BufPos = StartAddr;
	ltmp = GetFourBNum(BUF,BufPos);
	ThreePoint->y1 = CovertNE(ltmp);

	BufPos += LibAddrBytes;
	ltmp = GetFourBNum(BUF,BufPos);
	ThreePoint->x1 = CovertNE(ltmp);

	BufPos += LibAddrBytes;
	ltmp = GetFourBNum(BUF,BufPos);
	ThreePoint->y2 = CovertNE(ltmp);

	BufPos += LibAddrBytes;
	ltmp = GetFourBNum(BUF,BufPos);
	ThreePoint->x2 = CovertNE(ltmp);

	BufPos += LibAddrBytes;
	ltmp = GetFourBNum(BUF,BufPos);
	ThreePoint->y3 = CovertNE(ltmp);

	BufPos += LibAddrBytes;
	ltmp = GetFourBNum(BUF,BufPos);
	ThreePoint->x3 = CovertNE(ltmp);

#if 0
	long	iTemp;
	iTemp = (long)(ThreePoint->x1 / 100);
	ThreePoint->x1 = ThreePoint->x1 - iTemp * 40;
	iTemp = (long)(ThreePoint->x2 / 100);
	ThreePoint->x2 = ThreePoint->x2 - iTemp * 40;
	iTemp = (long)(ThreePoint->x3 / 100);
	ThreePoint->x3 = ThreePoint->x3 - iTemp * 40;
	iTemp = (long)(ThreePoint->y1 / 100);
	ThreePoint->y1 = ThreePoint->y1 - iTemp * 40;
	iTemp = (long)(ThreePoint->y2 / 100);
	ThreePoint->y2 = ThreePoint->y2 - iTemp * 40;
	iTemp = (long)(ThreePoint->y3 / 100);
	ThreePoint->y3 = ThreePoint->y3 - iTemp * 40;
#endif
}

long CGpsDrawMap::GetLinkList(CObList *pLinkList,BYTE MapLevel)
{
	long				InfoAddr,LinkStartAddr,LinkEndAddr,i,Count = 0;
	char				FirstChar;
	CGpsLinkStruct		cGpsLink,*pLink;
	ChangeTriangle		TmpTri;

	FirstChar = MapLevel + ('A' - 1);

	InfoAddr = m_cFatStruct.m_lLinkLibAddr;
	for(i = 0; i < m_cFatStruct.m_lLinkLibTotal; i++) {
		ClearBYTEArr(cGpsLink.m_LinkLibName,9);
		GetLibInfo(FileContent,InfoAddr,cGpsLink.m_LinkLibName,&LinkStartAddr,&LinkEndAddr);

		InfoAddr += LibInfoBytes;										//链接库在FAT表中占用的字节数
		if(FirstChar != cGpsLink.m_LinkLibName[0]) {
			continue;
		}
		LinkStartAddr += 68;											//将链接库指针移动到三个经纬度坐标
		GetLinkLibThreePoint(FileContent,LinkStartAddr,&TmpTri);

		LinkStartAddr += 24;
		ClearBYTEArr(cGpsLink.m_RelatedSignLibName,9);
		GetLenArray((BYTE*)cGpsLink.m_RelatedSignLibName,GpsLibFileLen,FileContent,LinkStartAddr);	//获得综合标志库名称

		pLink  = new CGpsLinkStruct;
		*pLink = cGpsLink;
		pLink->m_MapTri	= TmpTri;

		pLinkList->AddHead(pLink);
		Count++;
	}

	return Count;
}

void CGpsDrawMap::GetAreaLibList(CObList *AreaList)
{
	CGpsAreaLibStruct	*pArea = NULL;
	long				j,Total,StartAddr,EndAddr;
	char				FileName[8],i;

	if(!m_cFatStruct.m_lRegionLibTotal)	return ;
	GetLibInfo(FileContent,m_cFatStruct.m_lRegionLibAddr,FileName,&StartAddr,&EndAddr);

	for(i = 1; i <= AreaLibLevelTotal; i++) {
		Total = GetFourBNum(FileContent,StartAddr);
		StartAddr += LibTotalBytes;
		for(j = 0; j < Total; j++) {
			pArea = new CGpsAreaLibStruct;
			AreaList->AddHead(pArea);
			pArea->m_byAreaLevel = i;
			GetLenArray((BYTE*)pArea->m_arrAreaABCD,pArea->m_byAreaABCD_Bytes,FileContent,StartAddr);
			StartAddr += pArea->m_byAreaABCD_Bytes;
			GetLenArray((BYTE*)pArea->m_arrAreaName,pArea->m_byAreaName_Bytes,FileContent,StartAddr);
			StartAddr += pArea->m_byAreaName_Bytes;

			if(i == AreaLibLevelTotal) {
				GetLenArray((BYTE*)pArea->m_arrRelateSignLibName,pArea->m_byRelateSignLibName_Bytes,FileContent,StartAddr);
				StartAddr += pArea->m_byRelateSignLibName_Bytes;
			}
		}
	}
}

bool CGpsDrawMap::CompareTri(ChangeTriangle TmpTri1,ChangeTriangle TmpTri2)
{
	double	dx1,dy1,dx2,dy2,Bevel1,Bevel2;
	bool	Result = false;

	dx1 = TmpTri1.x3 - TmpTri1.x1;	dy1 = TmpTri1.y1 - TmpTri1.y3;
	Bevel1 = sqrt(dx1 * dx1 + dy1 * dy1);
	dx2 = TmpTri2.x3 - TmpTri2.x1;	dy2 = TmpTri2.y1 - TmpTri2.y3;
	Bevel2 = sqrt(dx2 * dx2 + dy2 * dy2);

	if((Bevel1 - Bevel2) > 0)	{
		Result = true;
	}

	return Result;
}

/*************Find CurrPoint in whitch map*************/
bool CGpsDrawMap::CheckPointInMap(double gx,double gy,ChangeTriangle *TmpTri)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -