解析空中三角测量程序代码.docx
- 文档编号:4199656
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:32
- 大小:56.06KB
解析空中三角测量程序代码.docx
《解析空中三角测量程序代码.docx》由会员分享,可在线阅读,更多相关《解析空中三角测量程序代码.docx(32页珍藏版)》请在冰豆网上搜索。
解析空中三角测量程序代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.Data.OleDb;
namespace解析空中三角测量
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
#region/////////////////////////////////////////////////////////////定义静态变量///////////////////////////////////////////////////////////////
constintN=150;
int[]C=newint[3]{15,8,11};//各像对像点个数
int[][]LDot=newint[3][];//像点点号
int[]Control_Points=newint[4];//控制点点号
int[]CheckPoint=newint[5];//检查点点号.
doublef=153.033/1000.0;//主距
doublem;//比例尺
//像对像点坐标
double[][]x1=newdouble[3][];
double[][]y1=newdouble[3][];
double[][]x2=newdouble[3][];
double[][]y2=newdouble[3][];
//像点的像空间辅助坐标
double[][]X1=newdouble[3][];
double[][]Y1=newdouble[3][];
double[][]Z1=newdouble[3][];
double[][]X2=newdouble[3][];
double[][]Y2=newdouble[3][];
double[][]Z2=newdouble[3][];
//相对定向元素
double[]φ1=newdouble[3];
double[]ω1=newdouble[3];
double[]κ1=newdouble[3];
double[]φ2=newdouble[3];
double[]ω2=newdouble[3];
double[]κ2=newdouble[3];
double[]u=newdouble[3];
double[]v=newdouble[3];
//摄影基线分量
double[]bx=newdouble[3];
double[]by=newdouble[3];
double[]bz=newdouble[3];
//左、右像片投影系数N1,N2
double[][]N1=newdouble[3][];
double[][]N2=newdouble[3][];
//上下视差Q
double[][]Q=newdouble[3][];
//模型点像空间辅助坐标
double[][]Xm=newdouble[3][];
double[][]Ym=newdouble[3][];
double[][]Zm=newdouble[3][];
//三个直线元素
double[]Xs=newdouble[4];
double[]Ys=newdouble[4];
double[]Zs=newdouble[4];
//模型点摄影测量坐标
double[][]Xp=newdouble[3][];
double[][]Yp=newdouble[3][];
double[][]Zp=newdouble[3][];
//绝对定向元素
doubleΔX,ΔY,ΔZ,λ,Φ,Ω,Κ;
//控制点大地坐标
double[]Xta=newdouble[4];
double[]Yta=newdouble[4];
double[]Zta=newdouble[4];
//控制点地面摄影测量坐标
double[]Xtpa=newdouble[4];
double[]Ytpa=newdouble[4];
double[]Ztpa=newdouble[4];
//控制点摄影测量坐标
double[]Xpa=newdouble[4];
double[]Ypa=newdouble[4];
double[]Zpa=newdouble[4];
//模型点地面摄影测量坐标
double[][]Xtp=newdouble[3][];
double[][]Ytp=newdouble[3][];
double[][]Ztp=newdouble[3][];
//模型点大地坐标
double[][]Xt=newdouble[3][];
double[][]Yt=newdouble[3][];
double[][]Zt=newdouble[3][];
//检查点大地坐标
double[]oXt=newdouble[5];
double[]oYt=newdouble[5];
double[]oZt=newdouble[5];
//检查点的误差
double[]oX=newdouble[5];
double[]oY=newdouble[5];
double[]oZ=newdouble[5];
#endregion
#region/////////////////////////////////////////////////////////////导入数据///////////////////////////////////////////////////////////////////
privatevoid导入像点坐标数据ToolStripMenuItem_Click(objectsender,EventArgse)
{
OpenFileDialogFILE=newOpenFileDialog();
FILE.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
FILE.FilterIndex=1;
if(FILE.ShowDialog()==DialogResult.OK)
{
StreamReaderMSR=newStreamReader(FILE.FileName);
stringLine;//读取每行信息放在该字符串中
double[,]Temp=newdouble[34,5];//每行信息存放在该二维数组中
inttemp=0;
//将*.txt文件信息读到Temp[,]二维数组中
while((Line=MSR.ReadLine())!
=null)
{
char[]tt=newchar[]{'\r','\n'};
string[]split=Line.Split(tt);//字符串转换为字符串数组
string[]numbers;//读取的每行信息记录在数组中
for(inti=0;i { numbers=split[i].Split(''); for(intj=0,k=0;j ="";j++) Temp[temp,k++]=double.Parse(numbers[j]); } temp++; } MSR.Close(); //用Temp中的数据赋值,并将单位换成米,并实例化像点坐标 for(inti=0;i<3;i++) { LDot[i]=newint[C[i]]; x1[i]=newdouble[C[i]]; y1[i]=newdouble[C[i]]; x2[i]=newdouble[C[i]]; y2[i]=newdouble[C[i]]; } //像对1的坐标 for(inti=0;i<15;i++) { LDot[0][i]=(int)Temp[i,0]; x1[0][i]=Temp[i,1]/1000000.0; y1[0][i]=Temp[i,2]/1000000.0; x2[0][i]=Temp[i,3]/1000000.0; y2[0][i]=Temp[i,4]/1000000.0; } //像对2的坐标 for(inti=0;i<8;i++) { LDot[1][i]=(int)Temp[i+15,0]; x1[1][i]=Temp[i+15,1]/1000000.0; y1[1][i]=Temp[i+15,2]/1000000.0; x2[1][i]=Temp[i+15,3]/1000000.0; y2[1][i]=Temp[i+15,4]/1000000.0; } //像对3的坐标 for(inti=0;i<11;i++) { LDot[2][i]=(int)Temp[i+23,0]; x1[2][i]=Temp[i+23,1]/1000000.0; y1[2][i]=Temp[i+23,2]/1000000.0; x2[2][i]=Temp[i+23,3]/1000000.0; y2[2][i]=Temp[i+23,4]/1000000.0; } //显示像对坐标数据 for(inti=0;i<34;i++) { ListViewItema; a=lst像对坐标数据.Items.Add(Temp[i,0].ToString()); a.SubItems.Add(Temp[i,1].ToString()); a.SubItems.Add(Temp[i,2].ToString()); a.SubItems.Add(Temp[i,3].ToString()); a.SubItems.Add(Temp[i,4].ToString()); } } } privatevoid导入控制点坐标数据ToolStripMenuItem_Click_1(objectsender,EventArgse) { OpenFileDialogFILE=newOpenFileDialog(); FILE.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"; FILE.FilterIndex=1; if(FILE.ShowDialog()==DialogResult.OK) { StreamReaderMSR=newStreamReader(FILE.FileName); stringLine;//读取每行信息放在该字符串中 double[,]Temp=newdouble[34,5];//每行信息存放在该二维数组中 inttemp=0; //将*.txt文件信息读到Temp[,]二维数组中 while((Line=MSR.ReadLine())! =null) { char[]tt=newchar[]{'\r','\n'}; string[]split=Line.Split(tt);//字符串转换为字符串数组 string[]numbers;//读取的每行信息记录在数组中 for(inti=0;i { numbers=split[i].Split(''); for(intj=0,k=0;j ="";j++) Temp[temp,k++]=double.Parse(numbers[j]); } temp++; } MSR.Close(); //用Temp中的数据赋值 for(inti=0;i<4;i++) { Control_Points[i]=(int)Temp[i,0]; Xta[i]=Temp[i,1]; Yta[i]=Temp[i,2]; Zta[i]=Temp[i,3]; } //显示控制点坐标数据 for(inti=0;i<4;i++) { ListViewItema; a=lst控制点数据.Items.Add(Temp[i,0].ToString()); a.SubItems.Add(Temp[i,1].ToString()); a.SubItems.Add(Temp[i,2].ToString()); a.SubItems.Add(Temp[i,3].ToString()); } tab数据.SelectedTab=tab控制点数据; } } privatevoid导入检查点坐标数据ToolStripMenuItem_Click(objectsender,EventArgse) { OpenFileDialogFILE=newOpenFileDialog(); FILE.Filter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"; FILE.FilterIndex=1; if(FILE.ShowDialog()==DialogResult.OK) { StreamReaderMSR=newStreamReader(FILE.FileName); stringLine;//读取每行信息放在该字符串中 double[,]Temp=newdouble[34,5];//每行信息存放在该二维数组中 inttemp=0; //将*.txt文件信息读到Temp[,]二维数组中 while((Line=MSR.ReadLine())! =null) { char[]tt=newchar[]{'\r','\n'}; string[]split=Line.Split(tt);//字符串转换为字符串数组 string[]numbers;//读取的每行信息记录在数组中 for(inti=0;i { numbers=split[i].Split(''); for(intj=0,k=0;j ="";j++) Temp[temp,k++]=double.Parse(numbers[j]); } temp++; } MSR.Close(); //用Temp中的数据赋值 for(inti=0;i<5;i++) { CheckPoint[i]=(int)Temp[i,0]; oXt[i]=Temp[i,1]; oYt[i]=Temp[i,2]; oZt[i]=Temp[i,3]; } //显示控制点坐标数据 for(inti=0;i<5;i++) { ListViewItema; a=lst检查点数据.Items.Add(Temp[i,0].ToString()); a.SubItems.Add(Temp[i,1].ToString()); a.SubItems.Add(Temp[i,2].ToString()); a.SubItems.Add(Temp[i,3].ToString()); } } tab数据.SelectedTab=tab检查点坐标数据; } #endregion #region/////////////////////////////////////////////////////////////矩阵运算/////////////////////////////////////////////////////////////////// //矩阵的转置运算 privatevoidTranspose(double[,]A,double[,]AT) { inti,j; for(i=0;i (1);i++) { for(j=0;j { AT[i,j]=A[j,i]; } } } //矩阵的乘法运算 privatevoidMatrix(double[,]AT,double[,]A,double[,]ATA) { inti,j,k; for(i=0;i { for(j=0;j (1);j++) { ATA[i,j]=0; for(k=0;k (1);k++) ATA[i,j]+=AT[i,k]*A[k,j]; } } } //矩阵求逆 privatevoidInverse(double[,]A,double[,]AR) { inti,j,h,k; intn=A.GetLength(0); doubleP; double[,]Q=newdouble[A.GetLength(0),2*A.GetLength (1)]; for(i=0;i for(j=0;j Q[i,j]=A[i,j];//532 for(i=0;i for(j=n;j<2*n;j++) {//123100 if(i+n==j)//234010 Q[i,j]=1;//532001 else Q[i,j]=0; } for(h=k=0;k for(i=k+1;i { if(Q[k,h]==0)//0XX100 for(intg=0;g if(Q[g,h]! =0)//XXx001 {//这种特殊情况的判断以及处理方式 for(j=0;j<2*n;j++) Q[k,j]-=Q[g,j]; break; } if(Q[i,h]==0)//将矩阵化为XXXXXX continue;//0XXXXX P=Q[k,h]/Q[i,h];//00XXXX for(j=0;j<2*n;j++)//的形式 { Q[i,j]*=P; Q[i,j]-=Q[k,j]; } } for(h=k=n-1;k>0;k--,h--)//消去对角线以上的数据 for(i=k-1;i>=0;i--)//此时无需考虑 { if(Q[i,h]==0)//XXXXXX continue;//0XXXXX P=Q[k,h]/Q[i,h];//000XXX for(j=0;j<2*n;j++)//这种情况,因为此时矩阵对应的行列式值为0,即该矩阵不存在逆矩阵 { Q[i,j]*=P; Q[i,j]-=Q[k,j]; } } for(i=0;i { P=1.0/Q[i,i]; for(j=0;j<2*n;j++) Q[i,j]*=P; } for(i=0;i for(j=0;j AR[i,j]=Q[i,j+n]; } #endregion #region/////////////////////////////////////////////////////////////相对定向/////////////////////////////////////////////////////////////////// //初始化 privatevoidInitial(inti) { //初始值 if(i==0) { φ1[0]=0; ω1[0]=0; κ1[0]=0; φ2[0]=0; ω2[0]=0; κ2[0]=0; } else { φ1[i]=φ2[i-1]; ω1[i]=ω2[i-1]; κ1[i]=κ2[i-1]; φ2[i]=0; ω2[i]=0; κ2[i]=0; } u[i]=0; v[i]=0; bx[i]=200.0/1000.0; //像点像空间辅助坐标 X1[i]=newdouble[C[i]]; Y1[i]=newdouble[C[i]]; Z1[i]=newdouble[C[i]]; X2[i]=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 解析 空中 三角测量 程序代码