您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页基于MDL开发语言的DGN数据坐标转换方法

基于MDL开发语言的DGN数据坐标转换方法

来源:意榕旅游网
基于MDL开发语言的DGN数据坐标转换方法

王昌翰;张燕

【摘 要】目前城市规划和建设部门普遍采用城市独立坐标系,而国土资源部门多采用1954北京坐标系或1980西安坐标系,并且随着GPS的广泛应用,以WGS 84为基准的测绘成果也越来越丰富.在实际应用中经常需要统一参考基准,将不同坐标系数据进行整合.因此,探讨各种坐标系的相互转换原理以及如何方便高效地实现数据转换就变得非常必要.本文阐述了采用布尔莎模型,以两个坐标系的公共点坐标建立误差方程,并依据最小二乘法原理解算转换参数和估算转换精度的方法,同时说明了如何利用Micro Station MDL开发语言实现DGN数据的批量坐标转换. 【期刊名称】《测绘技术装备》 【年(卷),期】2007(009)002 【总页数】3页(P27-29) 【关键词】坐标转换;MDL;DGN 【作 者】王昌翰;张燕

【作者单位】重庆市勘测院,重庆,400020;重庆市勘测院,重庆,400020 【正文语种】中 文 【中图分类】P2

在测绘成果的应用过程中,经常会遇到需要对控制点和矢量地形图在不同的坐标系间进行坐标转换,以满足不同行业与部门的业务需求。测绘单位在各个历史时期采用不同的坐标系积累了大量的测绘成果。这些成果主要采用的坐标系有1954北京

坐标系、1980西安坐标系、城市独立坐标系、工程独立系以及GPS测量采用的WGS-84坐标系等。为综合利用已有测绘成果,充分发挥已有成果的作用,研究坐标系间的坐标转换方法以及方便高效的程序实现具有重要意义。本文阐述了采用布尔沙模型(七参数模型),利用MicroStation MDL开发语言实现DGN矢量数据批量坐标转换的方法。

两个空间直角坐标系的坐标转换普遍采用布尔沙转换模型,布尔沙转换模型也称七参数转换法。设有两个空间直角坐标系O1—X1Y1Z1和O2—X2Y2Z2,这两个坐标系的原点O1和O2不重合,O1在O2—X2Y2Z2中的坐标为△X,△Y,△Z;坐标轴也不平行,对应的三个坐标轴间存在3个微小的旋转角(称为欧拉角),记为εx,εy,εz;两个坐标系的尺度也不一致,O1—X1Y1Z1的尺度为1,则O2—X2Y2Z2的尺度为1+m。称△X,△Y,△Z为平移参数,εx,εy,εz为旋转参数,m为尺度参数,共有七个参数。

设任意点在坐标系O1—X1Y1Z1和O2—X2Y2Z2中的坐标分别为X1,Y1,Z1和X2,Y2,Z2,则布尔沙模型为:

该方程有7个未知参数,3个共公点就可以解算这7个参数。由于公共点存在误差,当公共点多余于3个时,引入坐标改正量Vx,VY,Vz,则有: 则误差方程为: 简化为:V=AX+L

依据最小二乘原理VTPV=最小,求出参数向量X的解,即

一般情况下,设转换的新旧坐标是相互独立的且等权,即P为单位权阵。 对于两个不同的平面坐标系O1—X1Y1和 O2—X2Y2,依据上面的数据模型得出坐标转换的数学表达式为: 其误差方程为:

以二维坐标转换为例,未知参数的单位权中误差为:

n为总观测量,t为未知数个数。

根据误差传播理论得转换后坐标分量中误差: 设 则

程序开发采用MicroStation提供的二次开发语言MDL,MDL使用标准的C程序语言并进行了扩展,使开发者能方便、充分地利用MicroStation的CAD核心功能。MicroStation提供了完善的开发环境,包括对话框、下拉菜单、工具板,命令表、消息列表等图形用户界面的开发工具,应用程序生成等工具。MDL除了可调用用户定义的函数外,还可调用MicroStation的内部函数及存取MicroStation内部变量,可方便地读写和操作DGN文件的每一个要素。

程序设计的基本思路是利用两坐标系的共公点坐标按上面介绍的公式计算转换参数,然后打开DGN源文件,遍历文件的每一个要素,实现逐要素坐标转换,将转换后的要素写入新的DGN文件。下面列出坐标转换程序片段。

(1)对dgn中单元、共享单元、文本、标注、文本结点转换,转换方法是直接计算定位点的偏移量并移动。

c=mdlElement_getType(&(ep->el)); if(c==35||c==2) //cell {

if(c==35)

mdlSharedCell_toNormalCell(&newDP[i],&(ep->el),0); //newDP[ ]数组为全局变量,存放坐标转换后的dgn要素 else

