徐昌榮,周春波
(江西理工大學建筑與測繪工程學院,江西贛州 341000)
AutoCAD是一款由Autodesk公司開發的自動計算機輔助設計軟件,由于其具有功能強大、實用性強、易二次開發的特點,被廣泛應用于建筑、規劃、制造業等諸多行業。用戶可以通過AutoCAD的二次開發接口開發出適用于本行業的專業軟件,如測繪行業中廣泛使用的南方CASS軟件,以及建筑行業中使用的天正軟件均是AutoCAD二次開發的產物。相比于從底層開發一個CAD軟件,利用AutoCAD提供的接口進行二次開發所耗費的人力物力都更少,加之AutoCAD強大的功能支撐,這些二次開發軟件在各自行業都發揮著巨大的作用。
Google衛星地圖是Google公司提供的一種網絡地圖服務,這些衛星地圖覆蓋全球的各個角落,在世界諸多城市都可以達到1 m以內的精度[1],且用戶可以在Google Map或Google Earth中瀏覽這些衛星地圖。同時,Google允許用戶使用它的網絡地圖服務,用戶可以通過其提供的API在自己的網頁或應用程序中嵌入Google Map,當每天的請求次數少于50 000次時,這種服務是免費的。這能夠滿足大部分用戶的一般性需求。
在進行城市規劃或道路設計等方面的工作時,一般需要事先了解該區域的道路、植被、地形等現狀情況,而Google衛星地圖平均每半年更新一次,具有較好的現勢性,可完成這部分工作。將Google衛星地圖等網絡地圖集成于桌面軟件中的研究已有很多,楊帆等人將Google Map集成于桌面軟件,用于對敏感目標的追蹤[2];李木梓等以Google Map為例實現了將網絡地圖作為自定義圖層的形式集成到GIS桌面系統[3]。而AutoCAD軟件是城市規劃或道路設計廣泛應用的設計軟件,若能在AutoCAD中實現Google衛星地圖的瀏覽,設計人員勢必能快速地了解設計區域,提高工作效率?;诖?,本文對在AutoCAD中瀏覽Google衛星地圖的方法進行了研究,并通過AutoCAD二次開發與Google Map二次開發技術實現了這一功能。
AutoCAD為開發者提供了多種應用程序接口,其中.NET API因其開發簡單及效率高的優勢而被廣泛使用。AutoCAD從2006年開始增加了.NET API,該API提供了一系列的托管外包類,是AutoCAD較為理想的二次開發方式。開發人員可在.NET框架下使用.NET支持的任何編程語言進行開發,本文采用C#語言進行AutoCAD的二次開發。
開發人員可以通過兩種方式進行AutoCAD.NET的二次開發:一種是通過Visual Studio 2010的AutoCAD 2011 Plug-in模板建立解決方案進行開發,這種方式不需要開發人員手動引用AutoCAD組件庫;另一種是在Visual Studio 2010中建立一個解決方案,手動添加需要在開發中用到的組件庫,如Ac-DbMgd.dll、AcMgd.dll等,并將 AutoCAD 的執行文件添加到解決方案中且設置為啟動項,可實現調試。
Google為開發者提供了各種類型的API來實現對Google Map的二次開發,這些API處于不斷更新中,Google Maps JavaScript API V3目前是JavaScript API的最新版本。對于之前的版本,開發者需要申請API Key才能獲得Google Map的使用權限,而該版本的API用戶無需申請API Key即可使用。用戶在網頁中嵌入以下代碼便能使用Google Maps JavaScript API V3開發自己的應用程序

Google衛星地圖提供0~17共18個縮放級別的衛星地圖,用戶在初始化地圖時通過設置地圖選項(Map Options)來設置初始縮放級別、初始位置及其他內容。而對地圖的其他設置可參照Google Maps JavaScript API V3的參考文檔,里面提供了各個對象的屬性、方法和事件等內容,可幫助用戶開發自己的應用程序。另外,用戶除了使用API中提供的控件外還可以使用自定義控件。
本文利用上述的AutoCAD.NET API和Google Maps JavaScript API對AutoCAD進行二次開發,主要實現以下兩個功能:
1)將Google衛星地圖嵌入到窗體應用程序中,使用戶能在窗體中實現對Google衛星地圖的動態瀏覽,以及平移、縮放、查詢位置、量距等基本的地圖操作。
2)在AutoCAD中能自由調用該窗體應用程序,并且兩者能實現一些簡單的交互,如將當前顯示的衛星地圖插入到AutoCAD中的指定區域。
實現上述兩個功能可分3個步驟:首先,在Auto-CAD中調用窗體程序比較容易實現,利用AutoCAD.NET API的模態對話框可以實現這一功能;其次,將Google衛星地圖嵌入到窗體應用程序雖比較復雜,但可以通過創建一個靜態的HTML頁面來實現,該頁面通過JavaScript腳本語言載入Google衛星地圖;最后在窗體中創建一個WebBrowser控件,用于瀏覽該頁面,既可實現與在Web瀏覽器上相同的效果[2],又可通過腳本語言來控制對地圖的操作。由此可知,利用C#語言和JavaScript腳本語言編程基本可以實現在AutoCAD中瀏覽Google衛星地圖的功能。
(1)HTML頁面與窗體應用程序交互
如程序中實現查詢經緯度或地名來搜索地圖的功能,采用在C#窗體程序中調用JavaScript中的方法實現,在Form1類之間添加兩段代碼


