徐昌榮,周春波
(江西理工大學(xué)建筑與測繪工程學(xué)院,江西贛州 341000)
AutoCAD是一款由Autodesk公司開發(fā)的自動(dòng)計(jì)算機(jī)輔助設(shè)計(jì)軟件,由于其具有功能強(qiáng)大、實(shí)用性強(qiáng)、易二次開發(fā)的特點(diǎn),被廣泛應(yīng)用于建筑、規(guī)劃、制造業(yè)等諸多行業(yè)。用戶可以通過AutoCAD的二次開發(fā)接口開發(fā)出適用于本行業(yè)的專業(yè)軟件,如測繪行業(yè)中廣泛使用的南方CASS軟件,以及建筑行業(yè)中使用的天正軟件均是AutoCAD二次開發(fā)的產(chǎn)物。相比于從底層開發(fā)一個(gè)CAD軟件,利用AutoCAD提供的接口進(jìn)行二次開發(fā)所耗費(fèi)的人力物力都更少,加之AutoCAD強(qiáng)大的功能支撐,這些二次開發(fā)軟件在各自行業(yè)都發(fā)揮著巨大的作用。
Google衛(wèi)星地圖是Google公司提供的一種網(wǎng)絡(luò)地圖服務(wù),這些衛(wèi)星地圖覆蓋全球的各個(gè)角落,在世界諸多城市都可以達(dá)到1 m以內(nèi)的精度[1],且用戶可以在Google Map或Google Earth中瀏覽這些衛(wèi)星地圖。同時(shí),Google允許用戶使用它的網(wǎng)絡(luò)地圖服務(wù),用戶可以通過其提供的API在自己的網(wǎng)頁或應(yīng)用程序中嵌入Google Map,當(dāng)每天的請求次數(shù)少于50 000次時(shí),這種服務(wù)是免費(fèi)的。這能夠滿足大部分用戶的一般性需求。
在進(jìn)行城市規(guī)劃或道路設(shè)計(jì)等方面的工作時(shí),一般需要事先了解該區(qū)域的道路、植被、地形等現(xiàn)狀情況,而Google衛(wèi)星地圖平均每半年更新一次,具有較好的現(xiàn)勢性,可完成這部分工作。將Google衛(wèi)星地圖等網(wǎng)絡(luò)地圖集成于桌面軟件中的研究已有很多,楊帆等人將Google Map集成于桌面軟件,用于對敏感目標(biāo)的追蹤[2];李木梓等以Google Map為例實(shí)現(xiàn)了將網(wǎng)絡(luò)地圖作為自定義圖層的形式集成到GIS桌面系統(tǒng)[3]。而AutoCAD軟件是城市規(guī)劃或道路設(shè)計(jì)廣泛應(yīng)用的設(shè)計(jì)軟件,若能在AutoCAD中實(shí)現(xiàn)Google衛(wèi)星地圖的瀏覽,設(shè)計(jì)人員勢必能快速地了解設(shè)計(jì)區(qū)域,提高工作效率?;诖耍疚膶υ贏utoCAD中瀏覽Google衛(wèi)星地圖的方法進(jìn)行了研究,并通過AutoCAD二次開發(fā)與Google Map二次開發(fā)技術(shù)實(shí)現(xiàn)了這一功能。
AutoCAD為開發(fā)者提供了多種應(yīng)用程序接口,其中.NET API因其開發(fā)簡單及效率高的優(yōu)勢而被廣泛使用。AutoCAD從2006年開始增加了.NET API,該API提供了一系列的托管外包類,是AutoCAD較為理想的二次開發(fā)方式。開發(fā)人員可在.NET框架下使用.NET支持的任何編程語言進(jìn)行開發(fā),本文采用C#語言進(jìn)行AutoCAD的二次開發(fā)。
開發(fā)人員可以通過兩種方式進(jìn)行AutoCAD.NET的二次開發(fā):一種是通過Visual Studio 2010的AutoCAD 2011 Plug-in模板建立解決方案進(jìn)行開發(fā),這種方式不需要開發(fā)人員手動(dòng)引用AutoCAD組件庫;另一種是在Visual Studio 2010中建立一個(gè)解決方案,手動(dòng)添加需要在開發(fā)中用到的組件庫,如Ac-DbMgd.dll、AcMgd.dll等,并將 AutoCAD 的執(zhí)行文件添加到解決方案中且設(shè)置為啟動(dòng)項(xiàng),可實(shí)現(xiàn)調(diào)試。
Google為開發(fā)者提供了各種類型的API來實(shí)現(xiàn)對Google Map的二次開發(fā),這些API處于不斷更新中,Google Maps JavaScript API V3目前是JavaScript API的最新版本。對于之前的版本,開發(fā)者需要申請API Key才能獲得Google Map的使用權(quán)限,而該版本的API用戶無需申請API Key即可使用。用戶在網(wǎng)頁中嵌入以下代碼便能使用Google Maps JavaScript API V3開發(fā)自己的應(yīng)用程序
Google衛(wèi)星地圖提供0~17共18個(gè)縮放級別的衛(wèi)星地圖,用戶在初始化地圖時(shí)通過設(shè)置地圖選項(xiàng)(Map Options)來設(shè)置初始縮放級別、初始位置及其他內(nèi)容。而對地圖的其他設(shè)置可參照Google Maps JavaScript API V3的參考文檔,里面提供了各個(gè)對象的屬性、方法和事件等內(nèi)容,可幫助用戶開發(fā)自己的應(yīng)用程序。另外,用戶除了使用API中提供的控件外還可以使用自定義控件。
本文利用上述的AutoCAD.NET API和Google Maps JavaScript API對AutoCAD進(jìn)行二次開發(fā),主要實(shí)現(xiàn)以下兩個(gè)功能:
1)將Google衛(wèi)星地圖嵌入到窗體應(yīng)用程序中,使用戶能在窗體中實(shí)現(xiàn)對Google衛(wèi)星地圖的動(dòng)態(tài)瀏覽,以及平移、縮放、查詢位置、量距等基本的地圖操作。
2)在AutoCAD中能自由調(diào)用該窗體應(yīng)用程序,并且兩者能實(shí)現(xiàn)一些簡單的交互,如將當(dāng)前顯示的衛(wèi)星地圖插入到AutoCAD中的指定區(qū)域。
實(shí)現(xiàn)上述兩個(gè)功能可分3個(gè)步驟:首先,在Auto-CAD中調(diào)用窗體程序比較容易實(shí)現(xiàn),利用AutoCAD.NET API的模態(tài)對話框可以實(shí)現(xiàn)這一功能;其次,將Google衛(wèi)星地圖嵌入到窗體應(yīng)用程序雖比較復(fù)雜,但可以通過創(chuàng)建一個(gè)靜態(tài)的HTML頁面來實(shí)現(xiàn),該頁面通過JavaScript腳本語言載入Google衛(wèi)星地圖;最后在窗體中創(chuàng)建一個(gè)WebBrowser控件,用于瀏覽該頁面,既可實(shí)現(xiàn)與在Web瀏覽器上相同的效果[2],又可通過腳本語言來控制對地圖的操作。由此可知,利用C#語言和JavaScript腳本語言編程基本可以實(shí)現(xiàn)在AutoCAD中瀏覽Google衛(wèi)星地圖的功能。
(1)HTML頁面與窗體應(yīng)用程序交互
如程序中實(shí)現(xiàn)查詢經(jīng)緯度或地名來搜索地圖的功能,采用在C#窗體程序中調(diào)用JavaScript中的方法實(shí)現(xiàn),在Form1類之間添加兩段代碼
以上兩段代碼的目的是為程序集請求權(quán)限,并使得COM組件對應(yīng)用程序可見,這樣才能在C#窗體程序中調(diào)用JavaScript中的方法。
如要實(shí)現(xiàn)一個(gè)搜索目標(biāo)位置的功能。首先在HTML中編寫一個(gè)方法,實(shí)現(xiàn)用戶輸入經(jīng)緯度或地名,并將地圖顯示到該位置;然后在窗體的事件方法中通過以下代碼來調(diào)用腳本中的方法
這樣就實(shí)現(xiàn)了在窗體類中調(diào)用腳本函數(shù)的方法。如圖1所示,搜索地名“廣州”,當(dāng)前地圖顯示為廣州市區(qū)。
圖1 搜索目標(biāo)(地圖顯示區(qū)域?yàn)閺V州市城區(qū))
由于Google Maps JavaScript API V3中并未提供計(jì)算兩點(diǎn)之間的距離的方法,因此需要在Google Map中自定義一個(gè)量距控件,實(shí)現(xiàn)測量折線距離的功能。雖然 JavaScript可以描述的數(shù)值范圍很廣,但事實(shí)證明,用JavaScript進(jìn)行高精度計(jì)算會(huì)導(dǎo)致瀏覽器異常甚至崩潰[4]。為了保證程序的穩(wěn)定性,筆者在Form1類中編寫了一個(gè)方法,以實(shí)現(xiàn)由兩點(diǎn)的經(jīng)緯度求取距離的功能,然后在JavaScript中調(diào)用該方法,顯示測量的距離。下面這段代碼演示了如何在JavaScript中調(diào)用窗體中定義的方法
在Form1類中定義一個(gè)根據(jù)兩點(diǎn)經(jīng)緯度計(jì)算兩點(diǎn)大地線長的方法,該方法采用白塞爾法進(jìn)行大地主題反算,橢球參數(shù)采用WGS-84橢球參數(shù),精度可靠。
(2)AutoCAD與C#窗體交互
該程序中有一個(gè)功能是將當(dāng)前顯示的衛(wèi)星地圖插入到AutoCAD的當(dāng)前圖形界面,并利用程序?qū)Ξ?dāng)前顯示的衛(wèi)星地圖進(jìn)行截圖保存,然后將該位置的圖像插入到AutoCAD圖面中。
在AutoCAD中實(shí)現(xiàn)插入光柵圖像的功能比較復(fù)雜,其具體步驟為:
1)創(chuàng)建圖像定義對象(RasterImageDef類型對象)。
2)創(chuàng)建圖像實(shí)體對象(RasterImage類型對象)。
3)將以上兩者關(guān)聯(lián)起來,實(shí)現(xiàn)顯示柵格圖像的功能。
4)對柵格圖像定位定向,通過RasterImage類型的Orientation屬性實(shí)現(xiàn)柵格地圖的定位定向[5]。
首先編譯程序,打開AutoCAD,在命令行輸入命令“netload”,加載編譯好的程序集,輸入命令“showmap”,彈出瀏覽Google Map的主界面(如圖2所示)。
圖2 主界面(標(biāo)注位置為江西理工大學(xué)建筑與測繪工程學(xué)院)
在主界面中可對Google衛(wèi)星地圖進(jìn)行一些地圖的基本操作,如縮放、漫游、量距、添加標(biāo)記等。用戶可通過搜索目標(biāo)按鈕輸入經(jīng)緯度或地名來進(jìn)行地圖的搜索,也可將當(dāng)前衛(wèi)星圖片保存為本地磁盤中,或通過“導(dǎo)入AutoCAD”按鈕將圖片插入到AutoCAD的當(dāng)前繪圖窗口中(如圖3所示)。
本文實(shí)現(xiàn)了在AutoCAD中瀏覽Google衛(wèi)星地圖的功能,該程序界面整潔、功能實(shí)用,可作為規(guī)劃設(shè)計(jì)人員的輔助工具。設(shè)計(jì)人員通過對規(guī)劃區(qū)域Google衛(wèi)星地圖的瀏覽,可以充分考慮土地的合理利用與節(jié)約等因素,通過對周圍環(huán)境的查看可以較為方便地分析規(guī)劃部分與整體環(huán)境的協(xié)調(diào)性[6]。該程序已應(yīng)用于筆者所在學(xué)校城市規(guī)劃專業(yè)的城市規(guī)劃課程設(shè)計(jì),獲得了較好的評價(jià)。
圖3 衛(wèi)星圖片插入AutoCAD中
本文通過AutoCAD二次開發(fā)與Google Map二次開發(fā)技術(shù)實(shí)現(xiàn)了在AutoCAD中瀏覽Google衛(wèi)星地圖的功能,但仍然存在需要改進(jìn)的地方。如何在AutoCAD與Google地圖之間實(shí)現(xiàn)更多的交互和更多實(shí)用的功能,如何實(shí)現(xiàn)與數(shù)據(jù)庫的交互等,都是今后研究的重點(diǎn)。
[1] 《Google API大全》編委會(huì).Google API大全:編程·開發(fā)·實(shí)例[M].北京:電子工業(yè)出版社,2009.
[2] 楊帆,張彩麗.桌面應(yīng)用程序嵌入Google Map及其交互方法研究[J].陜西科技大學(xué)學(xué)報(bào),2010,28(5):80-84.
[3] 李木梓,徐柱,黃澤純,等.網(wǎng)絡(luò)地圖集成于GIS桌面系統(tǒng)的方法及試驗(yàn)[J].地球信息科學(xué)學(xué)報(bào),2011,13(1):95-101.
[4] 馮曼菲.精通Ajax——基礎(chǔ)概念、核心技術(shù)與典型案例[M].北京:人民郵電出版社,2008.
[5] 龔有亮,翟翊,曹歆宏,等.AutoCAD中柵格圖像定位研究[J].測繪通報(bào),2011(5):13-15.
[6] 張瑞.Google Earth在道路及規(guī)劃設(shè)計(jì)中的應(yīng)用[D].武漢:華中科技大學(xué),2007.