GIS應用開發(fā)課件:地圖及相關對象_第1頁
GIS應用開發(fā)課件:地圖及相關對象_第2頁
GIS應用開發(fā)課件:地圖及相關對象_第3頁
GIS應用開發(fā)課件:地圖及相關對象_第4頁
GIS應用開發(fā)課件:地圖及相關對象_第5頁
已閱讀5頁,還剩208頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

GIS應用開發(fā)DevelopingGISApplicationswithArcObjectsusingC#.NET

地圖及相關對象(5學時)主要內(nèi)容:Map對象圖層對象地圖顯示(MapDisplay)地圖排版Layout對象圖形元素與框架元素MapGrid對象MapSurround對象地圖的輸出§5.1

Map對象地圖對象(Mapobject)是顯示和操作地圖數(shù)據(jù)的容器。地圖對象上能顯示的圖形有兩類:地理數(shù)據(jù)和元素。地理數(shù)據(jù)包括矢量類型的要素數(shù)據(jù)、柵格數(shù)據(jù)、Tin數(shù)據(jù)等,這些數(shù)據(jù)都保存在Geodatabase或數(shù)據(jù)文件(如shapefile)中。元素分為兩類:圖形元素和框架元素。圖形元素可以顯示出來,而框架元素充當了“容器”的角色。在ArcMap中可以使用“Draw”工具在Map上直接繪制一個矩形、圓形、文本等對象,在布局視圖上也可以給地圖添加指北針、圖例、比例尺等圖形對象,這些都是圖形元素。Map對象有雙重身份,當加載數(shù)據(jù)到Map對象的時候,Map對象是數(shù)據(jù)的管理者;當改變視圖范圍、刷新地圖的時候它是數(shù)據(jù)的顯示者。地圖對象中的所有圖層共享相同的空間參考。第一個載入的圖層的空間參考被自動地設置為地圖對象的空間參考

。新載入的圖層,如果它們的空間參考與地圖的空間參考不同,會被投影到地圖的空間參考。ArcMap中的Map是由文檔對象(MxDocument)控制的。Map類的主要接口有:IMapIActiveViewIViewManagerIActiveViewEventsIGraphicsContainerIMapBookmarkITableCollection

§5.1.1IMap與IActiveView接口IMap接口是有關地圖操作任務的起點,它主要用于管理Map對象中的layer對象、要素選擇集、MapSurround對象、標注引擎和空間參考等對象。publicvoidDelayEvents(bool

delay);當DelayEvents設置為TRUE時,不會觸發(fā)IActiveViewEvents.SelectionChanged事件,這一方法典型情況下用于地圖選擇集改變時。當DelayEvents設置為FALSE時,向地圖選擇集中每添加或移出一個要素,都會觸發(fā)一次IActiveViewEvents.SelectionChanged事件;相反,將DelayEvents設置為TRUE時,當整個選擇操作完成時僅觸發(fā)一次該事件,以提高系統(tǒng)性能。publicISelectionFeatureSelection{get;set;}ArcObjects中有兩種選擇集:要素選擇集

(FeatureSelections)和元素選擇集(ElementSelections),并使用兩個不同的對象來表達這兩種不同的選擇集,且都實現(xiàn)了ISelection接口。在返回值的時候,前者使用IEnumFeature,后者常常使用IEnumElement,它們都是枚舉對象。每個PageLayout對象和Map對象都有自己的選擇集對象。差別是前者只有元素選擇集,而后者卻擁有元素選擇集和要素選擇集兩種。IMap.FeatureSelection屬性返回ISelection類型的對象,但可通過接口查詢訪問IEnumFeature接口,且通常也是這么做的。TogetaMap‘selementselection,useIViewManager.ElementSelection.但是,如果通過IActiveView.Selection屬性獲得選擇集,這個選擇集不是元素選擇集就是要素選擇集,這取決于哪個處于活動狀態(tài)。使用IMap.FeatureSelection屬性可以確保獲得對要素選擇集的引用。每個要素圖層都有一個ISelectionSet,但IEnumFeature是將地圖對象中的所有要素圖層作為一個整體來操作,不能通過IEnumFeature遍歷屬于單個要素圖層中的要素。MapSelectionIEnumFeatureIEnumFeatureSetupISelectionIActiveView接口定義了Map對象的數(shù)據(jù)顯示功能。在ArcObjects中,PageLayout、Map、Globe和Scene實現(xiàn)了這個接口。在ArcMap中,IMxDocument.ActiveView擁有當前活動視圖對象的一個指針。如果處于布局視圖狀態(tài),那么IMxDocument.ActiveView返回的IActiveView對象是指向PageLayout對象的;如果處于在數(shù)據(jù)視圖狀態(tài),那么這個屬性就會返回一個當前使用的Map對象的指針。IActiveView.Extent屬性返回Map對象當前視圖的范圍,它是一個Envelope對象。FullExtent屬性則可以返回視圖的全圖范圍,因此要顯示整幅地圖的代碼為://將地圖的當前范圍設置為全圖范圍

