倪慧珠
(浙江省第二測繪院,浙江 杭州310012)
目前的GIS產(chǎn)品都支持地圖注記的存儲和編輯,如注記的內(nèi)容、大小、顏色、位置、角度等。ESRI公司1981年推出了第一個商業(yè)GIS軟件ARCGIS,其中的GeoDatabase數(shù)據(jù)模型提供的注記類是面向?qū)ο蟮?,它將電子地圖或數(shù)字地圖上的地圖注記組織存儲在面向?qū)ο蟮臄?shù)據(jù)庫中進(jìn)行管理,這種面向?qū)ο蟮牡貓D注記庫可以增強(qiáng)注記的編輯特性和地圖數(shù)據(jù)復(fù)用性,并大幅提高制圖的效率,體現(xiàn)了GIS互操作技術(shù)和理念。
基礎(chǔ)地理信息數(shù)據(jù)庫是測繪部門用來管理和更新基礎(chǔ)數(shù)據(jù)的基礎(chǔ),全國大部分測繪與地理信息局均建立了本省的基礎(chǔ)地理信息數(shù)據(jù)庫,基于庫體進(jìn)行數(shù)據(jù)更新以及基于庫體出圖是提高基礎(chǔ)數(shù)據(jù)更新效率的有效途徑[1]。而基于庫體快速出圖的前提是建立注記類,把注記類融入省級基礎(chǔ)地理信息庫,研制注記的各種表達(dá)方式及組合方式。
本文討論如何在ArcGIS平臺下,基于省級基礎(chǔ)地理信息庫中的注記類,研制出區(qū)別于ArcGIS提供的注記操作功能,用戶可單獨(dú)對散列式注記中的某個注記進(jìn)行編輯,包括位置移動、旋轉(zhuǎn)及內(nèi)容的改變,以提高作業(yè)人員對注記的操作效率,滿足地圖對注記的各種需求。
ArcObjects組件庫包括了ArcGIS的全部功能,利用AreObjects所提供的組件,不僅可以在ArcGIS桌面軟件中進(jìn)行功能定制,還可以利用多種開發(fā)語言開發(fā)出功能豐富同時滿足實際需求的GIS應(yīng)用軟件。它是目前許多GIS應(yīng)用軟件的開發(fā)平臺,ArcGIS Desktop(ArcCatalog,ArcMap)都是AO的產(chǎn)品。
ArcObjects必須依賴于ArcGIS Desktop桌面平臺,支持COM技術(shù)的IDE環(huán)境或語言都可用于開發(fā),如VB、VC、.NET等。利用ArcObjects進(jìn)行應(yīng)用開發(fā)主要有3種模式,分別為腳本語言VBA、包裝為自己的COM組件、開發(fā)獨(dú)立的EXE。腳本語言VBA模式是基于VBA,可以調(diào)用ArcObjects庫組件對ArcGIS Desktop進(jìn)行定制,實現(xiàn)軟件應(yīng)用功能擴(kuò)展;包裝為自己的COM組件模式是通過引用ArcObjects庫,調(diào)用ArcObjects相應(yīng)的接口,定義自己的組件(接口和功能),編寫的組件可以集成到ArcGIS環(huán)境中;開發(fā)獨(dú)立的EXE模式是在相應(yīng)的開發(fā)環(huán)境中,利用ArcObjects相關(guān)控件,新建EXE工程,編寫代碼構(gòu)造所需的應(yīng)用程序。
Arcobjects由1 800多個組件、幾百個具有良好文檔說明的接口和數(shù)千個方法組成[2]。Arcobjects組件庫的每一個組件中定義有不同的類,類下面定義了不同接口。AO組件通過3種不同類型的類組成:抽象類(AbstractClass)、組件類(CoClass)和普通類(Class)。抽象類為子類提供一種模板,子類通過繼承實現(xiàn)抽象類的部分或全部功能,多個子類繼承同一抽象類,其類定義的接口都可以相互調(diào)用。組件類對象可以被直接創(chuàng)建。普通類對象雖不能直接創(chuàng)建,但它可作為其他類的一個屬性或通過其他類實例化來創(chuàng)建。代碼如下:
IPolyline pNewPline = new PolylineClass();//Polyline是組件類,可以創(chuàng)建對象
IGeometryCollection pNewPlGeomCol =pNewPline as IGeometryCollection;
IFeatureClass pFtCls = pFt.Class as IFeatureClass;
注記包括地理名稱注記、說明注記和各種數(shù)字注記等[3]。注記字列分水平字列、垂直字列、雁行字列和屈曲字列,水平字列是由左至右,各字中心的連線成一直線,且平行于南圖廓。垂直字列是由上至下,各字中心的連線成一直線,且垂直于南圖廓。雁行字列是各字中心的連線斜交于南圖廓,與被注地物走向平行,但字向垂直與南圖廓,如山脈名稱、河流名稱等,當(dāng)?shù)匚镅由旆较蚺c南圖廓成45°和45°以下傾斜時,由左至右注記;成45°以上傾斜時,由上至下注記。屈曲字列是各字字邊垂直或平行與現(xiàn)狀地物,依線狀地物的彎曲排成字列,如街道名稱注記、說明注記等[3]。
ArcGIS軟件實現(xiàn)地圖注記一般有三種方式,包括動態(tài)標(biāo)注、地圖文件注記、GeoDatabase注記。
1)動態(tài)標(biāo)注。動態(tài)標(biāo)注在ArcGIS軟件表現(xiàn)為標(biāo)注(Label),其根據(jù)要素類的某個屬性,自動按標(biāo)注定義的大小、顏色、位置動態(tài)標(biāo)注在圖層上,并在漫游和縮放后按照當(dāng)前地圖比例尺下的最佳位置重畫。其優(yōu)點是可實時地向用戶展現(xiàn)某一要素的屬性,其缺點是很難定制滿足圖式要求的注記,而且達(dá)到一定數(shù)據(jù)量時影響圖層的顯示效率。
2)地圖文件注記。地圖文件注記只是通過文本的方式展現(xiàn)在圖層上,與圖層要素之間無任何關(guān)系。在ArcMap中一般作為地圖版面的圖面配置等,可用于簡單需求的地圖打印。
3)GeoDatabase注記。ArcGIS地理數(shù)據(jù)庫中的注記存儲于注記要素類中[4-8]。與其他要素類一樣,注記要素類中的所有要素均具有地理位置和屬性,可以位于要素數(shù)據(jù)集內(nèi)或獨(dú)立的注記類內(nèi)。每個注記要素都具有符號系統(tǒng),其中包括字體、大小、顏色,每個注記文本可以被獨(dú)立操作,可獨(dú)立賦予符號。該符號包含了一些用以描述注記要素繪制方式的屬性,如字體、大小和顏色。例如,你要注記省級政府駐地,則可根據(jù)圖式要求定義該注記的文本符號以指定給該注記。因此,可以根據(jù)圖式制定符號庫,再通過注記類來編制出符號圖式要求的圖面注記。同時,每個注記要素并不需要存儲自身的符號屬性,因此,ArcGIS能夠降低存儲需求并最大限度地提高顯示和查詢性能。
圖1 一般注記
GeoDatabase注記以一般注記和組合注記存在,組合注記也稱為散列式注記。一般注記在Geo-Database中表現(xiàn)形式為一個主體,但一個主體中的多個文字具有相同方位或者相同間隔或者相同字體,按一定的方位進(jìn)行排列,如圖1所示;散列式注記在GeoDatabase中也表現(xiàn)為一個主體,但一個主體中的多個文字可具有不同方位不同間隔不同字體,可按制圖要求進(jìn)行定制,同時組合注記可對組合體中的每個注記進(jìn)編輯(包括移動、刪除、修改),如對“唐興大道”中的“大”進(jìn)行位置的移動,如圖2所示。
圖2 散列式注記
在ArcMap中提供注記的實現(xiàn)方式主要有以下幾種:Horizontal Annotation(水平注記)、Straight Annotation(垂直注記)、Curved Annotation()、Annotation that has a leader line(帶標(biāo)注線注記)、Follow Feature Annotation(隨要素注記),以上幾種注記方式只能實現(xiàn)一般注記,一般注記不能對其中的單個注記進(jìn)行位置調(diào)整及內(nèi)容修改。
但往往在制圖過程中,注記字隔的選擇是根據(jù)地物的面積或長度的大小而定,同時,注記會從圖面美觀等方面考慮注記的避讓,如注記不能遮蓋道路交叉處、居民地出入口或其他主要地物等等。一般注記的編輯是無法滿足圖面注記的復(fù)雜標(biāo)注,這就需要提供散列式注記,用戶可單獨(dú)對散列式注記中的某個注記進(jìn)行編輯,包括位置移動、旋轉(zhuǎn)及內(nèi)容的改變。
以下介紹如何利用ArcObjects二次開發(fā)實現(xiàn)散列式注記。
1)定義散列式注記類,繼承IAnnotationConstructor接口。
2)重載接口IAnnotationConstructor的方法,實現(xiàn)散列式注記的繪制。
接口IAnnotationConstructor所有的方法均需重載,其主要重載的方法有:
①Name:定義該接口的名稱,如"平分式_正北"。
public string Name{get{return"平分式_正北";}}
②Startup(IEditor pEditor):啟動 ArcMap時調(diào)用該方法,用來獲取ArcMap中當(dāng)前注記編輯接口IAnnotationEditExtension,通過該接口可以獲取當(dāng)前繪制的注記內(nèi)容、式樣。
③SketchGeometryType:在ArcMap工具條上點擊該功能時調(diào)用,用來告知當(dāng)前注記幾何放置方式。散列式注記需用多點的幾何類型,即sriGeometryType.esriGeometryMultipoint。
public esriGeometryType SketchGeometry-Type
{get{return esriGeometryType.esriGeometryPolyline;}}
④CreateFeedback():創(chuàng)建IRotateTextFeedback接口,用來獲取ArcMap中作業(yè)員的當(dāng)前畫筆,通過該畫筆可獲取當(dāng)前繪制注記的幾何及位置。
⑤StartFeedback(IPoint point):設(shè)置IRotate-TextFeedback的幾何。在該方法中需初始化散列式注記的內(nèi)容、記載每個注記內(nèi)容的序號,同時需設(shè)置feedback樣式、位置。
⑥get_CanFinish(IGeometry sketchGeometry):用于確定散列式注記是否繪制完成。
⑦BeforeStoreAnnotation(IAnnotationFeature annotationFeature,IGeometry sketchGeometry):用于設(shè)置散列式注記的角度、顏色、幾何位置等。在散列式注記全部內(nèi)容繪制完成,存入數(shù)據(jù)庫調(diào)用該方法。
public void BeforeStoreAnnotation(IAnnotationFeature annotationFeature,IGeometry sketch-Geometry)
{
//1.設(shè)置注記角度符號
ITextSymbol textSym = textElement.Symbol;
textSym.Angle= dAngle;textElement.Symbol=textSym;
//2.設(shè)置注記位置
IMultiPartTextElement pMultiTxtElem= annotationFeature.Annotation as IMultiPart-TextElement;
pMultiTxtElem.ConvertToMultiPart(pDisplay);
string strFcode= AnnoPubFun.curAnnCode;string txtSize="";
for(int i=0;i< nCountTxt;i++)
{
string strCurText = strAllTxt.Substring(i,1);
……
pln.FromPoint = pFPnt;pln.ToPoint =pTPnt;
pNewGeom = pln as IGeometry;//設(shè)置單個注記位置
pMultiTxtElem.InsertPart(i,strCurText,pNewGeom);//向散列式注記中插入單個注記
}
……
}
3)定制Command,如圖3所示,獲取散列式注記類,與用戶交互,如圖4所示。
圖3 定制Command
圖4 用戶交互編輯
基礎(chǔ)地理信息數(shù)據(jù)庫記載著基礎(chǔ)要素的幾何和屬性信息,但由于注記類占用內(nèi)存較大,基礎(chǔ)地理信息數(shù)據(jù)庫往往撇開注記類,只體現(xiàn)基礎(chǔ)要素的存儲。對基于省級基礎(chǔ)地理信息數(shù)據(jù)庫中注記類的研究,把注記類納入基礎(chǔ)庫中進(jìn)行管理,研制注記的各種表達(dá)方式及組合方式,是圖庫一體化得以實現(xiàn)的有利保障。
本文通過對IAnnotationConstructor接口介紹及應(yīng)用,定制實現(xiàn)散列式注記,解決了復(fù)雜注記的編輯,為圖庫一體化的實現(xiàn)奠定了基礎(chǔ)。同時,可定制各種散列式注記,如平分式垂直注記、平分式任意角度注記、散列式任意角度注記等,能夠高效地滿足用戶對圖件注記的多樣化需求。
[1] 樓燕敏,倪慧珠,彭艷,等.省級基礎(chǔ)地理信息數(shù)據(jù)庫“圖庫一體化”更新研究[C].第十三屆華東六省一市測繪學(xué)會論文:《現(xiàn)代測繪》編輯部,2011:194-196.
[2] 白亞茹,陸鑫.基于ArcObjects組件的GIS應(yīng)用軟件開發(fā)[J].計算機(jī)工程,2009,35(14):14-15.
[3] 中華人民共和國國家質(zhì)量監(jiān)督檢驗檢疫總局,中國國家標(biāo)準(zhǔn)化管理委員會.GB/T 20257.2/2006國家基本比例尺地形圖圖式[S].北京:測繪出版社,2006.
[4] 馬曉玲,周夢杰,范偉.基于SVG的專題地圖與Google地圖混搭研究[J].測繪工程,2015,24(2):33-37.
[5] 熊順,劉平芝,張衛(wèi)柱,等.矢量地圖數(shù)據(jù)轉(zhuǎn)換質(zhì)量評估研究[J].測繪工程,2014,23(6):11-15.
[6] 王晏民,李德仁,龔健雅.多尺度GIS集中式數(shù)據(jù)模型[J].黑龍江工程學(xué)院學(xué)報:自然科學(xué)版,2001,15(1):19-22.
[7] 程鋼,梁曉莉,張得群,等.基于地圖API的校園在線電子地圖設(shè)計與實現(xiàn)[J].測繪工程,2014,23(1):5-11.
[8] ZEILER M.Modeling our World-The ESRI guideto geodatabase design[M].California:ESRI Press,1999:115-125.