📄 gpsdrawmap.cpp
字号:
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 + -