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