詹艷春
(湖南省第一測(cè)繪院,湖南 衡陽 421001)
基于TFW影像坐標(biāo)信息在CAD中插入正射影像的方法探討
詹艷春*
(湖南省第一測(cè)繪院,湖南 衡陽 421001)
數(shù)字正射影像的應(yīng)用越來越廣泛和頻繁,本文介紹了以LISP設(shè)計(jì)制作一個(gè)批量加載正射影像程序,該程序能自動(dòng)把正射影像一幅一幅地插入到CAD中,并使之與其真實(shí)坐標(biāo)相對(duì)應(yīng),大幅提高了工作效率。
TFW;CAD插圖;LISP編程
隨著科學(xué)技術(shù)的發(fā)展,DOM(數(shù)字正射影像圖)制作方法日趨成熟,大區(qū)域正射影像產(chǎn)品的制作正逐步完成,它以其良好的直觀性、現(xiàn)勢(shì)性以及豐富的信息,正逐漸被各個(gè)行業(yè)和部門使用,在很多領(lǐng)域應(yīng)用日益廣泛頻繁。目前ArcGIS、MapGis、Microstation、Mapinfo等各類地理信息軟件都自帶了加載DOM功能,而作為現(xiàn)今各行各業(yè)最普及最廣泛使用的CAD軟件卻沒有自動(dòng)識(shí)別插入影像功能。本文以CAD自帶的二次開發(fā)程序LISP為例,著重探討基于TFW影像坐標(biāo)信息在CAD中插入正射影像的方法。
數(shù)字正射影像圖(DOM)是以TIFF(Tagged Image File Format)格式存儲(chǔ)(文件后綴為.tif),而TFW(TIFF World File)文件是關(guān)于TIFF影像坐標(biāo)信息的文本文件,ArcInfo、Microstation、AutoCAD等均支持該格式的坐標(biāo)信息文件。它的結(jié)構(gòu)很簡單,是一個(gè)包含六行內(nèi)容的ASCII文本文件,可以用任何一個(gè)ASCII文本編輯器來打開。此文件包含相關(guān)的DOM文件的空間參數(shù)(spatial reference)數(shù)據(jù),定義了影像像素坐標(biāo)與實(shí)際地理坐標(biāo)的仿射關(guān)系,基本原理如下:
x′=Ax+By+C
y′=Dx+Ey+F
其中:
x′=像素對(duì)應(yīng)的地理X坐標(biāo)
y′=像素對(duì)應(yīng)的地理Y坐標(biāo)
x=像素坐標(biāo)(像素寬)
y=像素坐標(biāo)(像素高)
A=X方向上的像素分辨率
D=平移系數(shù)
B=旋轉(zhuǎn)系數(shù)
E=Y方向上的像素分辨素(總為負(fù)值)
C=柵格地圖左上角像素中心X坐標(biāo)
F=柵格地圖左上角像素中心Y坐標(biāo)
圖1 各DOM圖幅文件夾中包含的影像、坐標(biāo)等數(shù)據(jù)格式文件
圖2 tfw數(shù)據(jù)格式
如圖1中顯示的是DOM的影像文件、坐標(biāo)信息文件及元數(shù)據(jù)文件,圖2中展示了用記事本打開tfw文件的內(nèi)容格式,下面對(duì)照?qǐng)D2列出對(duì)TFW文件中的每一行的說明。
第1行:0.200000 代表A=地圖單元中的一個(gè)像素在X方向上的X分辨率尺度,即X-Scale(一個(gè)像元的大小)
第2行:-0.000000代表 D=平移量。
第3行:0.000000代表B=旋轉(zhuǎn)量。(角度)
第4行:-0.200000代表E=地圖單元中的一個(gè)像素在Y方向上的Y分辨率尺度的負(fù)值,即負(fù)的Y-Scale(一個(gè)像元的大小)
第5行:428980.000000代表C=圖像左上角的X坐標(biāo)。
第6行:2963020.000000代表F=圖像左上角的Y坐標(biāo)。
怎樣才能準(zhǔn)確地根據(jù)TFW文件中的坐標(biāo)信息把正射影像插入到CAD當(dāng)中呢?我們知道TFW中指定的影像定位點(diǎn)是其左上角坐標(biāo)(C,F(xiàn)),而CAD中圖像的定位點(diǎn)是其左下角坐標(biāo)(x1,y1) 即【C,y1】,這就需要我們?cè)谶@兩個(gè)定位點(diǎn)之間進(jìn)行轉(zhuǎn)換,這里簡單的說明一下,不舉例具體的數(shù)據(jù),就以變量來說明問題了。我采用的計(jì)算方法和設(shè)計(jì)步驟如下:
(1)確定影像的右下角的坐標(biāo):
根據(jù)TFW文件中的坐標(biāo)信息可已知A、D、B、E、C、F的值以及影像左上角坐標(biāo):(x1,y2)=(C,F(xiàn))
根據(jù)tiff影像文件可已知影像像元列數(shù)x(像素寬)和行數(shù)y(像素高)
根據(jù)公式求得影像右下角坐標(biāo):(x2,y1)
x2=A*x+ B*y+C
y1=D*x+E*y+F
(2)確定影像的兩個(gè)角的坐標(biāo):
需要確定影像的左下角坐標(biāo)和右上角坐標(biāo)
影像左下角坐標(biāo):(x1,y1) 即【C,y1】
影像右上角坐標(biāo):(x2,y2) 即【x2,F(xiàn)】
(3)插入影像,并獲取影像在CAD中的坐標(biāo);移動(dòng)縮放影像,使影像的4個(gè)角點(diǎn)的坐標(biāo)與真實(shí)坐標(biāo)相對(duì)應(yīng)。
因全部程序較長,程序代碼不能全部登出,被省略的程序段是實(shí)現(xiàn)一些輔助功能代碼。本文只選取了實(shí)現(xiàn)主要插圖功能的代碼如下:
;批量插入正射影像
(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))
)
)
)
)
;根據(jù)tfw坐標(biāo)信息插入指定圖像位置
(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中左上角坐標(biāo)
(command "scale" (entlast) "" pt1 "R" pt1 pt2 (list C F))
(command "draworder" (entlast) "" "B")
)
)
)
)
(setvar "osMode" osMode)
(princ)
)
;按順時(shí)針獲取對(duì)象的4個(gè)角點(diǎn)坐標(biāo)值
(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中運(yùn)行結(jié)果示例如圖3所示:
為了解決CAD批量插入正射影像的問題,作者一直思考探索,參考了相關(guān)專業(yè)文件資料,通過大量的實(shí)驗(yàn),用AutoCAD軟件中內(nèi)嵌的LISP語言編寫了一段小程序解決上述問題,該程序能夠把正射影像批量精確插入到CAD中,操作簡便實(shí)用。雖然目前市場上也有針對(duì)CAD插入影像的程序,但各行業(yè)都有一些各自特殊的需要和實(shí)際問題,解決這些帶本行業(yè)特殊性的實(shí)際問題,還是應(yīng)該由我們自己生產(chǎn)一線的技術(shù)人員來完成。我們應(yīng)該充分利用對(duì)本部門業(yè)務(wù)和專業(yè)知識(shí)非常熟悉的優(yōu)勢(shì),自己動(dòng)手深入開發(fā)拓展現(xiàn)有應(yīng)用軟件的功能。
[1] 郭秀娟,徐勇,鄭馨等. AutoCAD二次開發(fā)實(shí)用教程[M]. 北京:機(jī)械工業(yè)出版社,2014:287.
[2] 郭秀娟,于全通,范小鷗. AutoLISP語言程序設(shè)計(jì)[M]. 北京:化學(xué)工業(yè)出版社,2010:218.
[3] 楊貴田. AutoCAD基礎(chǔ)與實(shí)用教程[M]. 北京:機(jī)械工業(yè)出版社,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—),男,工程師,主要從事測(cè)繪及地理信息系統(tǒng)應(yīng)用、數(shù)據(jù)處理等技術(shù)工作。