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

📄 hardy_changedlg.cpp

📁 利用多面函数拟合法来拟合似大地水准面
💻 CPP
字号:
// Hardy_ChangeDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GeoinModel.h"
#include "Hardy_ChangeDlg.h"
#include "matrix.h" 

extern double CenterL(double dl);
extern  double CenterB(double db);
extern  double ReturnCenterL(double dl);
extern  double ReturnCenterB(double db);
extern  double Arc2DMS(double dd);
extern  double int_radian(double intdeg);
extern  double deg_int(double gms);
extern double myu(double a, double b);


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHardy_ChangeDlg dialog


CHardy_ChangeDlg::CHardy_ChangeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CHardy_ChangeDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CHardy_ChangeDlg)
	m_dInputB = 25.191264147;
	m_dInputH = 72.3032;
	m_dInputL = 118.574388797;
	m_dOutputh = 0.0;
	m_strOutputFilePath = _T("");
	m_strParamFilePath = _T("");
	m_strInputFilePath = _T("");
	//}}AFX_DATA_INIT
}


void CHardy_ChangeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CHardy_ChangeDlg)
	DDX_Text(pDX, IDC_EDTB, m_dInputB);
	DDV_MinMaxDouble(pDX, m_dInputB, 24.5, 26.);
	DDX_Text(pDX, IDC_EDTH, m_dInputH);
	DDV_MinMaxDouble(pDX, m_dInputH, 0., 1500.);
	DDX_Text(pDX, IDC_EDTL, m_dInputL);
	DDV_MinMaxDouble(pDX, m_dInputL, 118.2, 119.5);
	DDX_Text(pDX, IDC_EDTOuth, m_dOutputh);
	DDX_Text(pDX, IDC_EDTOutBLHFilePath, m_strOutputFilePath);
	DDX_Text(pDX, IDC_EDTParamFilePath, m_strParamFilePath);
	DDX_Text(pDX, IDC_EDTInBLHFilePath, m_strInputFilePath);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CHardy_ChangeDlg, CDialog)
	//{{AFX_MSG_MAP(CHardy_ChangeDlg)
	ON_BN_CLICKED(IDC_BTNFileChange, OnBTNFileChange)
	ON_BN_CLICKED(IDC_BTNKeyBoardChange, OnBTNKeyBoardChange)
	ON_BN_CLICKED(IDC_BTNOpenParamFilePath, OnBTNOpenParamFilePath)
	ON_BN_CLICKED(IDC_BTNOpenInBLHFile, OnBTNOpenInBLHFile)
	ON_BN_CLICKED(IDC_BTNOpenOutBLHFile, OnBTNOpenOutBLHFile)
	ON_EN_CHANGE(IDC_EDTB, OnChangeEdtb)
	ON_EN_CHANGE(IDC_EDTL, OnChangeEdtl)
	ON_EN_CHANGE(IDC_EDTH, OnChangeEdth)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

void CHardy_ChangeDlg::OnCancel() 
{	
	CDialog::OnCancel();
}

