實驗報告4Arcgis engine二次開發_第1頁
實驗報告4Arcgis engine二次開發_第2頁
實驗報告4Arcgis engine二次開發_第3頁
實驗報告4Arcgis engine二次開發_第4頁
實驗報告4Arcgis engine二次開發_第5頁
已閱讀5頁,還剩44頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、ArcGISEngine二次開發實驗 實驗報告四ArcGISEngine二次開發班級:15級交通工程姓名:黃文峰學號:153080142018年6月27日星期三目錄TOC o 1-5 h z HYPERLINK l bookmark4 一、實驗目的3 HYPERLINK l bookmark6 二、實驗原理3 HYPERLINK l bookmark8 三、實驗軟件3四、實驗材料3 HYPERLINK l bookmark12 五、實驗內容及步驟3 HYPERLINK l bookmark14 51地圖顯示3 HYPERLINK l bookmark40 52屬性査詢953空間査詢12 HYP

2、ERLINK l bookmark80 BaseCommand開發實例18 HYPERLINK l bookmark106 BaseTool開發實例22 HYPERLINK l bookmark152 56通過代碼添加圖冊27 HYPERLINK l bookmark192 六、實驗心得33 HYPERLINK l bookmark196 七、附錄(完整代碼)34一、實驗目的1、結合第二次實驗(高德地圖開發實驗)的VS開發經驗,對ArcGIS地圖進行二次開發。2、認識并掌握ArcGISEngine-次開發方法,為以后進行更復雜的開發操作打下基礎。3、通過ArcGISEngine二次開發,實現屬

3、性查詢、空間查詢、導入文件等功能,完成一個小型GIS應用程序的制作。二、實驗原理ArcGISEngine是開發者用來構建應用程序的一整套嵌入式GIS組件,使用ArcGISEngine,可以將一些GIS功能嵌入到已有的應用程序中,建造有針對性的客戶應用程序用來將高級GIS系統與他人分享。ArcGISEngine有一個軟件開發包(softwaredevelopmentkit,SDK)和一個給所有ArcGIS應用提供平臺的運行許可(runtime)構成。:、實驗軟件VisualStudio2010;ArcMap10.0;ArcGISEngine10.0;Microsoftoffice實驗材料中國地圖

4、文件。五、實驗內容及步驟5.1地圖顯示5.1.1創建一個新的工程打開VS2010ArcGISEngine二次開發實驗ArcGISEngine二次開發實驗“文件”-“新建”-“項目”N氏-MKfauHt”wd幾9(0ZDt.*V|SAXJKDM6)TCWMMVA-丄blbmuStWl.從*:妣憐門.S-*NCb1S4iSIVisualStudiaiOlOAh口JMTi&prSVisualC#”圖瀏覽”-選擇保存的位置AS.NtTWbeAi.NETMVC2Mb朋用巧5W0ta曲亦IM:畑H5ARILA7JETR4fne*0fk4-*W:W炯32MttWVoud8or|ms|VraudFS2IHiW

5、indows窗體應用程序”-更改文件名稱為“地J.0.vICVsuilCVsuilCVU4lCascascU3CVsuiicUctuICascascXB:Vk*IC*用于TtWMc*K俺ag:tssaa遍二(y力袒刃5呂如厲tc珈代肴ELDFhi“d打開Form窗體的屬性欄,更改name為MainForm,更改text為地圖瀏覽。ArcGISEngine二次開發實驗ArcGISEngine二次開發實驗 MainFormSystem.Windows.Forms.FormAccessibleNameAccessibleRoleDefault(Name)LanguageLocalizableLock

6、ed|MminRonn(Default)FalseFalsel(ApplicationSettings)t(DataBindings)TagJ外戲BackColorControlBackgroundimage(x)BackgroundlmageLaTileCursorDefaultAFont就9ptForeCclorControlTextFcrmBorderSt)leSizableRightToLeftNoRightToLcftLayoutFalse三抱圖瀏覽UseWaitCursorFalseAcceptButtonCancelButtonKeyreviewFalseJ5丄2添加控件及引用在

