GIS系統的一項重要功能是出圖,而出圖功能的最終解決方案涉及排版。而GIS中的排版絕非純粹的體力活,事實上實用排版系統所追求的終極目標是互動的簡單,資訊的豐富,定製的靈活性。這三項指標是對GIS出圖系統評價的最好依據。
在ArcGIS案頭系統中出圖部分完全依靠Element來控製版式的布局,通過不同類型的Element來提供不同的成圖要素。Element主要分為兩類Graphic Element和Frame Element,具體區別可以參考ESRI的開發協助。本文所關注的是通過底層來定製一個Element,以提高Element在系統定製中的靈活性。
在開始實現自訂Element之前,回顧一下Layout下Element的特點。Layout下我們預設會得到一個包含Map的Element,為了豐富地圖,我們需要添加指北針,比例尺,和圖例,這三類一般都是通過嚮導產生,屬於MapSurround Element.嚮導的優點是快捷和定製,但是和優點一樣突出的是缺點,靈活性不夠,最主要的還是定製出來的樣式非常難看,事實上在國內一般是不會用這些嚮導產生Element,最常用的反而是通過若干普通的Graphic Element組合後產生,例例。
自己定義Graphic Element最後都會把若干瑣碎的Element組合起來,得到最後的GroupElement來控制,由於GroupElement是單一的Element,方便控制。那為什麼自己還要從底層自己再寫一個Element呢?原因是這樣的,GroupElement雖然很容易控制但是無法修改GroupElement內部的元素,當然很多人說可以打散GroupElement後修改,然後再取到需要的Element修改,改完後再組合。很多人其實就是這麼做的,但是很遺憾並不完美,組合前如果通過Name來標識Element,那打散後這些Name都不在了,你必須通過其他的手段來標識Element,使得組合前和打散後仍然能夠通過標識得到特定的Element來控制。這隻是其中一個問題,另一個問題之一,就是我遇到的,如果地圖上需要加上表格來豐富資訊,怎麼處理。一般對ArcGIS比較熟悉的使用者會告訴你,通過添加支援OLE對象的Element直接插入表格,非常遺憾,這個功能只能在案頭下用,ArcEngine下你是用不起來的,OLE
Element是屬於ArcMapUI類庫的。即使用了很大的問題是如果需要改變表格內容,你需要在OLE對象的編輯環境下進行,也就是說你如果插入的是Excel表格,你只能在Excel環境下編輯後,Element才能表現出來。
有很多人問過我這個問題,如何解決?我給出的答案是,要麼定製好OLE Element對象不動,要麼你就自己做一個支援表格的Element。自己做靈活性和可定製性都很好,而且一勞永逸,只是難度比較大,不熟悉或者沒有自己做過ArcGIS 擴充的人實現起來是比較費勁的。ESRI 只給出了一個實現Triangle Element的例子,非常簡單,參考著做就可以。當然實作類別似表格的功能還是頗為費勁的。
第一步,確定自己需要實現哪些介面,可以參考Triangle Element的實現
第二步,設計自訂介面內部需要傳入的參數
第三步,測試案例
//添加自訂ElementIElementPtr ipElement(CLSID_HydroInfoElement); IPointPtr ipPoint(CLSID_Point);hr=ipPoint->PutCoords(0,0);ipElement->put_Geometry(ipPoint);hr=ipGraphicsContainer->AddElement(ipElement,0); IPropertySetPtr ipPropertySet(CLSID_PropertySet);hr=ipPropertySet->SetProperty(CComBSTR("主管單位"),CComVariant("國家防汛抗旱總指揮部辦公室"));hr=ipPropertySet->SetProperty(CComBSTR("編製單位"),CComVariant("水利部長江水利委員會")); hr=ipPropertySet->SetProperty(CComBSTR("編製方法"),CComVariant("水利學法")); hr=ipPropertySet->SetProperty(CComBSTR("發布單位"),CComVariant("")); hr=ipPropertySet->SetProperty(CComBSTR("發布時間"),CComVariant("")); IHydroInfoElementPtr ipHydroInfoElement;ipHydroInfoElement= ipElement;hr=ipHydroInfoElement->put_HydroInfoProperties(ipPropertySet); //設定解說文字字型ITextSymbolPtr ipTextSymbol(CLSID_TextSymbol);IFontDispPtr ipFontDisp(CLSID_StdFont);IFontPtr ipFont;ipFont=ipFontDisp;hr=ipFont->put_Name(CComBSTR("宋體")); hr=ipTextSymbol->put_Font(ipFontDisp);hr=ipTextSymbol->put_Size(12);hr=ipHydroInfoElement->put_HydroInfoTextSymbol(ipTextSymbol);//重新整理IActiveViewPtr ipActiveView;ipActiveView=ipGraphicsContainer;hr=ipActiveView->Refresh();
第四步,自己實現所有介面內部的方法
略
第五步,ArcMap或ArcEngine上測試
自訂的Table Element如果需要改變內容,最直接的方式就是把PropertySet參數重新傳遞一邊,這其實極大的減輕了ArcEngine的開發,一般使用者只需要簡單定製傳入參數的介面或者只是通過程式控制參數即可,其他的效果全部由Table Element自動控制。當然定製的力量不僅僅局限在這裡,其他類似的棘手或繁瑣的工作都可以轉化到自訂Element上。自定的Element,再加上排版規則,所有排版的問題幾乎都可以迎刃而解。
轉載請註明來源:http://blog.csdn.net/jx1228