張小波,陳凱,石吉寶,白曉明,陳軍勝
(成都市勘察測繪研究院,四川 成都 610081)
測繪地理信息采集生產(chǎn)的平臺多基于AutoCAD,早期由于對數(shù)據(jù)要求不高,在生產(chǎn)平臺只進(jìn)行基本的圖形繪制與編輯,隨著地理信息技術(shù)的發(fā)展,在生產(chǎn)環(huán)節(jié)采集編輯的地理信息要素越來越多,生產(chǎn)時往往需要在外業(yè)采集的數(shù)據(jù)上疊加其他數(shù)據(jù)進(jìn)行綜合生產(chǎn)。
生產(chǎn)平臺若能調(diào)用GIS系統(tǒng)的影像及地圖服務(wù),將極大地豐富基礎(chǔ)數(shù)據(jù)來源,為數(shù)據(jù)生產(chǎn)提供便利。Esri官方推出了ArcGIS for AutoCAD插件,其可以使AutoCAD作為ArcGIS Server的客戶端加載地圖服務(wù),并且可以作為GIS數(shù)據(jù)結(jié)構(gòu)編輯器來組織CAD數(shù)據(jù)。其功能雖然強(qiáng)大,但是由于其沿襲專業(yè)GIS軟件的風(fēng)格和體系,更側(cè)重GIS數(shù)據(jù)管理,若用于AutoCAD平臺進(jìn)行生產(chǎn),缺點十分明顯:一是需要手動輸入服務(wù)路徑等相關(guān)參數(shù),對使用人員要求較高;二是需要在本地進(jìn)行投影定義,不利于投影參數(shù)保密;三是不具備自動刷新及緩存機(jī)制,響應(yīng)速度慢。
基于此,我們進(jìn)行了AutoCAD生產(chǎn)平臺與GIS系統(tǒng)交互的研究,使AutoCAD生產(chǎn)平臺能夠直接調(diào)用ArcGIS發(fā)布的服務(wù),雖然功能不及ArcGIS for AutoCAD強(qiáng)大,但是對運行效率和易用性方面進(jìn)行了優(yōu)化,并將關(guān)鍵參數(shù)內(nèi)置,而且內(nèi)建緩存機(jī)制,達(dá)到了比較理想的使用效果。
服務(wù)器端利用ArcGIS Server發(fā)布地圖服務(wù)并進(jìn)行切片處理;在AutoCAD客戶端上開發(fā)插件:根據(jù)當(dāng)前窗口的顯示范圍匹配地圖服務(wù)的比例尺,按切片規(guī)則計算出相應(yīng)的緩存圖片集,將緩存圖片插入后置于底層作為底圖顯示,并進(jìn)行自動刷新檢測,實現(xiàn)實時更新。其基本流程如圖1所示。
圖1 基本流程
雖然通過ArcGIS Server的REST接口以HTTP指令的形式能夠直接獲取指定范圍的電子地圖[1],但是經(jīng)測試這種方式響應(yīng)速度相當(dāng)慢,在本場合不具備實用性,所以需要在客戶端另行開發(fā)。通過實時獲取當(dāng)前范圍和比例,依據(jù)ArcGIS Server的切片規(guī)則計算當(dāng)前比例下需要顯示的緩存圖片,直接從地圖服務(wù)的緩存目錄獲取對應(yīng)的文件,以底圖方式拼接顯示,同時在本地建立緩存機(jī)制,以提高速度。
服務(wù)器端對需要發(fā)布的地圖文檔正常進(jìn)行切片即可[2~4],切片完成后,根據(jù)客戶端調(diào)用方式將切片數(shù)據(jù)設(shè)置HTTP,F(xiàn)TP或者文件共享。
需要注意的是ArcGIS Server 10.1之后發(fā)布地圖服務(wù)必須要對Mxd文檔添加地圖投影文件,用戶在調(diào)用地圖服務(wù)時候很容易獲取到坐標(biāo)系參數(shù),不利于參數(shù)保密,因而在對外發(fā)布地圖服務(wù)通常使用標(biāo)準(zhǔn)3度帶投影。為了保證發(fā)布的地圖數(shù)據(jù)位置正確,能和常用的坐標(biāo)系下數(shù)據(jù)疊合,需要先在常用坐標(biāo)系下進(jìn)行地圖發(fā)布和切片;接著提取發(fā)布數(shù)據(jù)的范圍線,去掉坐標(biāo)信息,在標(biāo)準(zhǔn)3度帶投影下配置mxd文檔,必須保證只有mxd文件帶有坐標(biāo)系信息,范圍線數(shù)據(jù)不能帶有坐標(biāo)系信息;然后使用配置好的mxd數(shù)據(jù)以同樣的參數(shù)(包括起始點、分辨率、切片大小、級別等)在標(biāo)準(zhǔn)3度帶投影下發(fā)布地圖服務(wù),再把常用坐標(biāo)系下的地圖切片數(shù)據(jù)拷貝過來,這樣發(fā)布出來的地圖坐標(biāo)位置就和常用坐標(biāo)系下坐標(biāo)位置一致。
客戶端基本功能是根據(jù)切片配置和當(dāng)前顯示范圍,獲取GIS平臺的地圖服務(wù)作為底圖,其核心是緩存圖片的計算;由于面對一線生產(chǎn)人員,客戶端的易用性與顯示速度非常重要,因此加入了自動刷新檢測與緩存機(jī)制。為了方便與其他功能集成,本次客戶端基本的緩存圖片計算、顯示緩存機(jī)制等采用Visual LISP開發(fā),而自動刷新檢測采用ObjectARX技術(shù)編寫反應(yīng)器回調(diào)LISP函數(shù)。
緩存目錄結(jié)構(gòu)如圖2所示,在_alllayers文件夾以下,是切片設(shè)置的從小到大多個比例尺級別;一個比例尺文件夾下,是切圖的“行”文件夾,命名規(guī)則是R加上16進(jìn)制8位行號,不足補(bǔ)0;每行文件夾下就是該行的所有緩存文件了,命名規(guī)則是C加上16進(jìn)制8位列號,不足補(bǔ)0。
圖2 緩存目錄結(jié)構(gòu)
在緩存目錄的conf.xml文件中,保存了切片的參數(shù),其中涉及計算緩存圖片的關(guān)鍵參數(shù)有切圖原點TileOrigin,圖片的DPI,每張圖片的長度和寬度,各級比例尺及對應(yīng)地圖單位長度。
首先計算當(dāng)前屏幕顯示的比例尺Sins,并與切片參數(shù)中的各級比例尺進(jìn)行比較,匹配最接近的地圖比例尺。
式中:Viewsize為按圖形單位存儲當(dāng)前視口的高度;ScreensizeY為以像素為單位存儲當(dāng)前視口的高度;Dpitch為顯示器點距,根據(jù)顯示效果取 0.1 mm~0.3 mm。
再根據(jù)當(dāng)前坐標(biāo)計算緩存圖片的行列號:
式中:Row,Col為緩存圖片的行列號;x,y為當(dāng)前坐標(biāo);XOrigin,YOrigin為切片原點坐標(biāo);TileRows,TileCols為圖片的長度和寬度;Resolution為當(dāng)前比例尺對應(yīng)的地圖單位長度。
同時計算該緩存圖片的插入點坐標(biāo)Inx、Iny,按AutoCAD的規(guī)則,取圖片的左下角點為插入點,計算公式如下:
Inx=XOrigin+Row×TileRows×Resolution
Iny=YOrigin-(Col+1)×TileCols×Resolution
電子地圖隨屏幕顯示范圍自動刷新的功能在GIS系統(tǒng)中可以通過地圖控件的事件接口直接調(diào)用,但是由于AutoCAD并未直接提供類似功能的接口,因而需要單獨開發(fā)。
基于ObjectARX編寫一個反應(yīng)器[5~6],獲取窗口的中心點坐標(biāo),根據(jù)窗口長寬計算左下及右上角點坐標(biāo)進(jìn)行監(jiān)視,若窗口顯示范圍有變化則觸發(fā)一個事件,運行回調(diào)函數(shù)進(jìn)行緩存圖片更新。
自定義一個派生于ACED庫中AcEdInputPointMonitor類的反應(yīng)器類DBLCTTooltips,通過重寫虛函數(shù)monitorInputPoint方法,以便在引發(fā)回調(diào)事件發(fā)生時對應(yīng)的回調(diào)函數(shù)能夠處理特定的事項。本項目重寫的回調(diào)函數(shù)功能為:當(dāng)光標(biāo)移動、輸入點等事件發(fā)生后,檢測當(dāng)前CAD活動文檔的活動視口中心坐標(biāo)是否移動,若移動了就在CAD命令行輸出當(dāng)前活動視口中心坐標(biāo)、獲得當(dāng)前視口兩個對角點坐標(biāo)、同時執(zhí)行CAD本地命令“myfun”。核心功能代碼如下:
Acad::ErrorStatus DBLCTTooltips::monitorInputPoint (定義略)
{
struct resbuf rb;
acedGetVar("VIEWCTR",&rb);
if ((s_nowpoint.x == -100000)&&(s_nowpoint.y == -100000)){
s_nowpoint.x = rb.resval.rpoint[X];
s_nowpoint.y = rb.resval.rpoint[Y];
}
if (((fabs(rb.resval.rpoint[X] - s_nowpoint.x)) > 0) && ((fabs(rb.resval.rpoint[Y] - s_nowpoint.y)) > 0) ){
s_perpoint.x = s_nowpoint.x;
s_perpoint.y = s_nowpoint.y;
s_nowpoint.x = rb.resval.rpoint[X];
s_nowpoint.y = rb.resval.rpoint[Y];
ads_point ptMin;
ads_point ptMax;
GetViewPortBound(ptMin,ptMax);
//調(diào)用命令
resbuf *rp = acutBuildList(RTSTR,"c:myfun",RTNONE);
acedInvoke(rp,NULL);
}
return (Acad::eOk) ;
}
由于反應(yīng)器優(yōu)先級很高,在AutoCAD中利用鼠標(biāo)中鍵執(zhí)行窗口平移縮放時,一旦窗口變化即進(jìn)行更新,不必等到釋放鼠標(biāo),使用體驗與主流GIS平臺的電子地圖類似。
為了在客戶端實現(xiàn)良好的用戶體驗,對一些細(xì)節(jié)進(jìn)行了相應(yīng)開發(fā)。
顯示控制:AutoCAD 2006以后,在當(dāng)前模型空間的ACAD_SORTENTS數(shù)據(jù)字典中存儲了對象的顯示順序,通過設(shè)置緩存圖片位于底層以確保待編輯圖形始終可見,功能代碼如下:
;ImgObj為圖片對象
(setqedtab (VL-CATCH-ALL-APPLY
'VLA-GETOBJECT
(LIST edict "ACAD_SORTENTS")))
(setqtestvar (vlax-make-safearray vlax-vbobject '(0 . 0)))
(vlax-safearray-fill testvar (list ImgObj))
(vla-movetobottom edtab testvar)
當(dāng)前窗口緩存圖片計算:計算當(dāng)前窗口左下及右上角點對應(yīng)緩存圖片的行列號以后,即可得到待插入圖片的序列,依次插入即可[7~9];窗口刷新后,通過待插入圖片序列與當(dāng)前顯示的序列進(jìn)行比對,只對變化的圖片進(jìn)行刷新;
本地緩存:在本地建立緩存目錄,從服務(wù)器獲取緩存圖片后,在緩存目錄備份,下次再調(diào)用該圖片可直接在本地加載,大大提高速度;
網(wǎng)絡(luò)檢測:網(wǎng)絡(luò)不通時,客戶端直接獲取服務(wù)器的遠(yuǎn)程圖片需要很長時間才會返回出錯信息,在此期間AutoCAD會處于“假死機(jī)”狀態(tài)無法操作,因此程序運行時首先進(jìn)行網(wǎng)絡(luò)檢測,最簡便的方法是獲取一張服務(wù)器特定路徑的問題,若成功則表明網(wǎng)絡(luò)正常,否則有問題直接提示,檢測代碼如下:
(vl-catch-all-error-p
(vl-catch-all-apply
'vla-GetRemoteFile
(listutil "ftp://192.168.10.10/layers/_alllayers/test.png" 'tmp :vlax-true)
)
)
圖3 AutoCAD與GIS系統(tǒng)交互示例
AutoCAD生產(chǎn)平臺中調(diào)用GIS系統(tǒng)的地圖服務(wù),可以方便地實現(xiàn)矢量圖和影像圖等電子地圖的疊加比對分析,廣泛應(yīng)用于中小比例尺地形圖更新、專項調(diào)查、生產(chǎn)質(zhì)檢等方面,取得了良好的效果。
[1] 黃夢龍. 瓦片地圖技術(shù)在桌面端GIS中的應(yīng)用[J]. 地理空間信息,2011(4):149~151.
[2] 郭藝歌,王新云,李學(xué)斌. 基于ArcEngine的CAD圖中GIS柵格影像數(shù)據(jù)的自動處理[J]. 地理空間信息,2012,10(6):89~90,93,3,2.
[3] 蘇旭明,譚建成. WebGIS中瓦片地圖關(guān)鍵技術(shù)研究[J]. 北京測繪,2012(2):9~12.
[4] 張廣春,仲偉政. 基于ArcGIS Engine組件實現(xiàn)瓦片地圖的應(yīng)用[J]. 測繪通報,2015(3):115~116,120.
[5] 施立瑾,張賀忻. 面向?qū)ο蟮腁utoCAD開發(fā)工具ARX Notification機(jī)制及Reactor類的使用[J]. 智能建筑與城市信息,2001(11):59~61.
[6] 趙清清,王建勇. ARX反應(yīng)器智能關(guān)聯(lián)技術(shù)在BIM施工圖中的應(yīng)用[J]. 土木建筑工程信息技術(shù),2013(6):111~114.
[7] 張鵬程. 常用CAD與GIS平臺影像自動配準(zhǔn)方法及實現(xiàn)[J]. 地理空間信息,2010,8(4):28~31.
[8] 徐昌榮,周春波. 在AutoCAD中瀏覽Google衛(wèi)星地圖的方法研究[J]. 測繪通報,2013(1):77~79.
[9] 馮連好,單湛波,陳振宇. 地形圖柵格化批量處理的實現(xiàn)與應(yīng)用[J]. 東北測繪,2012(3):211~212,216.