mdlElmdscr_duplicate(&newDP[i],ep);

mdlCell_extract(&org,NULL,NULL,NULL,string,&(newDP[i]->el));

offset=org; userorg=org; offsetPnt(&userorg);

//函数返回偏移量offset,转换后坐标赋到userorg

mdlElement_offset(&(newDP[i]->el),&(newDP[i]->el),&offset);//移动要素 tdp=newDP[i]->h.firstElem; while(tdp!=NULL) {

c=mdlElement_getType(&(tdp->el));

mdlElement_offset(&(tdp->el),&(tdp->el),&offset); tdp=tdp->h.next; } }

else if(c==17){ //Text

mdlElmdscr_duplicate(&newDP[i],ep);

mdlText_extract(&org,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&(newDP[i]->el)); offset=org; userorg=org; offsetPnt(&userorg);

//函数返回偏移量offset,转换后坐标赋到userorg

mdlElement_offset(&(newDP[i]->el),&(newDP[i]->el),&offset); }

else if(c==37){//tag

if(mdlTag_extract(NULL,&org,NULL,NULL,&tvalue,&tagID,NULL,&tSize,&rmx,&tPms,&(ep->el),0)==SUCCESS)

{

offset=org;userorg=org; offsetPnt(&userorg);

//函数返回偏移量offset,转换后坐标赋到userorg strcpy(string,tvalue.val.stringVal);

if(strcspn(string,\"G\")mdlText_create (&out,NULL,string,&userorg,&tSize,NULL,NULL,NULL); mdlElement_getProperties(&lev,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&(ep->el));

mdlElement_getSymbology(&col,NULL,NULL,&(ep->el)); mdlElement_setSymbology(&out,&col,NULL,NULL);

mdlElement_setProperties(&out,&lev,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

mdlElmdscr_new(&newDP[i],NULL,&out); } }

else if(c==7){//text_node

mdlElmdscr_duplicate(&newDP[i],ep); mdlModify_elementDescr

(&newDP[i],0,MODIFY_REQUEST_HEADERS,offElm,NULL,0L); //offElm 为文本及文本结点偏移函数 } else

{i--;continue;}

mdlElmdscr_freeAll(&ep); i++;

(2)对dgn中的线和面进行坐标转换(包括简单线,曲线,弧,椭圆,面,复杂线,复杂面),转换方法是重新计算转换后线/面上所有节点的坐标重新生成新的线/面。其中transLine()函数对简单线要素实现逐节点转换函数。

mdlElement_getProperties(&lev,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&(edP->el));

mdlElement_getSymbology(&col,&w,NULL,&(edP->el)); c=mdlElement_getType(&(edP->el)); if(c==12||c==14)//复杂线、复杂面 {

if(c==14)

mdlComplexChain_createHeader(&out,TRUE,0); else if(c==12)

mdlComplexChain_createHeader(&out,FALSE,0); mdlElement_setSymbology(&out,&col,&w,NULL);

mdlElement_setProperties(&out,&lev,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

mdlElmdscr_new(&newDP[i],NULL,&out); tdp=edP->h.firstElem; while(tdp!=NULL) {

if(mdlElement_getType(&(tdp->el))!=27) //不是B样条曲线

{

transLine(&(tdp->el)); if(ally!=0)

mdlElmdscr_appendElement(newDP[i],&all); else ally=1; }

else{// 如果含B样条曲线 tdp=edP->h.firstElem; while(tdp) {

mdlElmdscr_duplicateSingle(&dp,tdp); dp->el.ehdr.complex=0; transLine(&(dp->el)); mdlElmdscr_freeAll(&dp);

if(mdlElement_getType(&(tdp->el))==27) mdlElmdscr_duplicate(&newDP[i],bspl); else

mdlElmdscr_new(&newDP[i],NULL,&all); i++;

tdp=tdp->h.next; } i--;break; }

tdp=tdp->h.next;

}

i++;mdlElmdscr_freeAll(&edP); }

else{//简单线/面

if(transLine(&(edP->el))==-1){ mdlElmdscr_freeAll(&edP);continue; } else{

if(c==27)//B样条曲线

mdlElmdscr_duplicate(&newDP[i],bspl); else

mdlElmdscr_new(&newDP[i],NULL,&all); } }

ARC/INFO以及GEOGRAPHICS等GIS软件可对当前打开的矢量地形图进行坐标转换,但对大批量地形进行坐标转换时效率较低,本文所介绍的方法方便快捷,在生产中发挥了重要作用。

[1]刘大杰,施一民,过静珺.全球定位系统(GPS)的原理与数据处理.上海:同济大学出版社,2003

[2]郑明祝等编译. MicroStation MDL使用手册(上册)北京:海洋出版社,1993

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务