EasyRadar-SCRadar
1.SC雷达格式
1)VCP21 9层
2)方位角约为0-359递增(因雷达设备原因,有出现方位角跳变,下面有例子,已通过代码解决)
3)库宽为300米,库数高达4000,但有最大探测距离参数。由最大距离计算有效库数应为555,故有效探测距离约为150公里
2.SC雷达解码函数
#define MaxEl 9
#define MaxAz 400
#define MaxBinNum 4000
int CSCRadar::DecodeFile(CString filepath)
{
CFile file;
file.Open(filepath, CFile::modeRead);//打开文件
file.Read(&m_FileHeadSC,sizeof(m_FileHeadSC));//读公共数据块
m_radLat = m_FileHeadSC.RadarSiteInfo.lantitudevalue * 0.01;//纬度
m_radLon = m_FileHeadSC.RadarSiteInfo.longitudevalue * 0.01;//经度
m_radHgt = m_FileHeadSC.RadarSiteInfo.height * 0.001 * 0.001;//海拔高度(mm2km)
//创建动态数组
m_ref = new float**[MaxEl];//反射率
m_el = new float[MaxEl];//层仰角
m_az = new float*[MaxEl];//层径向方位角
m_radialnum = new int[MaxEl];//层径向数
m_binnum = new int[MaxEl];//层径向库数4000
m_binwidth = new int[MaxEl];//层径向库宽300
int sizesum = sizeof(m_ref) * MaxBinNum;
for(int i = 0; i < MaxEl; i++){
m_ref[i] = new float*[MaxAz];
m_az[i] = new float[MaxAz];
for(int j = 0; j < MaxAz; j++){
m_ref[i][j] = new float[MaxBinNum];
memset(m_ref[i][j], 0, sizesum);//初始化
}
}
int nstype = 0;
//!雷达扫描模式 1:RHI; 10:PPI; >100:VOL
nstype = m_FileHeadSC.RadarObservationInfo.stype;
int layernum = 0;
layernum = nstype - 100;
if(layernum != 9) return -1;
float maxL[9] = {0};
for(int i = 0; i < layernum; i++){
m_radialnum[i] = m_FileHeadSC.RadarObservationInfo.LayerParam[i].recordnumber;//径向数
m_el[i] = m_FileHeadSC.RadarObservationInfo.LayerParam[i].Swangles * 0.01;//本层仰角度数,单位度
m_binwidth[i] = m_FileHeadSC.RadarObservationInfo.LayerParam[i].binWidth * 0.1;//库宽(米)
//m_binnum[i] = m_FileHeadSC.RadarObservationInfo.LayerParam[i].binnumber;//库数
m_binnum[i] = (m_FileHeadSC.RadarObservationInfo.LayerParam[i].MaxL * 10) / m_binwidth[i];//由最大可探测距离计算的库数
}
float faz = 360 / 65536.0; //方位角转换因子
unsigned char refdata;
for(int i = 0; i < layernum; i++){
for(int j = 0; j < m_radialnum[i]; j++){
file.Read(&m_DataSC,sizeof(m_DataSC));//将雷达数据放入数据记录块结构体变量中
m_az[i][j] = m_DataSC.startaz * faz;//本层某径向方位角度数,单位度
if(j > 0) if(abs(m_az[i][j]- m_az[i][j - 1]) >= 5) m_az[i][j] = m_az[i][j - 1] + 0.5;//针对雷达方位角基数据错误,作出处理(前后径向度数相差过大)
for(int k = 0; k < m_binnum[i]; k++){
refdata = m_DataSC.RawDataBin[k].m_dBZ;
if(refdata == 0) m_ref[i][j][k] = -99;
else m_ref[i][j][k] = refdata / 2 - 32;
}
}
}
file.Close();
return 1;
}
3.画图函数(非View类+双缓存)
int CSCRadar::PreDraw()
{
CMainFrame *pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd;//主窗口指针
m_clientdc = pMain->GetActiveView()->GetDC();//获得主框架当前视图DC(设备上下文)
m_memDC = new CDC();
m_memBmp = new CBitmap();
pMain->GetActiveView()->GetClientRect(&m_clientrect);
m_memDC->CreateCompatibleDC(m_clientdc);
m_memBmp->CreateCompatibleBitmap(m_clientdc, m_clientrect.right, m_clientrect.bottom);
m_memDC->SelectObject(*m_memBmp);
CBrush WhiteBrush(RGB(0, 0, 0));
m_memDC->FillRect(&m_clientrect, &WhiteBrush);
return 1;
}
int CSCRadar::DrawVolPolar(int layer)//雷达库长与库数不同,导致比率不同
{
PreDraw();//设置双缓存
CBrush brushRef[15];
CPen penRef[15];
int rt[15]={0,5,10,15,20,25,30,35,40,45,50,55,60,70,80};
//准备色标
COLORREF ct[15]={
RGB(0,0,0),
RGB(192,192,254),
RGB(123,114,239),
RGB(31,39,209),
RGB(166,253,168),
RGB(0,234,0),
RGB(16,146,26),
RGB(252,244,101),
RGB(201,201,3),
RGB(140,140,0),
RGB(255,172,172),
RGB(254,101,92),
RGB(238,2,49),
RGB(213,143,254),
RGB(170,37,250),
};
//准备画笔画刷
for(int i=0;i<15;i++){
brushRef[i].CreateSolidBrush(ct[i]);
penRef[i].CreatePen(PS_SOLID,1,ct[i]);
}
//画图
float Degrees2Radians = 3.14 / 180.;//度转弧度
float ratio = 0.8;
int coloridx = 0;
CPoint p[4], dot;
float theta1 = 0, theta2 = 0;
float sinv1,cosv1,sinv2,cosv2;
theta1 = m_az[layer][m_radialnum[layer]-1] * Degrees2Radians;
dot.x = 500;
dot.y = m_clientrect.bottom / 2.;
for(int i = 0; i < m_radialnum[layer]; i++){
theta2 = m_az[layer][i] * Degrees2Radians;
sinv1 = sin(theta1);
sinv2 = sin(theta2);
cosv1 = cos(theta1);
cosv2 = cos(theta2);
for(int j = 0; j < m_binnum[layer]; j++){
p[0].x = dot.x + ratio * j * sinv1;
p[0].y = dot.y - ratio * j * cosv1;
p[1].x = dot.x + ratio * (j+1) * sinv1;
p[1].y = dot.y - ratio * (j+1) * cosv1;
p[2].x = dot.x + ratio * (j+1) * sinv2;
p[2].y = dot.y - ratio * (j+1) * cosv2;
p[3].x = dot.x + ratio * j * sinv2;
p[3].y = dot.y - ratio * j * cosv2;
//根据反射率值的大小选择相应的颜色
for(int k = 0; k < 15; k++){
if(m_ref[layer][i][j] == -99){
coloridx = -99;
break;
}
else if(m_ref[layer][i][j] <= rt[k]){
coloridx = k;
break;
}
else coloridx = 14;
}
if(coloridx != -99){
m_memDC->SelectObject(&brushRef[coloridx]);
m_memDC->SelectObject(&penRef[coloridx]);
m_memDC->Polygon(p, 4);
}
theta1 = theta2;
}
}
m_clientdc->BitBlt(0,0,m_clientrect.right,m_clientrect.bottom,m_memDC,0,0,SRCCOPY);//贴图
return 1;
}
4.雷达设备导致方位角数据突变
[223] 为122.49,其应约为222.49
未处理:
处理后: