APP下载

基于TFW影像坐标信息在CAD中插入正射影像的方法探讨

2017-05-17詹艳春

城市勘测 2017年2期
关键词:定位点射影批量

詹艳春

(湖南省第一测绘院,湖南 衡阳 421001)

基于TFW影像坐标信息在CAD中插入正射影像的方法探讨

詹艳春*

(湖南省第一测绘院,湖南 衡阳 421001)

数字正射影像的应用越来越广泛和频繁,本文介绍了以LISP设计制作一个批量加载正射影像程序,该程序能自动把正射影像一幅一幅地插入到CAD中,并使之与其真实坐标相对应,大幅提高了工作效率。

TFW;CAD插图;LISP编程

1 引 言

随着科学技术的发展,DOM(数字正射影像图)制作方法日趋成熟,大区域正射影像产品的制作正逐步完成,它以其良好的直观性、现势性以及丰富的信息,正逐渐被各个行业和部门使用,在很多领域应用日益广泛频繁。目前ArcGIS、MapGis、Microstation、Mapinfo等各类地理信息软件都自带了加载DOM功能,而作为现今各行各业最普及最广泛使用的CAD软件却没有自动识别插入影像功能。本文以CAD自带的二次开发程序LISP为例,着重探讨基于TFW影像坐标信息在CAD中插入正射影像的方法。

2 相关知识及原理

数字正射影像图(DOM)是以TIFF(Tagged Image File Format)格式存储(文件后缀为.tif),而TFW(TIFF World File)文件是关于TIFF影像坐标信息的文本文件,ArcInfo、Microstation、AutoCAD等均支持该格式的坐标信息文件。它的结构很简单,是一个包含六行内容的ASCII文本文件,可以用任何一个ASCII文本编辑器来打开。此文件包含相关的DOM文件的空间参数(spatial reference)数据,定义了影像像素坐标与实际地理坐标的仿射关系,基本原理如下:

x′=Ax+By+C

y′=Dx+Ey+F

其中:

x′=像素对应的地理X坐标

y′=像素对应的地理Y坐标

x=像素坐标(像素宽)

y=像素坐标(像素高)

A=X方向上的像素分辨率

D=平移系数

B=旋转系数

E=Y方向上的像素分辨素(总为负值)

C=栅格地图左上角像素中心X坐标

F=栅格地图左上角像素中心Y坐标

图1 各DOM图幅文件夹中包含的影像、坐标等数据格式文件

图2 tfw数据格式

如图1中显示的是DOM的影像文件、坐标信息文件及元数据文件,图2中展示了用记事本打开tfw文件的内容格式,下面对照图2列出对TFW文件中的每一行的说明。

第1行:0.200000 代表A=地图单元中的一个像素在X方向上的X分辨率尺度,即X-Scale(一个像元的大小)

第2行:-0.000000代表 D=平移量。

第3行:0.000000代表B=旋转量。(角度)

第4行:-0.200000代表E=地图单元中的一个像素在Y方向上的Y分辨率尺度的负值,即负的Y-Scale(一个像元的大小)

第5行:428980.000000代表C=图像左上角的X坐标。

第6行:2963020.000000代表F=图像左上角的Y坐标。

3 编程思路

怎样才能准确地根据TFW文件中的坐标信息把正射影像插入到CAD当中呢?我们知道TFW中指定的影像定位点是其左上角坐标(C,F),而CAD中图像的定位点是其左下角坐标(x1,y1) 即【C,y1】,这就需要我们在这两个定位点之间进行转换,这里简单的说明一下,不举例具体的数据,就以变量来说明问题了。我采用的计算方法和设计步骤如下:

(1)确定影像的右下角的坐标:

根据TFW文件中的坐标信息可已知A、D、B、E、C、F的值以及影像左上角坐标:(x1,y2)=(C,F)

根据tiff影像文件可已知影像像元列数x(像素宽)和行数y(像素高)

根据公式求得影像右下角坐标:(x2,y1)

x2=A*x+ B*y+C

y1=D*x+E*y+F

(2)确定影像的两个角的坐标:

需要确定影像的左下角坐标和右上角坐标

影像左下角坐标:(x1,y1) 即【C,y1】

影像右上角坐标:(x2,y2) 即【x2,F】

(3)插入影像,并获取影像在CAD中的坐标;移动缩放影像,使影像的4个角点的坐标与真实坐标相对应。

4 程序源代码

因全部程序较长,程序代码不能全部登出,被省略的程序段是实现一些辅助功能代码。本文只选取了实现主要插图功能的代码如下:

;批量插入正射影像

(defun C:moreTifInCAD( )

(if(findfile(setq filenamePath (getfiled "打开文件" (getvar "dwgprefix") "tfw;tif" 0)))

(progn

(setq filenamePath(vl-filename-directory filenamePath));返回文件路径

;列出给定目录中的所有文件

(setq filepathList(vl-directory-files filenamePath "*.tfw" 1))

(setq filepathList(vl-remove "." filepathList)

filepathList(vl-remove ".." filepathList))

(foreach filename filepathList

(OneTifIntoCAD(strcat filenamePath "\" filename))

)

)

)

)

;根据tfw坐标信息插入指定图像位置

(defun OneTifIntoCAD(openfilePath)

(princ " 加载正射影像")

(setq osMode(getvar "osMode"))

(setvar "osMode" 0)

(if(findfile openfilePath)

(progn

(setq Biao(ReadFile openfilePath))

(setq A(atof(nth 0 Biao))

D(atof(nth 1 Biao))

B(atof(nth 2 Biao))

E(atof(nth 3 Biao))

C(atof(nth 4 Biao));x1

F(atof(nth 5 Biao)));y2

(setq openfilePath(strcat(vl-filename-directory openfilePath)"\"(vl-filename-base openfilePath)".tif"))

(if(findfile openfilePath)

(progn

(command "image" "A" openfilePath (list C F) "1" "0" )

(setq ev(vlax-ename->vla-object(entlast)))

(setq Width(vla-get-Width ev) x Width);col(获取图像像素宽)

(setq Height(vla-get-Height ev) y Height);row(获取图像像素高)

(setq x2 (+(* A x)(* B y) C))

(setq y1 (+(* D x)(* E y) F))

(setq pt1(list C y1))

(command "move" (entlast) "" (list C F) pt1)

(setq pt2(nth 1 (getEV4pt ev)));获取图像在CAD中左上角坐标

(command "scale" (entlast) "" pt1 "R" pt1 pt2 (list C F))

(command "draworder" (entlast) "" "B")

)

)

)

)

(setvar "osMode" osMode)

(princ)

)

;按顺时针获取对象的4个角点坐标值

(defun getEV4pt(ev / p1 p2 pptl)

(vla-getboundingbox ev 'p1 'p2)

(setq p1(vlax-safearray->list p1))

(setq p2(vlax-safearray->list p2))

(setq pptl (list p1 (list(car p1)(cadr p2)) p2 (list(car p2)(cadr p1))))

pptl

)

;读写文件

(defun ReadFile(txtpath)

(setq stra "" Biao '( ))

(setq ff (open txtpath "r"))

(while(setq stra(read-line ff))

(setq Biao(append Biao (list stra)))

)

(close ff)

Biao

)

插入影像程序在CAD中运行结果示例如图3所示:

5 结 语

为了解决CAD批量插入正射影像的问题,作者一直思考探索,参考了相关专业文件资料,通过大量的实验,用AutoCAD软件中内嵌的LISP语言编写了一段小程序解决上述问题,该程序能够把正射影像批量精确插入到CAD中,操作简便实用。虽然目前市场上也有针对CAD插入影像的程序,但各行业都有一些各自特殊的需要和实际问题,解决这些带本行业特殊性的实际问题,还是应该由我们自己生产一线的技术人员来完成。我们应该充分利用对本部门业务和专业知识非常熟悉的优势,自己动手深入开发拓展现有应用软件的功能。

[1] 郭秀娟,徐勇,郑馨等. AutoCAD二次开发实用教程[M]. 北京:机械工业出版社,2014:287.

[2] 郭秀娟,于全通,范小鸥. AutoLISP语言程序设计[M]. 北京:化学工业出版社,2010:218.

[3] 杨贵田. AutoCAD基础与实用教程[M]. 北京:机械工业出版社,2016:144.

Discussion on the Method of DOM Insertion in CAD Based on Coordinate Information of TFW Images

Zhan Yanchun

(The First Surveying and Mapping Institute of Hunan Province,Hengyang 421001,China)

The application of DOM is more and more widely and frequently,this paper introduces the design and implementation of a batch loading DOM program with LISP,the program can automatically insert DOM into CAD,and make it correspond to the true coordinates,greatly improve the work efficiency.

TFW;CAD illustration;LISP programming

1672-8262(2017)02-144-03

P209

B

2016—07—04

詹艳春(1982—),男,工程师,主要从事测绘及地理信息系统应用、数据处理等技术工作。

猜你喜欢

定位点射影批量
常曲率Berwald空间
数独小游戏
批量提交在配置分发中的应用
复杂零件的曲面反求算法及3D打印修复方法研究
汽车大灯定位方案设计研究
三参数射影平坦芬斯勒度量的构造
我的结网秘籍
基于已有控制资料的正射影像自动更新
在数控车床上批量钻铰孔类工件的实践
基于AUTOIT3和VBA的POWERPOINT操作题自动批量批改