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
在这里插入图片描述

未处理:
在这里插入图片描述
处理后:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值