韩腾飞1 袁金玉2
1.河北省地质调查院 河北 300000
2.河北省地矿局第三地质大队 河北 300000
摘要:利用程序生成ARCGIS软件需要的已在AUTOCAD中完成地理配准的地理信息图像配准控制文件、依据ARCGIS系统的地理信息图像的TFW格式的配准文件自动在AUTOCAD软件中读入地理信息图像并定位,来完成图像地理定位数据在双软件系统中的共享。
关键词:ARCGIS,AUTOCAD ARX程序,测绘,地理信息图像的定位数据,程序设计
地理信息图像是地理信息工作中重要数据来源,如现在的正射影像图,扫描图件等。但是大多数的地理信息图像没有在文件内没有存储地理定位定向数据。
这就使得我们用ARCGIS使用地理信息图像时,要地理配准定位一次,在AUTOCAD中使用同样的地理信息图像还要重新地理配准定位一次。两次定位,增加了误差,增加的工作量。
为了解决这个问题,我们想通过程序来自动完成同样的图像一次定位,双系统软件能共享使用。
1问题分析
1.1ARCGIS软件中地理信息图像的相关定位数据分析
在ARCGIS软件中调入任一图像,查看其属性,发现系统自动加载未进行地理配准的图像,缺少的缺省坐标是-0.5,0.5,宽高值均为原图像宽高值,旋转角度为0。
用记事本软件打开,存有定方向位的地理信息图像的TFW文件。内容如下:
通过计算不难发现,前四行是平移旋转缩放矩阵的四个旋转缩放参数,后两行是平移旋转缩放矩阵中的两个平移参数。
打开ARCGIS配准控制点文件格式如下:
第一列是源坐标X,第二列是源坐标Y,第三列目标坐标X,第四列是目标坐标Y。
1.2AUTOCAD软件中地理信息图像的相关定位数据分析
查看AUTOCAD ARX文档,可发现,DWG图形文件中存储的插入的光栅图像对象AcDbRasterImage类中,存有图像的大小、比例,原图像位置,方向等定位数据。
2程序设计
2.1程序设计语言及运行环境
在VS2005+AUTCAD ARX2007编程环境内进行,进行编程。使用程序语言为C++语言编程。
连接AUTOCAD2007软件中命令行执行。
2.2 程序设计
2.2.1 AUTOCAD软件读取ARGIS程序已进行地理配准的地理信息图像方位数据
在程序中直接插入在ARCGIS系统下已进行地理配准的地理信息图像文件,读取其同目录同名的TFW格式文件中的平移缩放旋转参数,对本程序插入的光栅图像进行坐标方向比例格式设置。
2.2.2 AUTOCAD软件生成ARGIS程序可以进行地理配准的地理信息图像控制点文件
程序直接按ARCGIS的地理信息图像配准控制点文件格式在图像目录内生成图像配准控制文件。
使用ARCGIS自动调入图像四角点的缺省坐标数据做为图像配准控制文件的源坐标。
使用AUTOCAD配准后的图像四角点坐标数据做为图像配准控制文件的目标坐标。
最后我们进入ARCGIS软件,直接插入图像,调用地理配准命令,使用本程序生成成的配准控制文件,完成同精度图像配准工作。
3 结论
本程序已调试通过,在AUTOCAD中完成已在ARCGIS软件中地理配准的图像插入和设置工作。输出的已在AUTOCAD中完成地理配准的图像的四角配准控制文件,能支持在ARCGIS中调用并完成自动配准。
如果在两个软件中,手工完成两次图像地理配准定位,一是降低了生产精度,二是耽误了工作效率。本程序解决了同一地理信息图像的地理定位数据在ARCGIS和AUTOCAD软件中的共享使用,降低了生产人员的工作强度,提高了生产效率,加强了生产作业精度,受了到了单位领导和同事的好评。
参考文献;
[1] 刘良华,朱东海.,AutoCAD2000 ARX开发技术,北京: 清华大学出版社,2002
源程序主要代码如下:
static void yjyMy2007raptopz(void) //光栅图像生成ARCGIS配准控制点文件
{
// Add your code for command yjyMy2007.raptopz here
…… //打开光栅对象指针
if(pen->isKindOf(AcDbRasterImage::desc()))
{
AcDbRasterImage *pari=(AcDbRasterImage*)pen;
oidr=pari->imageDefId();
acdbOpenObject(pard,oidr,AcDb::kForWrite);
cfnn=pard->sourceFileName();
sprintf(fnn,"%s",wwtoaa(cfnn.GetBuffer(0)));
pard->close();
…… //整理配准文件名
…… //获得图像的参数
if(ptvt.length()>0)
{
FILE *fi=fopen(fnn,"wt");
fprintf(fi,"%0.16f %0.16f %0.16f %0.16f\n",-0.5,0.5-vcxy.y,ptvt[0].x,ptvt[0].y);
fprintf(fi,"%0.16f %0.16f %0.16f %0.16f\n",-0.5,0.5,ptvt[1].x,ptvt[1].y);
fprintf(fi,"%0.16f %0.16f %0.16f %0.16f\n",vcxy.x-0.5,0.5,ptvt[2].x,ptvt[2].y);
fprintf(fi,"%0.16f %0.16f %0.16f %0.16f\n",vcxy.x-0.5,0.5-vcxy.y,ptvt[3].x,ptvt[3].y);
fclose(fi);
acedPrompt(aatoww("\n已生成地理信息图像整理配准文件!\n"));
}
}
pen->close();
}
static void insertmapbytfw() // 插入光栅对象,再依据TFW格式进行设置
{
…… // 获取光栅图象文件名和相应的TFW文件名
;
if(_access(fnn1, 0) != -1) //判断TFW文件是否存在
{
FILE *fi=fopen(fnn1,"rt"); //读取TFW文件数据
intr(fi,&da11);
intr(fi,&da12);
intr(fi,&da21);
intr(fi,&da22);
intr(fi,&xx);
intr(fi,&yy);
fclose(fi);
}
…… // TFW文件不存在退出
AcDbObjectId oidn,oidr;
AcGePoint3d pst;
oidn=regpic(fnn); //注册图像引用
AcDbRasterImage *prai=new AcDbRasterImage();
prai->setImageDefId(oidn);
AcGeVector2d vcxy=prai->imageSize();
AcGeVector3d vcy(0,0,0),vcx(0,0,0);
pst.x=xx+da21*vcxy.y;pst.y=yy+da22*vcxy.y;pst.z=0;
vcx.x=da11*vcxy.x;
vcx.y=da12*vcxy.x;
vcy.x=-da21*vcxy.y;
vcy.y=-da22*vcxy.y;
…… //设置图像格式
prai->close();
}