7、工貝箱中找到uMapControl和LicenseControl,拖拉之Form窗體中。丄ArcGISWindowsForms2FormlPageLayoutControITOCControlToolbarControlSceneControlArcGIS10.0EngineMapControlName:axMapControllGlobeControLLicenseControl卷SymbologyControlArcReaderControl尋ArcReaderGlobeControI5.1.3添加地圖點擊“MapControl”,右鍵選擇“屬性”。在“屬性”頁中選擇Map頁,點擊圖層添加

8、按鈕,添加“bou2_4p”o此時,點擊調試,會彈出一下警告。MicrosoftVisualStudioSystem.IrYdlidOpcraticnExccption*類型的耒經處連壯異帛出現在丄ESRIrcGISxControls-dll艮慚三曰ArcGISversiornotspecified.YoumustcallRuntimeMarager.BindbeforecreatinganyArcGIScomponents.中斷(B)需要在Program,cs中添加runtime的說明|usingESRI.ArcGI:.stticclassProgram-./Th業maiTieritrypo

9、intotth$applica-tioii./血遼STAThredst&tievoidM&in()ri(!Runt1mdilan.ger.Bind(ProAuctCode.EngineOrDesltop)MeesageBox.Show(UnabletobindtoArcGISruntime.Applicatlonwilll)eskutdown.:return:人ppii亡殳七ion.EnableVizualStyles();kpplication.SetCCbmptibleTextRmnwf:i:rLgDault(lse);kpplication.Run(newMainForm():再次點擊運

10、行,成功。5.1.4地圖縮放功能雙擊MapControl”屬性欄中的uOnMouseDownvLocatiorChangedMarginChaMouseCaptureChanMoveOnAfterDrav/OrAfterScreenDrsv,OrBcforcScrcenDraOnDoubleClickOrExtentUpdatedOnFullExtentUpdateOnKeyDojvnOrKcyUpOnMdpRepbcedOnMouseDov/nOnMouscMoYcOrMouseUpOrOleDropOrScIcctionChargctOrViewRefreshedPaddingCh3nge

11、dParentChangedPreviewKeyDov/nRegionChanged在該處代碼中添加代碼如下privatevoidaxMapContro1l_0nMouseDown(objectsender,ESRI.ArcGISControlsIHapControlEvents2_0nHouseDownEvente)/左鍵框選區域可以進行放,右鍵可以漫游地圖if(e.button=1)thisaxMapContro11.Extent=thisaxMapContro11.TrackRectangleO;elseif(e.button=2)thisaxMapContro11.PanO;/*/左鍵

12、框選區域可以進行放,右鍵單擊可以還原地圖if(e.button=1)thisaxMapContro11.Extent=thisaxMapContro11.TrackRectangleO;elseif(e.button=2)this.axMapContro11.Extent=thisdxIapContro11.FullExtent;*/5.1.3運行結果點擊運行,成功。結果如下。5.2屬性査詢5.2.1添加控件在工具欄中找到label和textbox,拖拉到Form窗體中。城市名稱并將Label控件的“Text”屬性修改為城市名稱”,TextBox控件的Name屬性修改為txtStateName

13、o外現BackColorBorderStyleCursorFlatStyleFontForeColorImage1IControlNoneDefaultShndard超,9ptControlText氏ImageAlignMiddleCenterImage!ndexImageKeyImageList(無)RightToLeftNoText|城市名稱TextAlignTopLeftUseMnemonicTrueUseWaitCursorFalse設計(Name)ItxtStateNameGenerateMemberTrueLockedFalseModifiersPrivateL/daUIL5.2.

14、2添加代碼首先,查看項目中己添加的引用,并在“引用”處右鍵,點擊“添加引用”。解決方瑋諒苣理器謁層國|員R徐去方妻M/nFoEO個項目)t旬PropertiesaiaiA陰徐去方妻M/nFoEO個項目)事MainFormt旬PropertiesMainFormorm1.csForml.resx:crm2.cs這個項目中我們需要使用ESRI.ArcGIS.Cartov和4ESRI.ArcGIS.Geodatabase兩個引用項,這里UESRI.ArcGIS.Carto在添加MapControl控件時己自動添加,我們只添加UESRI.ArcGIS.Geodatabase,點擊確定。8添加引用NET