pActiveView.Extent=pActiveView.FullExtent;pActiveView.Refresh();IActiveView.ScreenDisplay屬性指向當前視圖的ScreenDisplay對象。每一個視圖對象都有一個ScreenDisplay對象用于控制視圖的圖形繪制工作。IActiveView.PartialRefresh方法可以讓視圖對象使用不同的方式來局部刷新以重繪地圖。pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,null,null)publicvoidPartialRefresh(

esriViewDrawPhasephase,

objectData,

IEnvelopeenvelope);ConstantValueDescriptionesriViewNone0Drawsnothing.esriViewBackground1Drawsthebackground.esriViewGeography2Drawsthegeography.esriViewGeoSelection4Drawstheselectedgeography.esriViewGraphics8Drawstheannotation.esriViewGraphicSelection16Drawstheselectedannotation.esriViewForeground32Drawstheforeground.IActiveView.Selection對于PageLayout

,IActiveView.Selection為元素選擇集(PageLayout中所有內(nèi)容都為元素)。對于Map,

IActiveView.Selection不是元素選擇集就是要素選擇集,這取決于哪個處于活動狀態(tài),即目前選擇了地理要素,則為要素選擇集;選擇了元素,則為元素選擇集。更簡單的方法是:

使用IMap.FeatureSelection獲得地圖的要素選擇集,使用IViewManager.ElementSelection獲得地圖的元素選擇集。Map對象的獲取通過MapDocument獲得Map對象IMapDocumentpMapDocument=newMapDocumentClasspMapDocument.Open(path,null);IMappMap=pMapDocument.get_Map(i);

通過MxDocument獲得Map對象m_application=hookasIApplication;

IDocumentdocument=m_application.Document;

IMxDocumentmapDocument=documentasIMxDocument;

IMapmap=mapDocument.FocusMap;IMapDocumentIMxDocument通過MapControl獲得Map對象IMappMap=axMapControl1.Map;IActiveViewpActiveView=pMapasIActiveView;或pActiveView=axMapControl1.ActiveView;通過PageLayoutControl獲得Map對象

IActiveViewpActiveView=axPageLayoutControl1.PageLayoutasIActiveView;或pActiveView=axPageLayoutControl1.ActiveView;pMap=pActiveView.FocusMap;在命令、工具類中獲得Map對象IHookHelperm_hookHelper=null;IMapm_Map;IActiveViewm_ActiveView;publicoverridevoidOnCreate(objecthook){if(hook==null)return;m_hookHelper=newHookHelperClass();m_hookHelper.Hook=hook;

m_Map=m_hookHelper.FocusMap;

m_ActiveView=m_hookHelper.ActiveView;}IHookHelperPerformingmapselectionWhenworkingwithamap,selectioncanbemanagedatboththemaplevelandthelayerlevel.

privatevoidSelectFeaturesPolygon(

IMappMap,IPolygonpPolygon){

ISelectionEnvironmentpSelectionEnvironment=newSelectionEnvironmentClass();pSelectionEnvironment.CombinationMethod=esriSelectionResultEnum.esriSelectionResultNew;

pMap.SelectByShape(pPolygon,pSelectionEnvironment,false);}ThejustOneparametertellsthesearchtostoponceithasfoundonefeature.IEnumFeatureselectedFeatures=m_map.FeatureSelectionasIEnumFeature;selectedFeatures.Reset();IFeatureselectedFeature=selectedFeatures.Next();if(selectedFeature==null)returnnull;IFeatureClassfeatureClass=selectedFeature.ClassasIFeatureClass;if(featureClass.ShapeType!=esriGeometryType.esriGeometryPolyline)returnnull;IPolylinepolyline=selectedFeature.ShapeCopyasIPolyline;txtLineLength.Text=polyline.Length.ToString();DrawSelectedFeature(polyline);privatevoidClearMapSelection(

IMappMap){pMap.ClearSelection();}privateIEnumLayerGetLayers(

IMapm_map){UIDuid=newUIDClass();//uid.Value="{40A9E885-5533-11d0-98BE-00805F7CED21}";//IFeatureLayer

uid.Value="{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}";//IGeoFeatureLayer//uid.Value="{6CA416B1-E160-11D2-9F4E-00C04F6BC78E}";//IDataLayerif(m_map.LayerCount!=0){IEnumLayerlayers=m_map.get_Layers(uid,true);returnlayers;}returnnull;}publicIEnumLayerget_Layers(UIDuid,

boolrecursive

);Thelayersinthemapofthetypespecifiedintheuid.Ifrecursiveistrueitwillreturnlayersingrouplayers.

§5.1.2IActiveViewEvents接口IActiveViewEvents接口讓Map對象可以監(jiān)聽與活動視圖(ActiveView)相關的事件并做出相應的反應。例如AfterDraw、SelectionChanged等。AfterDrawFiredafterthespecifiedphaseisdrawn.AfterItemDrawFiredafteranindividualviewitemisdrawn.Example:viewitemsincludelayersinamaporelementsinapagelayout.ContentsChangedFiredwhenthecontentsoftheviewchanges.ContentsClearedFiredwhenthecontentsoftheviewiscleared.FocusMapChangedFiredwhenanewmapismadeactive.ItemAddedFiredwhenanitemisaddedtotheview.ItemDeletedFiredwhenanitemisdeletedfromtheview.ItemReorderedFiredwhenaviewitemisreordered.SelectionChangedCallthisfunctiontofiretheselectionchangedevent.SpatialReferenceChangedFiredwhenthespatialreferenceischanged.ViewRefreshedFiredwhenviewisrefreshedbeforedrawhappens.許多組件類實現(xiàn)了IActiveViewEvents接口,不同的組件類觸發(fā)的事件也有所不同。如Map對象不會觸發(fā)FocusMapChanged事件,但PageLayout對象觸發(fā)該事件;當從Map對象中去除一個圖層時,Map對象會觸發(fā)ItemDeleted事件;當從PageLayout對象中刪除元素如地圖框架或圖形元素時,PageLayout對象也會觸發(fā)ItemDeleted事件。AfterItemDraw事件只有當

IViewManager.VerboseEvents

屬性為True時,才會被觸發(fā)。缺省情況下,IViewManager.VerboseEvents

為False.IViewManagerIViewManager

中常用的屬性為VerboseEvents,

該屬性缺省為False,不會觸發(fā)IActiveViewEvents.AfterItemDraw事件;如果要監(jiān)聽這一事件,需將

VerboseEvents

設置為True.將線要素一分為二點擊菜單或命令,彈出如圖界面,在地圖上選擇線要素,其長度會自動顯示在界面中.這需要使用IActiveViewEvents中的SelectionChanged.IActiveViewEvents_EventactiveViewEvent=null;IActiveViewEvents_SelectionChangedEventHandlermapSelectionChanged;privatevoidSetupEvents(){activeViewEvent=m_activeViewasIActiveViewEvents_Event;mapSelectionChanged=newIActiveViewEvents_SelectionChangedEventHandler(OnMapSelectionChanged);activeViewEvent.SelectionChanged+=mapSelectionChanged;}publicvoidOnMapSelectionChanged()

{selectedFeature=GetSelectedFeature();

}privateIFeatureGetSelectedFeature()

{IEnumFeatureselectedFeatures=m_map.FeatureSelectionasIEnumFeature;

selectedFeatures.Reset();

IFeatureselectedFeature=selectedFeatures.Next();

if(selectedFeature==null)returnnull;

IFeatureClassfeatureClass=selectedFeature.ClassasIFeatureClass;if(featureClass.ShapeType!=esriGeometryType.esriGeometryPolyline)returnnull;

IPolylinepolyline=selectedFeature.ShapeCopyasIPolyline;txtLineLength.Text=polyline.Length.ToString();DrawSelectedFeature(polyline);returnselectedFeature;

}§5.1.3IGraphicsContainer接口IGraphicsContainer

用于管理Map中的元素對象。AddElement方法用于將一個元素放入Map對象中,下面是一個添加元素的例子:IGraphicsContainerpGraphicsContainer=pMapasIGraphicsContainer;//定義一個line類型的ElementILineElementpLineEle=newLineElementClass();//設置這個Element的符號對象pLineEle.Symbol=pSymbol;IElementpEle=pLineEleasIElement;//設置元素的幾何形體對象屬性pEle.Geometry=pGeo;//將元素添加到Map對象中pGraphicsContainer.AddElement(pEle,0);pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);publicvoidAddElement(IElementElement,intzorder);TheparameterzorderiscurrentlynotutilizedbyalloftheIGraphicsContainerimplementationsandistypicallysetto0whencallingthismethod.IGraphicsContainer.DeleteElement方法用于刪除Map對象中的一個給定的元素。UpdateElement用于更新圖形元素。IGraphicsContainer.LocateElements方法是使用一個點來選擇元素,它需要傳入一個點對象和一個容差值,Map對象會將所有處于點容差范圍內(nèi)的元素選擇到。LocateElementsByEnvelope方法,它和SelectByShape方法類同,是使用鼠標拖曳一個矩形區(qū)域,從而選擇到這個區(qū)域內(nèi)所有的元素?!?.1.4

IMapBookmarks接口IMapBookmarks用于管理Map中的空間書簽對象。publicvoidAddBookmark(ISpatialBookmark

bookmark);publicIEnumSpatialBookmark

Bookmarks{get;}publicvoidRemoveAllBookmarks();publicvoidRemoveBookmark(ISpatialBookmarkbookmark);ISpatialBookmark有兩種類型的空間書簽(實現(xiàn)了ISpatialBookmark接口的類):

