摄影测量与遥感课程设计B11090507.docx
《摄影测量与遥感课程设计B11090507.docx》由会员分享,可在线阅读,更多相关《摄影测量与遥感课程设计B11090507.docx(15页珍藏版)》请在冰点文库上搜索。
摄影测量与遥感课程设计B11090507
课程设计报告
(2013/2014学年第一学期)
题目:
立体像对的前方交会
专业测绘工程
学生姓名丁玉堃
班级学号B11090507
指导教师杨立君
指导单位地理与生物信息学院
日期2013年12月29日
1、内容与要求
(1)以读文本文件的形式读取立体像对的外方位元素值;
(2)以读取文本文件的形式读取同名像点坐标;
(3)计算投影系数,像空间辅助坐标系坐标及地面摄影测量坐标系坐标;
(4)首先自己设计好界面和算法,解算中间参数及成果应通过窗口或对话框进行显示;
(5)界面友好,可操作性强,输入信息符合专业规范;
(6)必须完成所要求的各基本功能;
(7)程序设计语言可根据个人情况进行选择,建议使用IDL交互式程序设计语言。
2、基本原理
立体像对与所摄影地面存在着一定几何关系,这种关系可以用数学表达式来描述,若在S1,S2两个摄站点对地面摄影,获取一个立体像对,任一地面点A在该像对的左右相片上的构象为a1,a2。
现已知这两张相片的内外方位元素,设想将该相片按内外方位元素值置于摄影时的位置,显然同名射线S1a1与S2a2必然交于地面点A。
这种由立体像对中两张像片的内,外方位元素和像点坐标来确定相应地面点的地面坐标的方法,称为空间前方交会。
空间前方交会基本关系式:
要确定像点与其对应的地面点的数学表达式,要设定D-XYZ地面摄影测量坐标系,S1-U1V1W1及S2-U2V2W2分别为左右相片的相空间辅助坐标系,且两个像空间辅助坐标系的三个轴系分别与D-XYZ三轴平行。
设地面点A在D-XYZ坐标系中的坐标为(X,Y,Z),地面点A在S1-U1V1W1及S2-U2V2W2中的坐标分别为(U1,V1,W1)及(U2,V2.W2),A点相应像点a1,a2的像空间坐标为(x1,y1,-f),(x2,y2,-f),像点的像空间辅助坐标为(u1,v1,w1),(u2,v2,w2),则有:
(1-1)
式中的R1,R2为由已知的外方位角元素计算的左右像片的旋转矩阵,右摄影站点S2,在S1-U1V1W1中的坐标,即摄影基线B的三个分量Bu,Bv,Bw,可由外方位元素计算:
Bu=Xs2-Xs1
Bv=Ys2-Ys1(1-2)
Bw=Zs2-Zs1
因左右像空间辅助坐标系及D-XYZ相互平行,且设站点,像点,地面三点共线,由此可得出:
(1-3)
式中的N1,N2分别称为左右像点的投影系数。
U1,V1,W1为地面点A在S1-U1V1W1中的坐标;U2,V2,W2为地面点A在S2-U2V2W2中的坐标,
(1-4)
最后得出计算地面点坐标公式:
X=Xs1+U1=Xs2+U2
Y=Ys1+V1=Ys2+V2(1-5)
Z=Zs1+W1=Zs2+W2
一般地,在计算地面点Y坐标时,应取值,即
Y=0.5[(Ys1+N1v1)+(Ys2+N2v2)]
由此可得求投影系数的计算式为:
;(1-6)
上述公式即为立体像对前方交会基本公式。
3、程序设计思路
程序设计思路:
建立顶级tlb控件,在上面添加读取文件和计算结果的按钮。
分别为按钮添加event响应事件,建立全局指针便于不同事件间数值的传递。
具体计算结果的函数可以事先写好,并保证运行正确。
4、源程序代码
PROExitProcedure,event;退出程序
WIDGET_CONTROL,event.TOP,/DESTROY
end
;菜单系统响应事件
PROOpenProcedure,event
Result=DIALOG_MESSAGE('File->OpenSelected!
',/INFORMATION)
END
PROSaveProcedure,event
Result=DIALOG_MESSAGE('File->SaveSelected!
',/INFORMATION)
END
PROCopyProcedure,event
Result=DIALOG_MESSAGE('Edit->CopySelected!
',/INFORMATION)
END
PROPasteProcedure,event
Result=DIALOG_MESSAGE('Edit->PasteSelected!
',/INFORMATION)
END
PROContentsProcedure,event
Result=DIALOG_MESSAGE('Help->ContentsSelected!
',/INFORMATION)
END
PROFunctionProcedure,event
Result=DIALOG_MESSAGE('Help->Topic->FunctionSelected!
',/INFORMATION)
END
PROAboutProcedure,event
Result=DIALOG_MESSAGE('摄影测量双向前方交会',/INFORMATION)
END
protestDialog,event;读入外方位元素值
widget_control,event.TOP,get_Uvalue=pState
file1=dialog_pickfile($
title='选择一个TXT',$
path='e:
',$
filter='*.txt')
nlines=file_lines(file1)
N=strtrim(STRING(nlines/2),2)
tmp=''
;打开文件
openr,lun,file1,/get_lun
readf,lun,tmp
var=double(strsplit(tmp,/extract))
rownum=N_elements(var)
Wf=DINDGEN(rowNum,nLines-1)
readf,lun,Wf
Wf=[[var],[Wf]]
Wf=strtrim(STRING(Wf),2)
(*pState).Wf=Wf
;result-dialog_message('ilove'+STRING(13b)+'you')
;13b是ascii码的回车符
;10b是ascii码的换行符
WIDGET_CONTROL,(*pState).MyLabel,SET_VALUE='成功读入了'+n+'组外方位元素值'$
+STRING(10b)
widget_control,event.TOP,set_Uvalue=pState
;mystring='成功读取外方位元素值'
;Result=Dialog_message(mystring,/information)
end
protestDialog2,event;读取同名像点文件
widget_control,event.TOP,get_Uvalue=pState
file1=dialog_pickfile($
title='选择一个TXT',$
path='e:
',$
filter='*.txt')
nlines=file_lines(file1)
N=strtrim(STRING(nlines),2)
tmp=''
;打开文件
openr,lun,file1,/get_lun
readf,lun,tmp
var=double(strsplit(tmp,/extract))
rownum=N_elements(var)
Tm=DINDGEN(rowNum,nLines-1)
readf,lun,Tm
(*pState).Tm=[[var],[Tm]]
;mystring='成功读取同名像点坐标值'
;Result=Dialog_message(mystring,/information)
WIDGET_CONTROL,(*pState).MyLabel,SET_VALUE='成功读入了'+n+'组同名像点坐标值'
widget_control,event.TOP,set_Uvalue=pState
end
prophoto,event
widget_control,event.TOP,get_Uvalue=pState
print,(*pState).Wf
print,(*pState).Tm
Wf=(*pState).Wf
Tm=(*pState).Tm
pi=3.1415926
Wf[*,2:
3]=Wf[*,2:
3]/180.0*pi
;外方位
R1=DINDGEN(3,3)
R2=DINDGEN(3,3)
Fuzhu1=DINDGEN(1,3)
Fuzhu2=DINDGEN(1,3);像空间辅助坐标系
a1=double(cos(Wf[0,3])*cos(Wf[2,3])-sin(Wf[0,3])*sin(Wf[1,3])*sin(Wf[2,3]))
a2=double(-cos(Wf[0,3])*sin(Wf[2,3])-sin(Wf[0,3])*sin(Wf[1,3])*cos(Wf[2,3]))
a3=double(-sin(Wf[0,3])*cos(Wf[1,3]))
b1=double(cos(Wf[1,3])*sin(Wf[2,3]))
b2=double(cos(Wf[1,3])*cos(Wf[2,3]))
b3=double(-sin(Wf[1,3]))
c1=double(sin(Wf[0,3])*cos(Wf[2,3])+cos(Wf[0,3])*sin(Wf[1,3])*sin(Wf[2,3]))
c2=double(-sin(Wf[0,3])*sin(Wf[2,3])+cos(Wf[0,3])*sin(Wf[1,3])*cos(Wf[2,3]))
c3=double(cos(Wf[0,3])*cos(Wf[1,3]))
;
a11=double(cos(Wf[0,2])*cos(Wf[2,2])-sin(Wf[0,2])*sin(Wf[1,2])*sin(Wf[2,2]))
a22=double(-cos(Wf[0,2])*sin(Wf[2,2])-sin(Wf[0,2])*sin(Wf[1,2])*cos(Wf[2,2]))
a33=double(-sin(Wf[0,2])*cos(Wf[1,2]))
b11=double(cos(Wf[1,2])*sin(Wf[2,2]))
b22=double(cos(Wf[1,2])*cos(Wf[2,2]))
b33=double(-sin(Wf[1,2]))
c11=double(sin(Wf[0,2])*cos(Wf[2,2])+cos(Wf[0,2])*sin(Wf[1,2])*sin(Wf[2,2]))
c22=double(-sin(Wf[0,2])*sin(Wf[2,2])+cos(Wf[0,2])*sin(Wf[1,2])*cos(Wf[2,2]))
c33=double(cos(Wf[0,2])*cos(Wf[1,2]))
R2=[[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]]
R1=[[a11,b11,c11],[a22,b22,c22],[a33,b33,c33]]
Fuzhu1=R1##transpose(Tm[*,0])
Fuzhu2=R2##transpose(Tm[*,1])
Bu=Tm[0,1]-Tm[0,0]
Bv=Tm[1,1]-Tm[1,0]
Bw=Tm[2,1]-Tm[2,0]
N1=(Bu*Fuzhu2[0,2]-Bw*Fuzhu2[0,0])/(Fuzhu1[0,0]*Fuzhu2[0,2]$
-Fuzhu2[0,0]*Fuzhu1[0,2])
N2=(Bu*Fuzhu1[0,2]-Bw*Fuzhu1[0,0])/(Fuzhu1[0,0]*Fuzhu2[0,2]$
-Fuzhu2[0,0]*Fuzhu1[0,2])
DX=Tm[0,0]+N1*Fuzhu1[0,0]
DY=0.5*((Tm[1,0]+N1*Fuzhu1[0,1])+(Tm[1,1]+N2*Fuzhu2[0,1]))
DZ=Tm[2,0]+N1*Fuzhu1[0,2]
Dm=[Dx,Dz,Dy]
Openw,lun,'E:
\testdata.txt',/get_lun
printf,lun,Dm
;Openu,lun,'E:
\testdata.txt',/get_lun
;printf,lun,N1
free_lun,lun
mystring='计算出的坐标值已保存到“testdata.txt”中'
Result=Dialog_message(mystring,/information)
widget_control,event.TOP,set_Uvalue=pState
end
propphoto
tlb=widget_base($
xsize=500,$
ysize=400,$
xoffset=500,$
yoffset=100,$
mbar=SystemMenuBase,$;创建菜单系统
;/column,$
title='摄影测量学')
FileMenu=WIDGET_BUTTON(SystemMenuBase,VALUE='&File',/MENU)
MyOpen=WIDGET_BUTTON(FileMenu,VALUE='&Open',EVENT_PRO='OpenProcedure')
MySave=WIDGET_BUTTON(FileMenu,VALUE='&Save',EVENT_PRO='SaveProcedure')
MyExit=WIDGET_BUTTON(FileMenu,VALUE='&Exit',EVENT_PRO='ExitProcedure',/SEPARATOR)
EditMenu=WIDGET_BUTTON(SystemMenuBase,VALUE='&Edit',/MENU)
Mycopy=WIDGET_BUTTON(EditMenu,VALUE='&Copy',EVENT_PRO='CopyProcedure')
MyPaste=WIDGET_BUTTON(EditMenu,VALUE='&Paste',EVENT_PRO='PasteProcedure')
HelpMenu=WIDGET_BUTTON(SystemMenuBase,VALUE='&Help',/MENU)
MyContents=WIDGET_BUTTON(HelpMenu,VALUE='C&ontents',EVENT_PRO='ContentsProcedure')
MyTopic=WIDGET_BUTTON(HelpMenu,VALUE='&Topic',/MENU)
MyFunction=WIDGET_BUTTON(MyTopic,VALUE='&Function',EVENT_PRO='FunctionProcedure')
MyAbout=WIDGET_BUTTON(MyTopic,VALUE='&About',EVENT_PRO='AboutProcedure')
widget_control,tlb,/realize
;wText=WIDGET_TEXT(tlb,/EDITABLE,XSIZE=90)
wyButton4=WIDGET_BUTTON(tlb,VALUE='导入外方位数据',$
EVENT_PRO='testDialog',XSIZE=100,YSIZE=40,$
XOFFSET=380,YOFFSET=50)
wButton3=WIDGET_BUTTON(tlb,VALUE='导入同名像点数据',$
EVENT_PRO='testDialog2',XSIZE=100,YSIZE=40,$
XOFFSET=380,YOFFSET=100)
wButton2=WIDGET_BUTTON(tlb,VALUE='计算地面点坐标',$
EVENT_PRO='photo',XSIZE=100,YSIZE=40,$
XOFFSET=380,YOFFSET=150)
wButton1=WIDGET_BUTTON(tlb,VALUE='EXIT',/align_center,$
EVENT_PRO='ExitProcedure',XSIZE=100,YSIZE=40,$
XOFFSET=380,YOFFSET=200)
;MyText1=WIDGET_TEXT(tlb,XOFFSET=0,SCR_XSIZE=500,$
;YOFFSET=4,SCR_YSIZE=4)
;MyText2=WIDGET_TEXT(tlb,XOFFSET=0,SCR_XSIZE=500,$
;YOFFSET=42,SCR_YSIZE=4)
MyLabel=WIDGET_LABEL(tlb,XOFFSET=10,SCR_XSIZE=300,$
YOFFSET=50,SCR_YSIZE=200,/SUNKEN_FRAME,$
VALUE='欢迎使用摄影测量应用程序',/ALIGN_CENTER)
pState=Ptr_new({$;创建指针结构变量
;wButton2:
wButton2,$
;wButton3:
wButton3,$
;wButton4:
wButton4,$
MyLabel:
MyLabel,$
Wf:
dindgen(3,4),$
Tm:
dindgen(3,2)$
})
widget_control,tlb,set_Uvalue=pState
XMANAGER,'pphoto',tlb
end
5、测试数据及其结果分析
程序读取的是同名像点坐标.txt、外方位元素值.txt两个txt文件。
具体数据为:
picname
xs
ys
zs
phi
ow
k
HT01R01E28Z0103.jpg
-6911.427876
4181.156861
157.7731874
0.348309888
-0.309135767
0.081363007
HT01R01E28Z0104.jpg
-6922.011458
4203.665077
151.6220453
0.382310345
-0.335320345
0.082770169
p1
-2.994926
98.313214
-165.370335
p2
115.30009
106.807568
-166.986144
运行界面:
运行结果会被存入一个txt文件中:
地面点坐标
-6911.6950,4203.2251,136.9591
投影系数:
0.125,0.088
辅助坐标:
-2.12,97.41,-165.91
116.24,106.00,-165.22
6、调试过程中的问题
1、数据读取需要是按行读取矩阵,便于后来的运算。
2、编写界面时,要弄清楚思路。
3、变量需要通过指针传递其Uvalue。
4、变量的数据类型要时刻注意。
7、课程设计总结
在这次实验中,我们组拿到的题目是立体相对的前方交会,老师建议我们用IDL语言进行编写,听到这个消息,我们觉得压力很大,因为从来没有接触过IDL语言,不知道自己能不能编出最后的程序。
第一天实验开始后,我们先分成两组,一组先研究算法,另一组钻研IDL语言,经过一天的学习和论,在实验开始后的第二天下午,我们正式开始编写,同时我们也做了一个决定,由卞鸿磊和丁晨用C#语言进行编写,我和李贻然同学边行学习,边用IDL语言进行编写,以保能按时完成软件。
因为是第一次用IDL语言来编写软件,很多方面都得从头学,最困难的地方就是界面程序的编写,在这一点上,耗费了较多的时间,一开始的界面都很丑,在反复修改后,才变得较为美观,不过用IDL语言也有很多优点,它更多的系统函数和方便的矩阵运算都是其他语言不能比的。
通过这一次的实验,让我们更好地掌握了摄影测量学的基本内容,同时也了解了一门新语言IDL,收获很大。