//转换--键盘输入
void CHardy_ChangeDlg::OnBTNFileChange() 
{	
	//////////////////////////////////////////////////////////
	int i,j;
	CString strCoreFunction,strP;  //核函数类型,权函数类型
	CString stra,strq,strb,strB,strL,strH,strE;
	double dCodea[200],dCodeq[200],dCodeb[200],dCodeB[200],dCodeL[200],dCodeE[200];
	//dCodeH[200],
	int iCodeNum;   //节点个数

	//◎读取参数文件,注意参数文件中可能有多组参数,默认读取第一组参数
	if(m_strParamFilePath=="")
	{		
		MessageBox("请先打开参数文件,再进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
		return;
	}

	strCoreFunction="不顾及高程项";

	//转换参数a,平滑参数q,曲面参数b(0.5/-0.5),大地经度,大地纬度,高程异常
	char buffer[256];
	FILE *File =fopen(m_strParamFilePath,"r");
	if(fgets(buffer,256,File)!=NULL)
	{   //首行,起始标志-9999.9999,节点个数
		stra=strtok(buffer,",, ");
		strb=strtok('\0',",, ");
		iCodeNum=atoi(strb);
	}
	else
	{		
		MessageBox("参数文件为空,无法进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
		return;
	}
	if( iCodeNum<=0)
	{
		MessageBox("参数数据文件有误,请查看。");
		return;
	}
	for(i=1;i<=iCodeNum;i++)
	{
		if(fgets(buffer,256,File)!=NULL)
		{	
			stra=strtok(buffer,",, ");
			strq=strtok('\0',",, "); 
			strb=strtok('\0',",, ");
			
			strB=strtok('\0',",, ");
			strL=strtok(  '\0',",, ");
			strE=strtok('\0',",, ");
			dCodea[i]=atof(stra);  //转换参数a
			dCodeq[i]=atof(strq);  //平滑系数q
			dCodeb[i]=atof(strb);  //曲面参数b(0.5/-0.5)
			
			dCodeB[i]=atof(strB); 
			dCodeL[i]=atof(strL);
			dCodeE[i]=atof(strE);  //高程异常
		}
	}
	fclose(File);

	//////////////////////////////////////////////////////////

	//◎将输入的经纬度化弧度,并中心化
	double dl,db,dH84,de,dCore;

	db=int_radian(deg_int(m_dInputB));
	db=CenterB(db);    //中心化

	dl=int_radian(deg_int(m_dInputL));
	dl=CenterL(dl);    //中心化
	dH84=m_dInputH;

	//◎进行转换
	de=0;
	for(j=1;j<=iCodeNum;j++)
	{
		//1、根据核函数的形式
		if(strCoreFunction=="不顾及高程项")   //核函数:不顾及高程项
		{		
			dCore=sqrt(pow(dl-dCodeL[j],2)+pow(db-dCodeB[j],2)+dCodeq[j]);
		}
	/*	else if(strCoreFunction=="顾及高程项")   //核函数:顾及高程项		
		{
			dCore=sqrt(pow(dl-dCodeL[j],2)+pow(db-dCodeB[j],2)+pow(dH84-dCodeH[j],2)+dCodeq[j]);
		}*/

		//2、根据b(1/2;-1/2)
        if(dCodeb[j]==-0.5)  dCodeb[j]=0.6;
		if(dCodeb[j]>0.5 && dCore!=0)
		{
			dCore=1.0/dCore;
		}
		//3、计算
		de=de+dCodea[j]*dCore;
	}
	m_dOutputh=dH84-de;

	UpdateData(false);
}
//转换--文件输入
void CHardy_ChangeDlg::OnBTNKeyBoardChange() 
{
	//////////////////////////////////////////////////////////
	int i,j;
	CString strCoreFunction,strP;  //核函数类型,权函数类型
	CString stra,strq,strb,strB,strL,strH,strE;
	double dCodea[200],dCodeq[200],dCodeb[200],dCodeB[200],dCodeL[200],dCodeE[200];
	//dCodeH[200]
	int iCodeNum;   //节点个数
	//◎读取参数文件
	if(m_strParamFilePath=="")
	{		
		MessageBox("请先打开参数文件,再进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
		return;
	}

	//转换参数a,平滑参数q,曲面参数b(0.5/-0.5),大地经度,大地纬度,高程异常
	char buffer[256];
	FILE *File =fopen(m_strParamFilePath,"r");
	
	strCoreFunction="不顾及高程项";

	if(fgets(buffer,256,File)!=NULL)
	{
		//-9999.9999,节点数	
		stra=strtok(buffer,",, ");
		strq=strtok('\0',",, ");
		iCodeNum=atoi(strq);
	}
	else
	{		
		MessageBox("参数文件为空,无法进行转换。CHardy_ChangeDlg::OnBTNFileChange()");
		return;
	}
	if( iCodeNum<=0)
	{
		MessageBox("参数数据文件有误,请查看。");
		return;
	}
	for(i=1;i<=iCodeNum;i++)
	{
		if(fgets(buffer,256,File)!=NULL)
		{	
			stra=strtok(buffer,",, ");
			strq=strtok('\0',",, "); 
			strb=strtok('\0',",, ");
			
			strB=strtok('\0',",, ");
			strL=strtok(  '\0',",, ");
			strE=strtok('\0',",, ");
	
			dCodea[i]=atof(stra);  //转换参数a
			dCodeq[i]=atof(strq);  //平滑系数q
			dCodeb[i]=atof(strb);  //曲面参数b(0.5/-0.5)
			
			dCodeB[i]=atof(strB); 
			dCodeL[i]=atof(strL);
			//经纬度是中心化过的
			dCodeE[i]=atof(strE);  //高程异常
		}
	}
	fclose(File);

	//////////////////////////////////////////////////////////

	//◎读待转换文件
	CString strPtName[300];
	double dB[300],dL[300],dH[300],dE[300];
	int iChangeNum;
	CString strPtname;

	File=fopen(m_strInputFilePath,"r");

	iChangeNum=0;
	while(fgets(buffer,256,File)!=NULL)
	{	
		strPtname=strtok(buffer,",, ");		
		strB=strtok('\0',",, ");
		strL=strtok(  '\0',",, ");
		strH=strtok('\0',",, ");
		iChangeNum++;

		strPtName[iChangeNum]=strPtname;		
		dB[iChangeNum]=int_radian(deg_int(atof(strB)));
		dB[iChangeNum]=CenterB(dB[iChangeNum]);    //中心化

		dL[iChangeNum]=int_radian(deg_int(atof(strL)));
		dL[iChangeNum]=CenterL(dL[iChangeNum]);    //中心化

		dH[iChangeNum]=atof(strH);
	}
	fclose(File);
	if( iChangeNum<=0)
	{
		MessageBox("待转换数据文件有误,请查看。");
		return;
	}
	//////////////////////////////////////////////////////////
     double dCore;

	//◎进行转换
	for(i=1;i<=iChangeNum;i++)
	{
		dE[i]=0;
		for(j=1;j<=iCodeNum;j++)
		{
			//1、根据核函数的形式
			if(strCoreFunction=="不顾及高程项")   //核函数:不顾及高程项
			{		
				dCore=sqrt(pow(dL[i]-dCodeL[j],2)+pow(dB[i]-dCodeB[j],2)+dCodeq[j]);
			}
		/*	else if(strCoreFunction=="顾及高程项")   //核函数:顾及高程项		
			{
				dCore=sqrt(pow(dL[i]-dCodeL[j],2)+pow(dB[i]-dCodeB[j],2)+pow(dH[i]-dCodeH[j],2)+dCodeq[j]);
			}*/
			//2、根据b(1/2;-1/2)
			if(dCodeb[j]==-0.5) dCodeb[j]=0.6;
			if(dCodeb[j]>0.5 && dCore!=0)
			{
				dCore=1.0/dCore;
			}
			//3、计算
			dE[i]=dE[i]+dCodea[j]*dCore;
		}
	}

	//还原经度,纬度,并转换成dd.mmsss格式
	for(i=1;i<=iChangeNum;i++)
	{
		dB[i]=Arc2DMS(ReturnCenterB(dB[i]));  //中心化,并弧度——dd.mmsss
		dL[i]=Arc2DMS(ReturnCenterL(dL[i]));
	}


	////////////////////////////////////////////////////////

	//◎写入文件,点名,纬度,经度,大地高,正常高,高程异常
	if(m_strOutputFilePath!="")
	{
		if((File=fopen(m_strOutputFilePath ,"wt"))!=NULL)
		{
			for(j=1;j<=iChangeNum;j++) fprintf(File,"%s,%.9f,%.9f,%.4f,%.4f,%.4f\n",
				strPtName[j],dB[j],dL[j],dH[j],dH[j]-dE[j],dE[j]);
			fprintf(File,"\n");
			MessageBox("计算完成,请查看计算结果CHardy_ChangeDlg::OnBTNKeyBoardChange()");
			fclose(File);
		}
		else
		{
			MessageBox("写入结果文件出错,请检查。。。");
		}

		//打开文本文件
		CString Command;
		Command = "notepad ";
		Command += m_strOutputFilePath;
		WinExec(Command,SW_SHOWMAXIMIZED);
	}

}
//打开参数文件
void CHardy_ChangeDlg::OnBTNOpenParamFilePath() 
{
	CString FileName;
	CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		         TEXT("Chart Files (*.txt)|*.txt"),NULL);
	if(file.DoModal()==IDOK) 
	{
		m_strParamFilePath=file.m_ofn.lpstrFile;
		UpdateData(false);
	}
}
//打开输入文件
void CHardy_ChangeDlg::OnBTNOpenInBLHFile() 
{
	CString FileName;
	CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		         TEXT("Chart Files (*.txt)|*.txt"),NULL);
	if(file.DoModal()==IDOK) 
	{
		m_strInputFilePath=file.m_ofn.lpstrFile;
		UpdateData(false);
	}
}
//打开输出文件
void CHardy_ChangeDlg::OnBTNOpenOutBLHFile() 
{
	CString FileName;
	CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		         TEXT("Chart Files (*.txt)|*.txt"),NULL);
	if(file.DoModal()==IDOK) 
	{
		m_strOutputFilePath=file.m_ofn.lpstrFile;
		UpdateData(false);
	}	
}

void CHardy_ChangeDlg::OnChangeEdtb() 
{
	UpdateData(true);	
}

void CHardy_ChangeDlg::OnChangeEdtl() 
{	
	UpdateData(true);
}

void CHardy_ChangeDlg::OnChangeEdth() 
{
	UpdateData(true);
}

⌨️ 快捷键说明

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