以上兩段代碼的目的是為程序集請求權限,并使得COM組件對應用程序可見,這樣才能在C#窗體程序中調用JavaScript中的方法。
如要實現一個搜索目標位置的功能。首先在HTML中編寫一個方法,實現用戶輸入經緯度或地名,并將地圖顯示到該位置;然后在窗體的事件方法中通過以下代碼來調用腳本中的方法

這樣就實現了在窗體類中調用腳本函數的方法。如圖1所示,搜索地名“廣州”,當前地圖顯示為廣州市區。

圖1 搜索目標(地圖顯示區域為廣州市城區)
由于Google Maps JavaScript API V3中并未提供計算兩點之間的距離的方法,因此需要在Google Map中自定義一個量距控件,實現測量折線距離的功能。雖然 JavaScript可以描述的數值范圍很廣,但事實證明,用JavaScript進行高精度計算會導致瀏覽器異常甚至崩潰[4]。為了保證程序的穩定性,筆者在Form1類中編寫了一個方法,以實現由兩點的經緯度求取距離的功能,然后在JavaScript中調用該方法,顯示測量的距離。下面這段代碼演示了如何在JavaScript中調用窗體中定義的方法

在Form1類中定義一個根據兩點經緯度計算兩點大地線長的方法,該方法采用白塞爾法進行大地主題反算,橢球參數采用WGS-84橢球參數,精度可靠。
(2)AutoCAD與C#窗體交互
該程序中有一個功能是將當前顯示的衛星地圖插入到AutoCAD的當前圖形界面,并利用程序對當前顯示的衛星地圖進行截圖保存,然后將該位置的圖像插入到AutoCAD圖面中。
在AutoCAD中實現插入光柵圖像的功能比較復雜,其具體步驟為:
1)創建圖像定義對象(RasterImageDef類型對象)。
2)創建圖像實體對象(RasterImage類型對象)。
3)將以上兩者關聯起來,實現顯示柵格圖像的功能。
4)對柵格圖像定位定向,通過RasterImage類型的Orientation屬性實現柵格地圖的定位定向[5]。
首先編譯程序,打開AutoCAD,在命令行輸入命令“netload”,加載編譯好的程序集,輸入命令“showmap”,彈出瀏覽Google Map的主界面(如圖2所示)。

圖2 主界面(標注位置為江西理工大學建筑與測繪工程學院)
在主界面中可對Google衛星地圖進行一些地圖的基本操作,如縮放、漫游、量距、添加標記等。用戶可通過搜索目標按鈕輸入經緯度或地名來進行地圖的搜索,也可將當前衛星圖片保存為本地磁盤中,或通過“導入AutoCAD”按鈕將圖片插入到AutoCAD的當前繪圖窗口中(如圖3所示)。
本文實現了在AutoCAD中瀏覽Google衛星地圖的功能,該程序界面整潔、功能實用,可作為規劃設計人員的輔助工具。設計人員通過對規劃區域Google衛星地圖的瀏覽,可以充分考慮土地的合理利用與節約等因素,通過對周圍環境的查看可以較為方便地分析規劃部分與整體環境的協調性[6]。該程序已應用于筆者所在學校城市規劃專業的城市規劃課程設計,獲得了較好的評價。

圖3 衛星圖片插入AutoCAD中
本文通過AutoCAD二次開發與Google Map二次開發技術實現了在AutoCAD中瀏覽Google衛星地圖的功能,但仍然存在需要改進的地方。如何在AutoCAD與Google地圖之間實現更多的交互和更多實用的功能,如何實現與數據庫的交互等,都是今后研究的重點。
[1] 《Google API大全》編委會.Google API大全:編程·開發·實例[M].北京:電子工業出版社,2009.
[2] 楊帆,張彩麗.桌面應用程序嵌入Google Map及其交互方法研究[J].陜西科技大學學報,2010,28(5):80-84.
[3] 李木梓,徐柱,黃澤純,等.網絡地圖集成于GIS桌面系統的方法及試驗[J].地球信息科學學報,2011,13(1):95-101.
[4] 馮曼菲.精通Ajax——基礎概念、核心技術與典型案例[M].北京:人民郵電出版社,2008.
[5] 龔有亮,翟翊,曹歆宏,等.AutoCAD中柵格圖像定位研究[J].測繪通報,2011(5):13-15.
[6] 張瑞.Google Earth在道路及規劃設計中的應用[D].武漢:華中科技大學,2007.