15、|cOM|項目|測覽|垠近|筒選為:.NETFramev/crk3.5細牛名稱皈本運行對路徑AESRl.ArcGlS.EditorExtV2.0.50727D:ProgramFiles(x86).ESRI.ArcGIS.EngineCorev2.0.50727D:ProgramFiles(x86).ESRI.ArcGIS.Framcworkv2.0.50727D:ProgramFiles(x86).ESRI.ArcGIS.GeoAnalystV2.0.50727D:ProgramFiles(x86).ESRl.ArcGIS.Geodatabaseib.6.6.6V2.0.50727D:Prog

16、ramFiles(x86).ESRI.ArcGIS.GeoDataba.v2.0.50727D:ProgramFiles(x86).1ESRI.ArcGIS.GcoDataba.v2.0.50727D:ProgramFiles(x86).ESRI.ArcGIS.GeoDataba.V2.0.50727D:ProgramFiles(x86).ESRl.ArcGIS.GeoDataba.V2.0.50727D:ProgramFiles(x86).ESRI.ArcGIS.Geometryv2.0.50727D:ProgramFiles(x86).ESRI.ArcGIS.Geoprocess.v2.0

17、.50727D:ProgramFiles(x86).ESRI.ArcGIS.Geoproccss.v2.0.50727D:ProgramFiles(x86).V取消之后雙擊TextBox控件,進入forml.cs代碼編輯界面。輸入上述說明。*|usingESRIArcGIS.Carto;usingESRI.ArcGIS.Geodatabase:返回Fcrnn設計窗1丨,點擊TextBox查看屬性欄,找到“KeyUp”爭件,雙擊進入編輯。nxi3D丄eax-nageaEnt色:rFoiltChang:Ed.ForeColorCkangeGiveFedbackHelpReq.ue5tedHiAeS

18、electionCk:ImeModeChagedKeyDownKeyPressKeyUpLayoutLeaveLocationChang:電d.MrginChangedFfloiiiedChangAfflonseCaptureChajMouzeClickprivatevoidtxtStateNameKeyUp(objectsenderKeyEve)/判斷鼠標鍵值,如果Enter鍵按下抬起后,進入查詢if(eKeyCode=Keys.Errtgr)”定義囹層,要素游標,查詢過廳器,要轟IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor:

19、IQueryFilterpQueryFilter;IFeaturepFeature;|獲取囹層pFeatureLayer=this1MapgetLymi:(0)asIFeatureLayer:/如果圖層名稱不是states,程序退出if(pFeatureLayer.Name!=bou2_4p)“turn;猜除上次查詢結果thisaxMapControl1爪勺口ClearSelectionO:/pQueryFilter的實例化pQueryFilter=newQuerjFilter():設養查詢迥謔條件pQueryFilter.V/hereCLause=NAME二+txtStateName.Tex

20、t:+查詢pFeatureCursor=pFeatureLayerSearch(pQueryFil/ter,true);淞取查詢到的要壽pFeature=pFeatureCursorNextFeature():/判斷是否菇取到要麥if(pFeature!=null)/選擇要臺this.axMapControl1Map.SelectFeature(pFeatureLayer,pFeature):敢大到要素this.axJiUpControll.Exterrt=pFeat-ure.Shape.Envelope;else5.2.3運行結果成功。分別向編輯框中輸入“吉林省”和“長春省”,鍵入回車,如下