AOIBookmark:用感興趣的區(qū)域定義空間書簽。FeatureBookmark:用選擇要素的空間覆蓋范圍定義書簽?!?.1.5

ITableCollection接口ArcMap除了可以添加地理數(shù)據(jù)外還能夠添加純屬性表,加入屬性表是為了和要素類等對象進行關聯(lián)和連接。AddTable方法可以將一個table對象添加進Map對象;Table屬性可以依據(jù)表的標識號獲得特定的屬性表,如:

ITableCollectionpTableCol=pMapasITableCollection;

ITablepTable=pTableCol.get_Table(0);RemoveAllTables方法可以讓pTableCol對象刪除地圖中的所有屬性表,RemoveTable可以依據(jù)表的標識號刪除某個屬性表,TableCount則可以返回地圖對象中所有的屬性表的數(shù)目?!?.2

圖層對象Map對象可以裝載地理數(shù)據(jù),這些數(shù)據(jù)是以圖層的形式組織到地圖對象的。Layer對象本身沒有裝載數(shù)據(jù),而僅僅是獲得了數(shù)據(jù)的引用而已,是用于管理數(shù)據(jù)源的鏈接;此外圖層中還保存著符號化信息。在ArcObjects中,地理數(shù)據(jù)始終是保存在GeoDatabase或者地理文件中的。ArcGIS中也可以在一個要素類上新建一個圖層文件,即lyr文件,這個文件也是僅僅獲取了地理數(shù)據(jù)的硬盤位置而已,而沒有擁有數(shù)據(jù)?!?.2.1ILayer2接口ILayer2是所有圖層類都實現(xiàn)了的一般接口,它定義了所有圖層的公共方法和屬性。publicvoidDraw(

esriDrawPhase

DrawPhase,

IDisplay

Display,

ITrackCancel

TrackCancel);§5.2.2要素圖層FeatureLayer要素數(shù)據(jù)是GIS中最常使用的數(shù)據(jù)類型之一,它可以用于表示離散矢量對象的信息。IFeatureLayer2IGeoFeaturelayerIGeoDatasetIFeatureSelectionIFeatureLayerDefinitionILayerFieldsIIdentify§

IFeatureLayer2接口IFeatureLayer2接口用于管理要素圖層的數(shù)據(jù)源,即要素類(Featureclass)。IFeatureLayer2.DataSourceType屬性返回要素圖層的數(shù)據(jù)源的類型。(New)LayerType(DataSourceType

)ValuePersonalGeodatabase"PersonalGeodatabaseFeatureClass"SDE"SDEFeatureClass"Shapefile"ShapefileFeatureClass"ArcInfoorPCArcInfoCoverage(annotation)"AnnotationFeatureClass"ArcInfoorPCArcInfoCoverage(point)"PointFeatureClass"ArcInfoorPCArcInfoCoverage(line)"ArcFeatureClass"ArcInfoorPCArcInfoCoverage(polygon)"PolygonFeatureClass"Edge"StreetMapFeatureClass"CAD(annotation)"CADAnnotationFeatureClass"CAD(point)"CADPointFeatureClass"CAD(line)"CADPolylineFeatureClass"CAD(polygon)"CADPolygonFeatureClass"IFeatureLayer2.DisplayField屬性用于顯示地圖圖層提示;Selectable屬性用于圖層上的要素是否可以被選擇;ScaleSymbols屬性用于管理圖層要素符號化的符號是否隨比例尺的縮放而縮放。IFeatureCursorfeatureCursor=pFeatureLayer.Search(queryFilter,false);IFeaturefeature=featureCursor.NextFeature();publicIFeatureCursorSearch(IQueryFilter

queryFilter,

boolrecycling);Recyclingspecifieswhethertheresultingfeaturecursorwillberecyclingornon-recycling.UseTrueforrecyclingcursorandFalseforanon-recyclingcursor.§

IGeoFeaturelayer接口IGeoFeaturelayer接口繼承了ILayer和IFeatureLayer兩個接口,用于控制要素圖層中與地理相關的內(nèi)容,例如要素的著色和標注等功能。publicIFeatureCursorSearchDisplayFeatures(IQueryFilterqueryFilter,boolrecycling);Renderer屬性用于設置圖層的著色對象;DisplayAnnotation屬性可以設置要素圖層是否出現(xiàn)標注,當它為true的時候,用戶可以在這個要素圖層上依據(jù)要素類的某個字段進行標注。privatevoidRenderer(){IGeoFeatureLayerpGeoFeatureL=(IGeoFeatureLayer)

layer2Symbolize;

IFeatureClassfeatureClass=pGeoFeatureL.FeatureClass;//找出rendererField在字段中的編號

intlfieldNumber=featureClass.FindField(strRendererField);

IClassBreaksRendererm_classBreaksRenderer=CreateClassBreaksRenderer

(featureClass,strClassifyMethod);if(m_classBreaksRenderer==null)return;pGeoFeatureL.Renderer=(IFeatureRenderer)m_classBreaksRenderer;m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,m_activeView.Extent);}§

