doi:10.3969/j.issn.1001-358X.2015.06.023基于C#的导线平差程序设计*张伟伟,杨华,周李磊(重庆师范大学三峡库区地表过程与环境遥感重庆市重点实验室,重庆401331)摘要:为解决NET平台下导线数据处理问题,文中以C#为开发语言,使用近似平差模型,开发导线平差程序。使用文献[9]附合导线观测数据,将程序处理结果和文献处理结果对比表明:①程序计算结果中方位角闭合差、方位角闭合差限差、角度改正数、导线全长相对闭合差均与原表一致;2、3、4号点计算坐标或与原表一致或相差0.001m。②程序中针对平差解算引入并拓展了四舍五入算法,将弧度保留八位有效数字,较好地解决了平差过程中由于数据迭代运算导致的数据丢失问题。③以.NET平台为基础开发的平差程序可以直接与.NET平台下GIS软件的二次开发交互;程序实现了数据录入、平差解算、详细计算过程及计算结果输出等功能。关键词:平差程序;导线测量;C#;四舍五入算法;精度丢失中图分类号:P209文献标识码:B文章编号:1001-358X(2015)06-0074-03*基金项目:1、国家自然科学基金(40771135);2、重庆师范大学研究生科研创新项目(YKC14010)目前,平差程序的开发大多使用VisualBasic、VisualFoxPro或者Matlab。因此将导线平差程序开发和GIS软件开发统一到.NET平台之下将会大大增加二者间的交互性。本文以.NET为开发平台,C#为开发语言,开发了导线平差程序。程序中针对平差解算引入并拓展了四舍五入算法,将弧度保留八位有效数字,较好地解决了平差过程中由于数据迭代运算导致的数据丢失问题,保证了程序的正确性和实用性。1算法设计1.1闭合差计算平差程序模型采用近似平差模型[9]。本文所有观测角均以左角为例。该导线略图见图1。设已知起始边方位角为αAB,最末边方位角为αCD,其推算值为α'CD,则方位角闭合差为:fβ=α'CD-αCD=αAB+n'×180+αβ左-αCD(1)式中:β左为导线左转角,n为方位角传算过程中的转角个数。导线全长相对闭合差:K=fS∑D=1D/fS(2)式中:fS导线全长闭合差,∑D为导线全长。图1附和导线示意图1.2角度平差角度平差的目的是消除转角观测误差引起的方位角闭合差,求得各转角的平差值。方法是首先计算方位角闭合差fβ,当fβ<fβ限时,将fβ反号平均分配给各转角,即:vi=-fβnβ^i=βi+vi(i=1,2,…,n)(4)式中:n为转角个数,vi为转角改正数;β^i为转角平差值。1.3坐标平差坐标平差的目的是消除因转角和边长观测误差引起的坐标闭合差fx和fy,求得各点的坐标平差值。方法是用平差角β^和观测边长D先推算各点间坐标增量近似值,进而求得坐标闭合差fx、fy以及导线全长闭合差fs及导线全长相对闭合差K。当K≤K限时,将坐标闭合差按边长成比例反号分配给各坐标增量,求得坐标增量的平差值和各点坐标平差值。47第6期2015年12月矿山测量MINESURVEYINGNo.6Dec.2015中国煤炭期刊网 www.chinacaj.net
2代码设计2.1建立数据文件数据文件以*.txt的格式进行读取和存储。第一行存储总点数(控制点个数和待定点个数之和),从第二行开始存储控制点名、X坐标以及Y坐标。控制点全部存储完毕后,另起一行开始存储测站点号、该测站的观测角以及该测站到下一测站的距离,直到存储完毕。每行的元素之间用分隔符分隔,分隔符必须在英文半角状态下输入,可为空格、逗号、斜杠或反斜杠中任何一个,也可混合搭配。数据文件的数据存储格式(见图2)如下:总点数控制点AX坐标Y坐标控制点BX坐标Y坐标控制点CX坐标Y坐标控制点DX坐标Y坐标测站1观测角距离测站2观测角距离………测站n观测角距离其中:测站n的距离为第n测站到控制点C的距离。观测角存储形式如:β1=114°17'00″,则存储为114.1700。图2附合导线数据编排格式2.2程序逻辑设计平差程序共分为四大模块:读取数据、准备数据、计算数据、输出数据。每个模块对应一个方法或函数。所有方法均存储在导线平差这个类中。此外,还需要角度与弧度相互转换的方法、方位角正反算方法以及四舍五入等方法。从*.txt读取的数据全部采用结构体数组进行存储。点、测站及边的数据分别用与之对应结构体进行存储,存储命令如下:structpoint/*点*/{intpointNum;/*点编号*/stringpointName;/*点名*/doublex;/*x坐标*/doubley;/*y坐标*/}structstation/*测站*/{intstationnum;/*测站编号*/doubledistance;/*距离*/doubleangel;/*观测角*/doublecal_angel;/*平差角*/}structline/*边*/{intlineNum;/*边编号*/intstartNum;/*起始点号*/intendNum;/*终止点号*/doubledistance;/*距离*/doubleangel;/*坐标方位角*/}读取数据方法负责将文档中所有数据准确无误的读入内存并分配给相应变量。准备数据方法负责给每个点赋予点号,反算已知边的坐标方位角,给每条未知边赋予编码、起止点号、距离并且计算坐标方位角。计算数据方法负责计算方位角闭合差并判断是否超限;计算导线全长相对闭合差并判断是否超限;计算各点坐标。输出数据方法则负责将计算的详细过程以及计算结果输出到*.txt文档中。2.3四舍五入算法由于decimal数据类型在数据运算中存在诸多限制,因此程序中大多采用double数据类型进行存储。由于计算机以二进制存储数字,除了少数几个小数可以用二进制准确表达外,其他小数均以二进制无限循环小数进行存储,是近似值。因此在进行大量迭代计算后,会产生数据丢失[10]。对数据进行四舍五入可以有效解决这一问题。实验证明,角度转换到弧度后,弧度保留到八位有效数字可以较好的保存数据精度。四舍五入算法:57第6期张伟伟等:基于C#的导线平差程序设计*2015年12月中国煤炭期刊网 www.chinacaj.net
/*number:需要四舍五入的数n:要保留的小数位数*/publicdoubleRound(doublenumber,doublen){if(number>0){return(long)(number*Math.Pow(10,n)+0.5)/Math.Pow(10,n);}else{return(long)(number*Math.Pow(10,n)-0.5)/Math.Pow(10,n);}}2.4程序验证为了检验程序的可用性,将导线计算输出结果与某工程导线平差计算表[9]进行对比。对比结果见表1。程序输出结果见图3。图3程序计算结果图表1程序计算结果与原表结果对比名称原表结果程序计算结果2号点坐标x=564.563y=1098.802x=564.563y=1098.8033号点坐标x=519.892y=1161.864x=519.893y=1161.8644号点坐标x=534.677y=1250.299x=534.677y=1250.299fβ30"30"fβ限134"134"vβi-6"-6"fx-0.025m-0.023mfy-0.057m-0.059mfs0.062m0.063mK0.00020.00023结论(1)程序计算结果中方位角闭合差、方位角闭合差限差、角度改正数、导线全长相对闭合差均与原表一致;2、3、4号点计算坐标或与原表一致或相差0.001m,表明结果可靠。(2)程序中针对平差解算引入并拓展了四舍五入算法,将弧度保留八位有效数字,较好地解决了平差过程中由于数据迭代运算导致的数据丢失问题。(3)以.NET平台为基础开发的平差程序可以直接与.NET平台下GIS软件的二次开发交互。程序实现了数据录入、平差解算、详细计算过程及计算结果输出等功能。该程序适用于附合导线以及闭合导线的平差计算,对于导线网的数据解算,还有待进一步研究。参考文献:[1]周振.基于.NET和J2EE的GIS系统开发平台的比较[J].煤炭技术,2010(07):215-216.[2]邹自力,郑士潘.矿井加测陀螺定向边构成的方向附合导线平差程序设计[J].东华理工大学学报(自然科学版),1990(02):78-83.[3]何尤刚.导线平差程序设计与应用[C].《测绘通报》测绘科学前沿技术论坛论文集,南京:测绘出版社,2008.[4]侯建国,马俊海,尚国学.三维导线平差程序设计[J].东北测绘,2003(02):20-21.(下转第80页)67第6期矿山测量2015年12月中国煤炭期刊网 www.chinacaj.net
.ExecuteExcel4Macro"REGISTER("""&iGetSys32Path()&"\user32.dll"""&_",""CharPrevA"",""P"","""&FunctionName&""",,0)".ExecuteExcel4Macro"UNREGISTER("&FunctionName&")"EndWithEndSubSubUnregisterUDF()'删除注册自定义函数gsfsCalliUnregUDF("gsfs")EndSub运行注册自定义函数后,插入函数时在函数参数界面中就有了函数及参数的说明等信息,如图1所示。图1注册后函数参数说明2.5使用加载宏存储自定义函数在ExcelVBA中编写好自定义函数后,在Excel中另存为“Excel加载宏(*.xlam)”类型,默认文件夹为“AddIns”,然后单击左上角的Office图标>Ex-cel选项>加载项,选择所保存为加载宏的文件名(如“测绘自定义函数”),点击“确定”。这样就可以在不同工作簿中直接使用自定义函数了。3结语在ExcelVBA平台下开发测绘类自定义函数的确是一个好的选择,不但开发效率高,而且可以直接在工作表公式中使用,以方便数据的输入与输出,同时结合Excel强大的数值计算、统计分析和数据库管理等功能,可有效解决较复杂的测绘数据处理,对提高工作效率具有一定帮助作用。参考文献:[1](美)JohnWalkenbach盖江南,王勇,译.Excel2003高级VBA编程宝典[M].北京:电子工业出版社,2005.[2]赵淑湘.基于MicrosoftExcelVba国家基本比例尺地形图新编号自定义函数的开发[J].矿山测量,2009(05).[3]赵淑湘.平面四参数法坐标转换在EXCELVBA中的实现[J].矿山测量,2014(01).[4]赵淑湘.基于EXCELVBA平台抵偿坐标计算的实现[J].矿山测量,2014(05).[5]赵淑湘.七参数法坐标转换在EXCELVBA中的实现[J].矿山测量,2015(01).[6]赵淑湘.高斯投影计算的实用公式及其实现[J].内蒙古林业调查设计,2015(03).作者简介:赵淑湘(1973-),男,甘肃省泰安县人,副教授。主要从事大地控制测量和测绘程序设计的教学工作。(收稿日期:2015-09-24檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸檸)(上接第76页)[5]张贺,徐茂林,宫雨生.基于VisualBasic的导线平差程序设计[J].辽宁科技大学学报,2014(05):504-508.[6]李智勇.导线近似平差计算[J].全球定位系统,2014(03):97-99.[7]李沛鸿,江红兵,王劲松.基于MatrixVB的测量平差程序设计与实现[J].北京测绘,2012(04):14-18.[8]许克根.基于Autolisp的测量导线计算、绘图程序设计与实现[J].矿山测量,2014(01):85-87.[9]高井祥.数字测图原理与方法(2版)[M].徐州:中国矿业大学出版社,2010.[10]程裕强.编程语言中浮点数精度丢失问题[J].计算机安全,2013(06):59-61.作者简介:张伟伟(1990-),男,硕士,主要从事资源环境遥感与GIS应用研究。(收稿日期:2015-08-17)08第6期矿山测量2015年12月中国煤炭期刊网 www.chinacaj.net