21、圖所示:(5在碉旦取囪A5.3空間査詢5.3.1添加控件向Form窗II添加四個bottom和一個textbox。按照下表要求更改各個button和textbox的屬性類型NameText用途TextBoxtxtTips請在地圖上選取地物!系統操作提示ButtonbtiiPointQuery點查詢點査詢ButtonbtiiLineQuery線查詢線査詢ButtonbtiiRectQuery矩形查詢矩形査詢ButtonbtnCircleQuery圓査詢圓査詢得到結果如下5.3.2添加代碼先在類中添加一個公共函數,用來根據屏幕像素計算實際的地理距離。并在類中添加一個全局變量mMouseFlag的整

22、數定義。publiepartialclassJi(airiForjn:ForinintmlilouseFlag:Iff/根拐屏幕像素計算實際的地理距離/IffMIffparamnauiypixelUnif像素個數psirain/privatedoubleConvertPixe1ToMapUnitsCIActiveVievactiv&View,doublepix&LUnits)doublerealtorIdDiaplayExterrt;intpixelExtent:doublesizeOfOnePixel;doublentapUnits;獲取設笛中視園顯示賈度,即像素個數pixelExterrt

23、=activeView.ScreenLisplayDisplayTransfornation.get_I)evicFrame()r:荻取地冒坐標系中地囹顯示范國一realWorIdDiap1ayExtent=activeVievScreenDisplayDisplsyTrarisfonnalionVisibleBi:每個橡素大小代表的實際距離sizeOfOnePixel=realWorldDiap1ayExtent/pixelExt&nt:地理距離napUnits=pixeLUnits*sizeOfOnePixelwtummapUnits:然后添加空間查詢的方法,空間查詢函數代碼如下:(下方代

24、碼為截圖,由于代碼過長,完整代碼請查看附錄)/主間直詢/MapControlIII空間查詢方式/paramIII名稱/查詢得到的要素名稱privatestringQuerySpatial(AxMapControlmapCorrtrol,IGeometrygeometry,stringfieldlfame)/本例添加一個囹層迸行査飼,多個圖層時返回if(mapContro1LayerCount1)returnnull:/唐除已有選擇mapContro1MapClearSelection():/查詢得到的要奉名稱stringstrNames=null;IFeatureLayerpFeatureLa

25、yer;IFea-tureClasspFeatureClass:/獲取囹層和要素類,為空時返回pFeai:ureLayer=mapControlgel:_L3y國Properties立引朝FixedZQQmIn,bmp|FixedZoomIn.cs|也Forml.Designer.es國Forml.resx皙Program.cs將base.m_captionbase.m_toolTip更改為居中放人,將base.m_name更改為uFixedZoomInM。/TODO:DefinevaluesforthepublicpropertiesbaseiR_categ:ory尸亠牛7繪nr審jizab