IGeoDataset接口IGeoDataset接口僅有兩個屬性,用于管理地理要素集的范圍和空間參考。Extent可以返回當前數(shù)據(jù)集的范圍,是一個IEnvelope類型的對象;SpatialReference屬性則可以讓用戶獲得這個數(shù)據(jù)集的空間參考。所有的圖層和數(shù)據(jù)集實現(xiàn)了該接口(圖層是對數(shù)據(jù)集的引用)。IGeoDataset2DescriptionExtentTheextentoftheGeoDataset.GeodataXformThegeodatatransformationoftheGeoDataset.NativeExtentThenativeextentoftheGeoDataset(beforetransformationapplied).NativeSpatialReferenceThenativespatialreferenceoftheGeoDataset(beforetransformationapplied).SpatialReferenceThespatialreferenceoftheGeoDataset.§IFeatureSelection接口IFeatureSelection接口負責管理一個圖層中的要素選擇集的方法和屬性。IFeatureSelection接口的Add方法可以把本圖層上的一個要素添加到圖層的選擇集中;SelectFeatures方法則可以使用一個過濾器把符合要求的要素放入圖層的選擇集中;Clear方法用于清除圖層要素選擇集。privatevoidSelectLayersFeatures

(IFeatureLayerpFeatureLayer,stringWhereClause){IFeatureSelectionpFeatureSelection=pFeatureLayerasIFeatureSelection;if(pFeatureSelection==null)return;

IQueryFilterpQueryFilter=newQueryFilterClass();pQueryFilter.WhereClause=WhereClause;

pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);

}publicvoidSelectFeatures(IQueryFilter

Filter,

esriSelectionResultEnum

Method,

bool

justOne);ConstantValueDescriptionesriSelectionResultNew0Createsanewselection.esriSelectionResultAdd1Addstothecurrentselection.esriSelectionResultSubtract2Subtractsfromthecurrentselection.esriSelectionResultAnd3Selectsfromthecurrentselection.esriSelectionResultXOR4Performsan'exclusiveor'withthecurrentselection.privatevoidClearLayerSelection

(IFeatureLayerpFeatureLayer){

IFeatureSelectionpFeatureSelection=pFeatureLayerasIFeatureSelection;if(pFeatureSelection==null)return;pFeatureSelection.Clear();

}在要素圖層中SelectFeatures(IFeatureSelection)和Search(IFeatureLayer)要素的區(qū)別:要素圖層的Search方法返回的是IFeatureCursor對象,它僅僅是一個指向要素的指針;使用IFeatureSelection.SelectFeatures方法,則符合要求的要素會被標記為“被選擇的要素集”,這個選擇集是一個ISelectionSet對象,可以用SelectionSet返回,如:

IFeatureSelection

pSel=pFeatureLayerasIFeatureSelection;

ISelectionSetpSelectionSet=pSel.SelectionSet;Note:theISelectionSetinterfacehasbeensupersededbyISelectionSet2.Pleaseconsiderusingthemorerecentversion.ISelectionSet2(新增)§

IFeatureLayerDefinition接口IFeatureLayerDefinition接口定義了CreateSelectionLayer方法,可以將一個圖層選擇集中的要素轉換為一個單獨的要素圖層。它要求四個參數(shù):LayerName定義了新圖層的名稱;如果希望使用當前圖層的要素選擇集,需要設useCurrentSelection為TRUE;joinTableNames是一個可能與當前圖層連接的表名稱,使用這個方法同樣也可以將連接表的數(shù)據(jù)放入新的圖層中;DefinitionExpression可以用于設定一個選擇過濾,將要素選擇集中符合條件的要素放入新的圖層。publicIFeatureLayerCreateSelectionLayer(

stringLayerName,

booluseCurrentSelection,

stringjoinTableNames,

stringExpression);Note:theIFeatureLayerDefinitioninterfacehasbeensupersededbyIFeatureLayerDefinition2.Pleaseconsiderusingthemorerecentversion.ConstantValueDescriptionesriSearchOrderSpatial0Spatialqueryisappliedfirst.esriSearchOrderAttribute1Attributequeryisappliedfirst.§

ILayerFields接口盡管要素圖層的數(shù)據(jù)是保存在要素類中,獲得要素類的字段需要從要素類著手,但是ArcObjects也提供了ILayerFields接口,可以直接獲取一個要素圖層的要素類字段結構。IFeatureLayer2ILayerFields§

IIdentify接口IIdentify接口只定義了Identify方法:publicIArrayIdentify(IGeometrypGeom);IIdentifyObj接口許多類實現(xiàn)了IIdentify接口。對于地圖圖層的IIdentify接口,Identify()方法返回FeatureIdentifyObject類型的對象數(shù)組。對于FeatureIdentifyObject,可以查詢到IIdentifyObj接口,以獲得已識別要素的更多信息。IIdentifyObj接口返回窗口句柄、圖層及要素的名稱,F(xiàn)lash方法對已識別要素進行閃爍,PopUpmenu方法彈出上下文菜單。IIdentifyObjNote:theIIdentifyinterfacehasbeensupersededbyIIdentify2.Pleaseconsiderusingthemorerecentversion.§5.2.3