26、letextbase,mcaption=居中放大:|/localizablebase.m_messagibase.jn_toolT|ii:=居中放大:/localizablevFixedZoomIn:y/uniqueid.baseinname、cd點擊“+”打開這段代碼FixedZoomIn.es*XizabletextbletextProgram.csFormLcs*Formlxs(i+j*43S5Sx.FixedZoomInprivateI?tookHclpern.hookHclper:publicFixedZooalriOLtiICO%texttextnon-localizable(巳.

27、gMyCategory_MyComniand)7FxedZoomlnO/70DO:Definevaluesfar-thepublicpcopertiexbasex_category=/localizabletextbgeT_c8Dtion=居申尅衣Z/localizablobase.x_nes5age=/IocaLaxabletextbase,xjtoollfp二IS中加大二/localixableb矽0_Ti3ne=Fiedlooaln/uniqueid.tex-tnori-localizable(gategory_yyonaaridr)try“f!TODO:chanssbitmapnane

28、ifnecessary/bitnapResourceXane=GetType().N&Jie4-.brp:bareJi_bitnap=nvvBxtnap(GrtType05btJiapResouxceEf&Jie).catch.(Ezcoptiones)Sys-tea.Dianozticx.frjiuuUr(ex.f(巴*InvalidBitmap).Hf在OnClick()函數中添加如下代碼publicoverridevoidOnClick()/TODO:AddFixedZoomln.OnClickiinplejnentation獲取當前視圖范凰IActiveViev/pActiveViev

29、=m._h.ookHelper.ActiveViev;IErivelopepEnvelope=pActiveViewEtErrt;擴大視囹范國并刷新視圖pEnvelope.Expand(IL50.53true):pActiveView.ExtErrt=pEnvelope:pActiveView.Refresh();#endreg:ion轉到主窗體(MapViewForm),雙擊“居中放人”按鈕,進入該按鈕Click事件相應函數,添加如下代碼:privatevoidbtnZoomln_Click(objectsender,EventArgse)聲明與初始化FixedZoomlnfixedZoom

30、in=newFixedZoomln();與MapContro咲聯fixedZoomin.OnCreate(this.axMapControl1.Object);fixedZoomin.OnClick();5.4.4運行結果點擊“局部放大”,結果如卞5.5BaseTool開發實例5.5.1添加控件在主窗體(MapViewFonn)中添加一個Button將其Name屬性改為btnZoomln,Text屬性更改為“拉框放大”O5.5.2添加BaseTool在菜單欄上選擇“項目”一一“添加類”,在類別中選中ArcGIS,在模板中選擇BaseTool,并將名稱更改為Zoomln”,點擊添加Desktop

31、Add-InsExtendingArcObjecteReportingWorWlowArcGISDSWPFWindowFormsWeb-VisualOCreateatodtobeusedinArcGISapplications話i(痔項-ttESS!rZoomln.csifejGCAlArc61SClassVisualC*現BaseCommandVisualCrBaseMenuVisual項8aceToolVisual項BaseToolbarVisualCBaseToolbar|ApplicMienEjctension(Desktop)Visualc#43ContextMenuiDesktop

32、JVisualC#USDockableWindow(Desktop)VisualC#J5Just-In-TimeExtension(Desktop)Visual項PropertyPage(Desktop)VUwlC譏ContextMenulEngineJVisualC*J5J*SS:VisualCffJ出現如卜對話框選擇“MapControlorPageLayoutControlCommandv點擊OK。5.5.3添加代碼雙擊解決方案資源管理器中的Zoomln.cs,進入該類的代碼編寫界面。首先添加ESRI.ArcGIS.Carto、ESRI.ArcGIS.GeodatabasesESRI.A

33、rcGIS.GeometryESRI.ArcGIS.Display四個引用usingESRI.ArcGIS.Carlo:usingESRI.AhcGISGeodal:Ebaisg;usingESRI.ArcGIS.Geometry:usingESRI.ArcGIS.DigplNy:/TODO:Definevaluesforthepublicproperties/base.category=:/localizabletextbase.m._cap-tion=扌立框的夭:/localizabletextbase/localizabletextbase.jrL_-toolIip=拉框笊大;/loca

34、lizabletextbase.m._nanie=EoomlrT:/uniqueidnon-localiztry/在Zoomln.es中定義一下變量1匚廠二1Program.esForml.csForml.cs設計宅地囹瀏覽.Zoomln電OiE:namespace地圖瀏覽/SnjniTLarydescriptionforZoomln./GuidCaadb0ee5-4649-4948-966f-96ee0d752068)ClassItiterface(ClassIrrterfaceTj.TeNone)Progld(ff地囹瀏覽.Zoomln*)publicsealedclassZoomln:B

35、aseToolS|20MRegistrationFunction(s)|記錄鼠標位羞privateIPointm.poirrt:標記MouseDown是否岌生privateBooleanm_isMouseDown;追蹤鼠標移動產牢新的EnvelopeprivateINewEnve1c-pFeedbacknifee-dBack;在Zoomln.cs類中的OnMouseDown函數中添加如卜代碼:publicoverridevoidOrJilouseDown(intButton,intShifintX,intY)/TODO:AddZoomln0nJitouseDov/niiriplementati

36、on當前地圖視圖為空時返回if(jn_hookHeLperActiveView=nul1)return:獲取鼠標點擊位蓋mpoirrt=jn_hookHelper.ActiveView.ScreenLisplay.DisplayTransforjnation.ToMapPoint(XjY);jn_isMouseDown=true:在Zoomln.cs類中的0nMouseMove函數中添加如卜代碼:publicoverridevoidOnlouseMove(intButton,intShift,intX,intY)|/TODO;AddZoojnln.OnlilouseMoveinplejnent

37、ation/MouseDom為發生時返回if(!in_isMouseDown)return:IActiveViewpActiveView=m_hookHelperActiveView;/m_feedBack追焦鼠標移動if(m_feedBaci=null)m_eedBacl=newNewEnvelopeFeedback();m_eedBacl0)thisaxMaLpCon:ro.l.C.e:8i7L:ayEi:s():5.6.3通過代碼添加MXD文件雙擊“打開MXD”按鈕,進入代碼編輯界面,添加代碼如下:privatevoidbtrJfed_Click(objectsen.deEventArg

38、se)一文件路徑名稱包含文件名稱和路徑名稱string:strName=null;定義OpenFileMalog,獲取并打開地囹文檔OpenFileDialogopenFileDialog=nevOpeiiFileDialog();openFil&Dialog.Title=打開MXD;openFileDialog.Filter=MXD文件(札mxd.)|冰nLxcT:if(openFileDialog.ShowDialogO=DialogResult0K)strNam.e=openFileDialogFileName:if(strlfame!=)thisaxNapControllLoadftt

39、xFile(strName):1地圖文檔全圖顯示this.aiKMapControll.Extent=this11.FullExtent:5.6.4通過代碼添加shp圖層文件雙擊“添加Shp”按鈕,進入代碼編輯界面,添加代碼如下:privatevoidbtnShpClick(objectsender,EventArgse)文件路徑名稱,包含文件名稱和路徑名稱stringstrNane=null:文件路徑stringstrFilePath=null;文件名稱stringstrFileName=null;走義OpenFileDialo?J荻取笄打開地圖文檔|OpenFileDialogopenFi

40、leDialog=nevOpenFileDialog():openFileDialog.Title=添加Shp:openFileDialog.Filter=shp文件(札shp)|札shp:if(openFileDialog.ShowDialog()=DialogResuIt.OK)stxllame=openFileDialog.FileName;if(strUaiTie!=“)strFilePath=SystemI0Path.GetDirectoryNaine(strName):strFilelIaine=SystemI0Path.GetFiLeNajiieVithoutExtension(

41、strNane):thisaxMapCont工oil.AddShapeFile(strFilePath,strFileName):地圖文檔全圖顯示this.axMapControll.Extent=this.xMapConiroll.FullExtent;5.6.5通過代碼加載GeoDatabase中的數據需要添加“ESRI.ArcGIS.GeodatabasJ、UESRI.cGIS.DataSourcesGDB和“ESRI.ArcGIS.Carto”三個命名空間。usingusingusingusingusingESRIArcGISCarto;ESRI.ArcGIS.Geodatabase;

42、ESRIArcGIS.Geometry:ESRIArcGISControls;ESRI.ArcGIS.DataSourcesGDB:該方法根據指定的路徑名稱讀取mdb,并返回其中包含的要素類,代碼如卞:privateList0penJdb(strin2mdbpath)ListpDatasets=newList();ListpFeatureClasses=nevList():定義空間工廠,打開脳b數振庫IWorkspaceFactorypAccessFactory=newAccessWorkspaceFactoryO:IWorkspacepVorkspace=pAccessFactory0pen

43、FromFile(jndbpath,0)敦取數據隼的集臺IEn-jmlatasetpEnumDataset=pWorkspacegetDatasets(esriDataset:ypeesriDTAny):pEnjjnDataset.Reset():IDatasetpDataset=pEnumDataset.HeirtO:vhile(pDataset!=null)/數揺集為featuedatasBtif(pDatasetisIFeatureDataset)stringstrDatasetName=pDataset.Name;/走義要素工廠,獲取要素奕的集臺IFeatureWorkspacepFe

44、atureWorkspace=pWorkspaceasIFeatureWorkspace;IFeatureDatasetpFeatureDataset=pFeatureWorkspaceOpenFeotureDataset(stzDotasetName):IEnunDatase-tpEnumDataset2=pFeatureDataset.Subsets:pEnxiJiDatasetReset():IDatasetpDataset2=pEnunDatasetHext();/7應為妥素類的隼合嗎,并特旻素類加入妥素類隼合pFe/ueCL/seswhile(pDataset2!=null)if(p

45、Dataset2isIFearureClass)pFeaturClassesAddlpDztasert2asIFeatnreClass).pDataset2=pEnunLatasct2.Ncxt();1pDatasctbAdd(pDataset);1pDataset=pEnunDatasctKext();1returnpFGaturcClasses;雙擊“添加GDB數據”按鈕,進入代碼編輯界面,添加代碼如下:privatevoidbtnGdbVector_Click(objectsender,EventArgse)Z/)kOpenFileDialog,獲取路彳仝OpenFileDialogop

46、enFileDialog=newOpenFileDialog:():openFileDialog.Title=潘加GDB矢重數扌居:openFileDialog.Filter=WMDB文件(Xmdb);定義數據隼的集臺,用于存儲mdb中的數揺隼ListCIDataseipDatasets=nevrList():走義要素真隼合,用于獲取數據隼中的要表類ListpFeatureClasses=nevList():if(openFileDialog.ShowDialogO=DialogResultOK)獲取數據集的集臺pFeatureClasses=this0penKdb(openFileDialo

47、gFileNajne):變里要袁類隼合的每個要秦類foreach(IFeatureClasspFeatureClassinpFeatureClasses)IFeatureLayerpFeatureLayer=nevrFeatureLayer():pFeatuxeLayer.FeatuxeClass=pFeatureClass;/要耒囹層加入.到MapControlthisaxMapContro11.AddLayer(ILayer)pFeatureLayer):thisaxHspCorrt工oil.Eicterrt=thisaxMaLpCon:ro.l.FullEx1:En:5.6.6運行結果打

48、開MXD文件矩吧EiUora農;*wr,KINGSTON夬2O1W2O1B09xnsROEZOlWld1024xnsnwi占t0tl2013/QM時6久缺匕NS&t)二vs2oio(64ai2bai2O1W17M7axtsafieo辭WMia/31LM公葉疋;)zoiwz;lawXU*ONGSTON心20恥01151司儀網Q燦2013/U21)10ArcMopC*O.201W1Qi&lQrriRlArcMopDa切mQU721&STOXtt(2)exwtoLK!LImb戛&卻上及xi毛“添加shp”OTieMoEDaM呂0TBKRSB,ttWCJCNOSTCN(GJ,croff畑JCfVBW-

49、JtUKftZttMOjsncftg5iftTBO2?血Z4iWM/101S5m心qrwt詩dfiu1今MV4ZL0訃術心QDWwewjSz.q19MM4015WAWCADftflrCft22詁/10-reftquMjyfre1rjazoasaus:Q0AutoCAD19外WIO15tio心QDExa僚W/10I12AjtcCApftrciil屮SOISiU心QDfHVrcfi;dfi?.5IWiM/IO1?:17AutoCADftJItXR4X_4nQlWftM/1015:134AAJUMABOfi占J刀沐5.4冋TON&O砂Eft(H)*4W?2M.aj*z(um“添加GDB矢量數據”as

50、aczMxfflES&畑夠UMO|回噲iaJ能堆囹上進取加I副宣詢I居中於大拉衽戰大I有空臣層I打開渤PShp城市毎稱點童馮II線舸II圍卿I這是本學期第二次使用VS進行地圖的二次開發實驗。六、實驗心得本次的engine二次開發使用的是C#語言。雖然說之前的高德地圖API開發也曾使用過該語言,有了一定的入門基礎。但是相比起之前的API開發可以參考模板代碼,這一次的engine二次開發更加困難,我們需要根據教程的步驟去理解代碼之間的邏輯關系,理解不同功能代碼的編寫規則。老師發給我們的教程中,有很多代碼是有錯誤或者缺漏的,這需要我們在調試的時候一個個地找出來,對于像我這樣的入門者而言,是一件很有挑

51、戰性的工作。這個挑戰,包含著調試失敗的失落,也有著運行成功時的歡喜。通過這一次的開發實驗,讓我有了更多機會去接觸、學習C#語言。一開始做這個實驗的時候,心里對代碼這種東西是挺害怕的,害怕這一串長長的代碼滿是bug、運行失敗,但當看見自己通過代碼寫出來的開發頁面可以運行各種功能時,心里也很是開心和興奮。一串串代碼就像魔法星塵一樣,撒在編輯框內,然后就可以生成不同功能的地圖功能,也是挺好玩的事情。七、附錄(完整代碼)usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usin

52、gSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geodatabase;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.DataSourcesGDB;usingESRI.ArcGIS.Display;namespace地圖瀏覽publicpartialclassMainForm:FormintmMouseFlag;IIIII

53、I根據屏幕像素計算實際的地理距離IIIIII屏幕視圖III像素個數IIIprivatedoubleConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits)doublerealWorldDiaplayExtent;intpixelExtent;doublesizeOfOnePixel;doublemapUnits;獲取設備中視圖顯示寬度,即像素個數pixelExtent=activeView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().rightactiveView

54、.ScreenDisplay.DisplayTransformation.get_DeviceFrame().left;獲取地圖坐標系中地圖顯示范WrealWorldDiaplayExtent=activeView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;每個像素大小代表的實際距離sizeOfOnePixel=realWorldDiaplayExtent/pixelExtent;地理距離mapUnits=pixelUnits*sizeOfOnePixel;returnmapUnits;III/空間查詢IIIIIIMapCo

55、ntrolIII空間查詢方式III字段名稱III查詢得到的要素名稱privatestringQuerySpatial(AxMapControlmapControl,IGeometrygeometry,stringfieldName)本例添加一個圖層進行查詢,多個圖層時返回if(mapControl.LayerCount1)returnnull;清除已有選擇mapControl.Map.ClearSelection();查詢得到的要素名稱stringstrNames=null;IFeatureLayerpFeatureLayer;IFeatureClasspFeatureClass;獲取圖層和要

56、素類,為空時返回pFeatureLayer=mapControl.Map.get_Layer(0)asIFeatureLayer;pFeatureClass=pFeatureLayer.FeatureClass;if(pFeatureClass=null)returnnull;初始化空間過濾器ISpatialFilterpSpatialFilter;pSpatialFilter=newSpatialFilter();pSpatialFilter.Geometry=geometry;根據圖層類型選擇緩沖方式switch(pFeatureClass.ShapeType)caseesriGeomet

57、ryType.esriGeometryPoint:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;break;caseesriGeometryType.esriGeometryPolyline:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelCrosses;break;caseesriGeometryType.esriGeometryPolygon:pSpatialFilter.SpatialRel=esriSpatialRelEnum.

58、esriSpatialRellntersects;break;定義空間過濾器的空間字段pSpatialFilter.GeometryField=pFeatureClass.ShapeFieldName;IQueryFilterpQueryFilter;IFeatureCursorpFeatureCursor;IFeaturepFeature;利用要素過濾器查詢要素pQueryFilter=pSpatialFilterasIQueryFilter;pFeatureCursor=pFeatureLayer.Search(pQueryFilterztrue);pFeature=pFeatureCur

59、sor.NextFeature();intfieldlndex;while(pFeature!=null)選擇指定要素fieldlndex=pFeature.Fields.FindField(fieldName);獲取要素名稱strNames=strNames+pFeature.get_Value(fieldlndex)+;高亮選中要素mapControl.Map.SelectFeature(ILayer)pFeatureLayerzpFeature);mapControl.ActiveView.Refresh();pFeature=pFeatureCursor.NextFeature();r

60、eturnstrNames;publicMainForm()InitializeComponent();sender,privatevoidaxMapControll_OnMouseDown(objectESRI.ArcGIS.Controls.lMapControlEvents2_OnMouseDownEvente)if(e.button=1)this.axMapControll.Extent=this.axMapControll.TrackRectangle();elseif(e.button二二2)this.axMapControll.Pan();記錄查詢到的要素名稱stringstrN

溫馨提示

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

評論

0/150

提交評論