TIN圖層TIN代表連續(xù)的表面,地表高程或者溫度梯度都可以使用TIN來表示。ITinLayer接口繼承自ILayer,定義了TIN如何在圖層上顯示的方法和屬性。ITinLayer.Dataset顯示了Tin圖層的數(shù)據(jù)源ITinLayer.DisplayField是TinLayer圖層的顯示字段ITinLayer.AddRenderer方法可以加入一個著色對象TINClearRenderers可以清除圖層中所有的著色對象GetRenderer可以用一個索引值獲得某個著色對象。在一幅TIN圖中,有多種著色方法,ITinLayer.RendererCount則可以返回這些著色對象的數(shù)目。Note:theITinLayerinterfacehasbeensupersededbyITinLayer2.Pleaseconsiderusingthemorerecentversion.TIN實現(xiàn)的接口TIN數(shù)據(jù)直接輸出為VCT規(guī)則格網(wǎng)DEM格式(見教材P358--)如何訪問TIN?(P360)§5.2.4通過地圖文檔訪問地圖和圖層AccessingmapsandlayersviatheMxDocumentstaticvoidAccessMapsAndLayersViaMxDocument(IMxDocumentpMxDocument){IMappMap;IMapspMaps=pMxDocument.Maps;

for(inti=0;i<=pMaps.Count-1;i++){pMap=pMaps.get_Item(i);IEnumLayerpEnumLayer=pMap.get_Layers(null,true);pEnumLayer.Reset();

ILayerpLayer=pEnumLayer.Next();while(pLayer!=null){……pLayer=pEnumLayer.Next();}}}

AccessingmapsandlayersviatheMapDocumentstaticvoidOpenMXDViaMapDocument(stringpath){IMapDocumentpMapDocument=newMapDocumentClass();

if(pMapDocument.get_IsMapDocument(path)){pMapDocument.Open(path,null);

IMappMap;for(inti=0;i<=pMapDocument.MapCount-1;i++){pMap=pMapDocument.get_Map(i);

IEnumLayerpEnumLayer=pMap.get_Layers(null,true);

pEnumLayer.Reset();ILayerpLayer=pEnumLayer.Next();while(pLayer!=null){……pLayer=pEnumLayer.Next();}}}}

§5.2.5往地圖中加入CAD文件Map對象可以載入多種格式的地理和非地理數(shù)據(jù),其中也包括DWG文件。在Map對象看來,DWG文件有兩種不同形式:一是要素圖層,保存的是矢量數(shù)據(jù);使用與Featurelayer一樣的方法來管理.另一種是看做柵格圖像,可以作為地圖背景使用,采用CadLayer對象來管理。當一個DWG文件被看做是要素圖層的時候,一個DWG文件表現(xiàn)為一要素數(shù)據(jù)集,包含四種類型的要素類,即點、線、多邊形和標注。這種區(qū)分并不是按照DWG文件本身的圖層來劃分的,而是簡單地考慮DWG文件中的幾何形體對象的類型。如果一個DWG文件中有多個線圖層,那么它們將會無區(qū)別地合并在一個線要素圖層中。點、線和多邊形作為要素數(shù)據(jù)時,可以使用FeatureLayer對象,但CAD文件中的文字標注需要使用一個專門的標注圖層CadAnnotationLayer。CadLayer對象CadLayer是將一個CAD數(shù)據(jù)當作柵格類型而使用的數(shù)據(jù)圖層,它可以作為地圖的背景而顯示,但是不能做地理分析。這個對象實現(xiàn)了ICadLayer和ICadDrawingLayers兩個接口,它們定義了將CAD文件作為柵格數(shù)據(jù)處理的方法。ICadLayer(繼承自ILayer)ICadDrawingLayers下面的代碼是將一個CAD文件添加到地圖對象中去:privatevoidAddCADLayer() {IWorkspaceFactorypCadWorkspaceFactory=newCadWorkspaceFactoryClass();

IWorkspacepWorkspace=pCadWorkspaceFactory.OpenFromFile(@"C:\arcgis\ArcTutor\Editor\ExerciseData\EditingCAD",0);

ICadDrawingWorkspacepCadDrawingWorkspace=pWorkspaceasICadDrawingWorkspace;

ICadDrawingDatasetpCadDataset=pCadDrawingWorkspace.OpenCadDrawingDataset("PARCELS.DWG");

ICadLayerpCadLayer=newCadLayerClass();

pCadLayer.CadDrawingDataset=pCadDataset;

axMapControl1.AddLayer(pCadLayer,0); }publicIWorkspaceOpenFromFile(

stringfileName,

inthWnd

);

publicICadDrawingDatasetOpenCadDrawingDataset(stringName

);

Cad文件作為Feature對象CAD文件作為要素數(shù)據(jù)被讀取的時候,使用的方法和IFeaturelayer是一樣的,需要注意的是它是作為一個要素數(shù)據(jù)集的形式而存在的。一個DWG文件在Map看來是一個要素數(shù)據(jù)集,其中的類簡單分為點、線、面和文字標注四種類型,其中文字需要使用標注圖層而不是要素圖層。下面的方法是把CAD文件當作要素數(shù)據(jù)集來獲取,然后加入Map對象中。privatevoidAddCADFeatures(){IWorkspaceFactorypCadWorkspacefactory=newCadWorkspaceFactoryClass();

IFeatureWorkspacepWorkspace=pCadWorkspacefactory.OpenFromFile(@"C:\arcgis\ArcTutor\Editor\ExerciseData\EditingCAD",0)asIFeatureWorkspace;

IFeatureDatasetpFeatDataset=pWorkspace.OpenFeatureDataset("PARCELS.DWG");

//pFeatClassContainer可以管理pFeatDataset中的每個要素類

IFeatureClassContainerpFeatClassContainer=pFeatDatasetasIFeatureClassContainer;

IFeatureClasspFeatClass;IFeatureLayerpFeatLayer;inti;

publicIFeatureDatasetOpenFeatureDataset(stringName);//對CAD文件中的要素類進行遍歷處理for(i=0;i<=pFeatClassContainer.ClassCount-1;i++){pFeatClass=pFeatClassContainer.get_Class(i); if(pFeatClass.FeatureType==esriFeatureType.esriFTCoverageAnnotation)

{

//標注類型,必須設置為標注圖層

pFeatLayer=newCadAnnotationLayerClass();} else

{

//點線面類型

pFeatLayer=newFeatureLayerClass();

} pFeatLayer.Name=pFeatClass.AliasName; pFeatLayer.FeatureClass=pFeatClass; axMapControl1.AddLayer(pFeatLayer,0);}}5.2.6

底圖圖層地圖的高質量顯示始終是地圖設計的主要目標之一。提升顯示性能的途徑之一是使用底圖圖層。底圖圖層是ArcGIS10中新增的一項功能。底圖圖層(BasemapLayer)是一種特殊的圖層組(GroupLayer),用于可視化以及漫游時存儲參考圖層,比如影像圖,街道以及地塊。BasemapLayer使用優(yōu)化的繪制邏輯并且提供了連續(xù)繪制的方案。由于底圖圖層相對穩(wěn)定,不常發(fā)生變化,因此其顯示只需計算一次,然后便可以多次重復使用。首次以特定的地圖比例訪問某個區(qū)域時,會對底圖圖層的顯示進行計算;以后再以此地圖比例訪問該區(qū)域時,可調(diào)出該顯示。BasemapLayer是用高性能的多線程繪制引擎繪制的,因此在提供地圖顯示和響應速度方面的效果是非常顯著的。如果圖層位于底圖圖層中,則無法對圖層的絕大多數(shù)屬性進行修改;僅常規(guī)和緩存(如果適用)選項卡中顯示的屬性可進行修改。如果正在使用底圖圖層,則無法對其中的內(nèi)容執(zhí)行數(shù)據(jù)更新操作。如果需要編輯數(shù)據(jù)或更新圖層,只需將該地圖圖層拖出底圖即可,然后可再將更新后的圖層拖回到底圖圖層中。使用BasempaLayer類可以通過編程方式創(chuàng)建底圖圖層。BasemapLayer實現(xiàn)了IGroupLayer接口。在創(chuàng)建底圖圖層時,首先需要設計底圖圖層,識別出地圖顯示中相對穩(wěn)定的圖層以及繪制的比例;然后把圖層加入到BasemapLayer對象中。BasempaLayer實現(xiàn)的另一主要接口是IBasemapLayer,用于管理底圖圖層及其緩存。BasemapSubLayer有選擇性地暴露了圖層的行為,以便執(zhí)行一些通用任務,如識別(identify)圖層上的要素。使用IBasemapSubLayer.Layer

屬性可以訪問底圖圖層中的子圖層;有些數(shù)據(jù)源、圖層類型和符號化屬性與底圖圖層的繪制引擎不兼容;當通過編程將圖層添加到底圖圖層時,使用IBasemapSubLayer.GetConversionStatus屬性來確認該操作是成功了還是失敗了。RasterBasemapLayer

是一種特殊類型的BasemapLayer,是為了提高顯示性能,是對單個柵格圖層的包裝。BasemapLayer背后的緩存機制聯(lián)合使用了內(nèi)存緩存和磁盤緩存;為了不消耗過多的內(nèi)存,應盡可能使用少量的底圖圖層。以下代碼演示了如何創(chuàng)建底圖圖層,然后添加一個已有的圖層到該底圖圖層,再將該底圖圖層添加到地圖對象中。privatevoidCreateBasemapLayerAndAddLayerToIt(IMapmap,ILayerlayer){IBasemapLayerbasemapLayer=newBasemapLayerClass();

IGroupLayerbasemapGroupLayer=basemapLayerasIGroupLayer;basemapGroupLayer.Add(layer);basemapGroupLayer.Name="BasemapContent";map.AddLayer((ILayer)

basemapLayer);}以下代碼演示了如何訪問一個底圖圖層的子圖層:privatevoidUpdateBasemapSublayerAndNotify(

IBasemapLayerbasemapLayer,IMapmap){ICompositeLayerbasemapCompositeLayer=basemapLayerasICompositeLayer;

IBasemapSubLayerbasemapSubLayer=basemapCompositeLayer.get_Layer(0)asIBasemapSubLayer;

ILayerinnerLayer=basemapSubLayer.Layer;

IFeatureLayerfeatureLayer=innerLayerasIFeatureLayer;

…//對子圖層屬性進行修改,

//對子圖層屬性進行修改后,要進行更新,創(chuàng)建新的顯示緩存basemapLayer.NotifyLayerChanged

(basemapSubLayerasILayer,esriLayerEventHint.esriLayerEventHintProperties,null);

IActiveViewactiveView=mapasIActiveView;activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography,basemapLayer

asobject,null);}§5.2.7

ZoomToLayerpublicoverridevoidOnClick(){if(m_hookHelper.HookisIMapControl3){m_mapcontrol=m_hookHelper.HookasIMapControl3;currentLayer=m_mapcontrol.CustomPropertyasIFeatureLayer;m_activeView=m_mapcontrol.ActiveView;}if(m_activeView==null)return;

m_activeView.Extent=((IGeoDataset)currentLayer).Extent;

m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography,currentLayer,m_activeView.Extent);}IActiveView§5.2.8

LayerSelectablepublicoverridevoidOnClick() {

IFeatureLayerlayer=(IFeatureLayer)m_mapControl.CustomProperty; if(m_subType==1)layer.Selectable=true; if(m_subType==2)layer.Selectable=false; }publicsealedclassLayerSelectable:BaseCommand,ICommandSubType

{

privateIMapControl3m_mapControl;

privatelongm_subType;

publicoverridevoidOnClick()

{IFeatureLayerlayer=(IFeatureLayer)m_mapControl.CustomProperty; if(m_subType==1) layer.Selectable=true; if(m_subType==2)layer.Selectable=false;

}

publicoverridevoidOnCreate(objecthook)

{

m_mapControl=(IMapControl3)hook;

}

publicoverrideboolEnabled

{

get

{

ILayerlayer=(ILayer)m_mapControl.CustomProperty;

if(layerisIFeatureLayer)

{IFeatureLayerfeatureLayer=(IFeatureLayer)layer;

if(m_subType==1)return!featureLayer.Selectable;

elsereturnfeatureLayer.Selectable;

}

else

{

returnfalse;

}

}

}

publicintGetCount()

{ return2;

}

publicvoidSetSubType(intSubType)

{ m_subType=SubType;

}

publicoverridestringCaption

{

get

{

if(m_subType==1)return"LayerSelectable";

elsereturn"LayerUnselectable";

}

}}§5.2.9

所有圖層可見privatevoidTurnAllLayersOn(IMapm_map){

ILayerlayer=null;for(inti=0;i<m_map.LayerCount;i++){layer=m_map.get_Layer(i);layer.Visible=true;}}§5.3地圖顯示(MapDisplay)顯示對象(Displayobjects)負責將地理要素的幾何形狀等繪制到輸出設備(screen,

printer,

exportfiles)上.有兩類標準的顯示對象:ScreenDisplay:是對普通的應用程序窗體的抽象,它實現(xiàn)了滾屏和后臺存儲功能。

SimpleDisplay:是對其他的使用Windows設備上下文(WindowsDeviceContext)著色的設備的抽象,這些設備包括打印機、元文件(metafiles)、位圖(bitmaps)和次要窗體(如對話框dialogboxes、警示框alertboxes)?!?.3.1ScreenDisplay對象ScreenDisplay是與一個窗體相聯(lián)系的顯示設備,除了管理窗體屏幕的顯示屬性外,還管理發(fā)生在顯示背后的對象和行為,如緩存和屏幕變化等。對于Map或PageLayout對象,可以通過IActiveView.ScreenDisplay屬性獲得ScreenDisplay對象。IActiveViewpActiveView=axMapControl1.ActiveView;(IActiveViewpActiveView=pMapasIActiveView)(IActiveViewpActiveView=pPageLayoutasIActiveView)IScreenDisplayscreenDisplay=pActiveView.ScreenDisplay;主要接口ScreenDisplay類主要實現(xiàn)了IScreenDisplay3

接口,該接口繼承了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論