版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科生实验报告实验课程GIS课程设计
摘要针对本专业目前所学的GIS应用与GIS开发课程的要求,本次课程设计主要是对GIS二次开发与GIS软件应用进行相关编码和上机实验,主要利用ArcEngine二次开发平台和VS2013开发工具完成了地物统计的GIS二次开发实验、利用ArcGIS和Envi等相关软件完成了甘孜水利侵蚀的计算,旨在培养GIS的开发与应用能力,实际的问题解决能力和动手能力,加强了学生对GIS相关应用领域的理解。关键词:空间分析、算法、GIS应用、ArcEngine、ArcMap、Envi、甘孜、水利侵蚀目录实验一:ArcEngine二次开发实验:地物分类统计 实验一:ArcEngine二次开发实验:地物分类统计1.1.实验目的(1)熟练搭建ArcEngine开发环境,了解ArcEngine和ArcObjects相关接口和实体类(2)利用ArcEngine实现地物分类统计,缓冲区运算,拓扑运算和地图导出等功能(3)进一步熟悉ArcEngine开发接口以及高级功能,加深对GIS空间分析和空间统计的理解1.2.实验内容利用C#语言、VS开发工具、ArcEngine开发平台实现地物分类统计1.3.地物分类统计技术流程1.3.1算法思想及算法流程图算法基本思想:(1)二次开发Com组件ITool,分别是用于线统计和面统计两类的工具(2)数据输入及相关初始化,选择统计工具(3)如果统计工具是面统计,则获取地图控件的轨迹多边形,否则就是线统计,获取地图控件的轨迹线,并对线做35的缓冲区。使用IElement接口绘图,然后使用IActivView导出地图(4)使用IQueryFilter进行空间查询,然后使用IDataStatistics接口统计地类名称字段的值集合(5)遍历上步中的值集合,每个迭代中通过值构造sql语句where条件”地类名称=值”,同时结合(3)步中的轨迹多边形或者缓冲区,运用ISpatialFilter进行空间查询。遍历每个要素,统计该要素与轨迹多边形或缓冲区的相交图形的距离,从而得出每类地物的面积(6)使用IArea求出轨迹多边形或者缓冲区的总面积(7)相关结果可视化展示,算法结束算法流程图:图1-SEQ图\*ARABIC1地物分类统计流程图1.3.2关键代码实现该算法的核心代码如下:统计工具核心:///<summary>///SummarydescriptionforStaticTool.///</summary>[Guid("0428808a-4782-4f81-a0b3-93be6e9226dc")][ClassInterface(ClassInterfaceType.None)][ProgId("GisStatistics.Com.StaticTool")]publicsealedclassPolygonStaticTool:BaseTool{ ………privateIHookHelperm_hookHelper=null;privateIMapControl3mapControl=null;privateIToolbarControltoolBarControl=null;publicPolygonStaticTool(){////TODO:Definevaluesforthepublicproperties//base.m_category="";//localizabletextbase.m_caption="面统计";//localizabletextbase.m_message="面统计";//localizabletextbase.m_toolTip="使用多边形进行统计";//localizabletextbase.m_name="面统计";//uniqueid,non-localizable(e.g."MyCategory_MyTool")try{////TODO:changeresourcenameifnecessary//stringbitmapResourceName=GetType().Name+".bmp";base.m_bitmap=newBitmap(GetType(),bitmapResourceName);base.m_cursor=newSystem.Windows.Forms.Cursor(GetType(),GetType().Name+".cur");}catch(Exceptionex){System.Diagnostics.Trace.WriteLine(ex.Message,"InvalidBitmap");}}#regionOverriddenClassMethods///<summary>///Occurswhenthistooliscreated///</summary>///<paramname="hook">Instanceoftheapplication</param>publicoverridevoidOnCreate(objecthook){try{m_hookHelper=newHookHelperClass();m_hookHelper.Hook=hook;if(m_hookHelper.ActiveView==null){m_hookHelper=null;}}catch{m_hookHelper=null;}if(m_hookHelper==null)base.m_enabled=false;elsebase.m_enabled=true;//TODO:Addotherinitializationcodethis.toolBarControl=hookasIToolbarControl;this.mapControl=this.toolBarControl.BuddyasIMapControl3;}///<summary>///Occurswhenthistoolisclicked///</summary>publicoverridevoidOnClick(){//TODO:AddStaticTool.OnClickimplementationthis.mapControl.CurrentTool=this;}publicoverridevoidOnMouseDown(intButton,intShift,intX,intY){//TODO:AddStaticTool.OnMouseDownimplementationif(Button==1){IGeometrypGeometry=this.mapControl.TrackPolygon();SymbolUtil.InsertNormalLineElement(mapControl,TopologicOpreatorUtil.GetGeometryBoundary(pGeometry),255,0,0);newStatisForm(pGeometry,this.mapControl,OutputImage(pGeometry)).ShowDialog();SymbolUtil.ClearElement(mapControl);}}privatevoidoutPutArea(IGeometrypGeometry){ITopologicalOperatorpTopologicOperator=pGeometryasITopologicalOperator;pTopologicOperator.Simplify();//pTopologicOperator.ClipIActiveViewpActiveView=this.mapControlasIActiveView;//PictureBoxp=newPictureBox();//pActiveView.Output();}……………..privateImageOutputImage(IGeometrypGeometry){returnMapImageUtil.SaveCurrentToImage(mapControl.Map,331,151,pGeometry.Envelope);}#endregion}///<summary>///SummarydescriptionforPolylineStaticTool.///</summary>[Guid("62751d8d-07b3-4d84-a559-5ebdafbb4e0e")][ClassInterface(ClassInterfaceType.None)][ProgId("GisStatistics.Com.PolylineStaticTool")]publicsealedclassPolylineStaticTool:BaseTool{………………privateIHookHelperm_hookHelper=null;privateIMapControl3mapControl=null;privateIToolbarControltoolBarControl=null;publicPolylineStaticTool(){////TODO:Definevaluesforthepublicproperties//base.m_category="";//localizabletextbase.m_caption="线统计";//localizabletextbase.m_message="线统计";//localizabletextbase.m_toolTip="使用线段缓冲区进行统计";//localizabletextbase.m_name="线统计";//uniqueid,non-localizable(e.g."MyCategory_MyTool")try{////TODO:changeresourcenameifnecessary//stringbitmapResourceName=GetType().Name+".bmp";base.m_bitmap=newBitmap(GetType(),bitmapResourceName);base.m_cursor=newSystem.Windows.Forms.Cursor(GetType(),GetType().Name+".cur");}catch(Exceptionex){System.Diagnostics.Trace.WriteLine(ex.Message,"InvalidBitmap");}}#regionOverriddenClassMethods///<summary>///Occurswhenthistooliscreated///</summary>///<paramname="hook">Instanceoftheapplication</param>publicoverridevoidOnCreate(objecthook){try{m_hookHelper=newHookHelperClass();m_hookHelper.Hook=hook;if(m_hookHelper.ActiveView==null){m_hookHelper=null;}}catch{m_hookHelper=null;}if(m_hookHelper==null)base.m_enabled=false;elsebase.m_enabled=true;//TODO:Addotherinitializationcodethis.toolBarControl=hookasIToolbarControl;this.mapControl=this.toolBarControl.BuddyasIMapControl3;}///<summary>///Occurswhenthistoolisclicked///</summary>publicoverridevoidOnClick(){//TODO:AddPolylineStaticTool.OnClickimplementation}publicoverridevoidOnMouseDown(intButton,intShift,intX,intY){//TODO:AddPolylineStaticTool.OnMouseDownimplementationif(Button==1){IGeometrypGeometry=this.mapControl.TrackLine();ITopologicalOperatorpTopoOpreator=pGeometryasITopologicalOperator;IGeometrynewGeometry=pTopoOpreator.Buffer(35);SymbolUtil.InsertNormalLineElement(mapControl,pGeometry,255,0,0);SymbolUtil.InsertNormalLineElement(mapControl,TopologicOpreatorUtil.GetGeometryBoundary(newGeometry),0,255,0);newStatisForm(newGeometry,this.mapControl,OutputImage(pGeometry)).ShowDialog();SymbolUtil.ClearElement(mapControl);}}……privateImageOutputImage(IGeometrypGeometry){returnMapImageUtil.SaveCurrentToImage(mapControl.Map,331,151,pGeometry.Envelope);}}核心统计类:///<summary>///空间查询与操作帮助类///2015/12/11fhr///</summary>classFeatureDealUtil{publicstaticboolUpdateFeature(IList<IFeature>pfeatuers,DataTabledataTable){for(inti=0;i<dataTable.Rows.Count;i++){IFeaturepFeature=pfeatuers[i];DataRowdRow=dataTable.Rows[i];boolisUpdate=false;for(intj=0;j<dRow.ItemArray.Count();j++){IFieldpField=pFeature.Fields.get_Field(j);if(!pField.Editable){continue;}if(pField.Type==esriFieldType.esriFieldTypeBlob||pField.Type==esriFieldType.esriFieldTypeRaster||pField.Type==esriFieldType.esriFieldTypeGeometry){continue;}if(pFeature.get_Value(j)!=dRow[j]){isUpdate=true;objectvalue=dRow[j];if(pFeature.Fields.get_Field(j).CheckValue(value)){pFeature.set_Value(j,value);}}}if(isUpdate){pFeature.Store();}}returntrue;}///<summary>///统计某一段各值的个数///</summary>///<paramname="layer"></param>///<paramname="fieldName"></param>///<returns></returns>publicstaticIDictionary<string,Int32>QueryLayerCountForUnikevalues(IFeatureLayerlayer,stringfieldName,IGeometrypGeometry){IDictionary<string,int>result=newDictionary<string,int>();IList<object>values=GetUnikeValues(layer,fieldName);foreach(stringvalueinvalues){stringwhere=string.Format("{0}='{1}'",fieldName,value);Int32count=GetLayerCount(layer,pGeometry,where,fieldName);result.Add(value,count);}returnresult;}publicstaticIDictionary<string,double>QueryLayerAreaForUnikevalues(IFeatureLayerlayer,stringfieldName,IGeometrypGeometry){IDictionary<string,double>result=newDictionary<string,double>();IList<object>values=GetUnikeValues(layer,fieldName);foreach(stringvalueinvalues){stringwhere=string.Format("{0}='{1}'",fieldName,value);doublecount=GetLayerClipArea(layer,pGeometry,where,fieldName);result.Add(value,count);}returnresult;}publicstaticIList<object>GetUnikeValues(IFeatureLayerlayer,stringfieldName){IList<object>values=newList<object>();IFeatureCursorpFeatureCursor=QueryFeatureInLayer(layer,"");IDataStatisticsdataStatistics=newDataStatisticsClass();dataStatistics.Cursor=pFeatureCursorasICursor;dataStatistics.Field=fieldName;//IStatisticsResultsresult=dataStatistics.Statistics;IEnumeratormyEnumerator=dataStatistics.UniqueValues;List<string>myValueList=newList<string>();myEnumerator.Reset();while(myEnumerator.MoveNext()){if(myEnumerator.Current!=null){values.Add(myEnumerator.Current.ToString());}}//IStatisticsResultsresult=dataStatistics.Statistics;returnvalues;}publicstaticdoubleGetLayerClipArea(IFeatureLayerlayer,IGeometrypGeometry,stringwhere,stringfieldName){ICursorpCursor=QueryFeatureInLayer(layer,pGeometry,where)asICursor;//returnGetLayerCount(pCursor,fieldName);returnGetLayerClipArea(pCursor,pGeometry);}publicstaticdoubleGetLayerClipArea(ICursorpCursor,IGeometryoriginGeo){doublearea=0;IFeatureCursorcursor=pCursorasIFeatureCursor;IFeaturepFeature=cursor.NextFeature();while(pFeature!=null){ITopologicalOperatorpTopo=pFeature.ShapeasITopologicalOperator;IGeometrygeometry=pTopo.Intersect(originGeo,esriGeometryDimension.esriGeometry2Dimension);area+=(geometryasIArea).Area;pFeature=cursor.NextFeature();}returnarea;}///<summary>///利用语句进行查询返回游标和查询过滤类///</summary>///<paramname="featureLayer"></param>///<paramname="whereClause"></param>///<returns></returns>publicstaticIFeatureCursorQueryFeatureInLayer(IFeatureLayerfeatureLayer,StringwhereClause){IFeatureCursorfeatureCursor=null;IQueryFilter2queryFilter=newQueryFilterClass();queryFilter.WhereClause=whereClause;IFeatureClassfeatureClass=featureLayer.FeatureClass;featureCursor=featureClass.Search(queryFilter,false);returnfeatureCursor;}///<summary>///利用空间位置进行查询返回游标///</summary>///<paramname="featureLayer"></param>///<paramname="geometry"></param>///<returns></returns>publicstaticIFeatureCursorQueryFeatureInLayer(IFeatureLayerfeatureLayer,IGeometrygeometry){IFeatureCursorfeatureCursor=null;ISpatialFilterspatialFilter=newSpatialFilter();switch(featureLayer.FeatureClass.ShapeType){caseesriGeometryType.esriGeometryPoint:spatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;break;caseesriGeometryType.esriGeometryPolyline:spatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;break;caseesriGeometryType.esriGeometryPolygon:spatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;break;}spatialFilter.Geometry=geometry;IFeatureClassfeatureClass=featureLayer.FeatureClass;featureCursor=featureClass.Search(spatialFilter,false);returnfeatureCursor;}统计窗体核心代码:privateIGeometrypGeometry=null;privateIMapControl3mapControl=null;publicStatisForm(IGeometrypGeometry,IMapControl3mapControl,Imageimage){InitializeComponent();this.pGeometry=pGeometry;this.mapControl=mapControl;this.pictureBox1.Image=image;}privatevoidbutton1_Click(objectsender,EventArgse){if(string.IsNullOrEmpty(boBox1.Text)){MessageBox.Show("请选择操作图层");return;}DealQueryLayer(boBox1.SelectedIndex);}privatevoidDealQueryLayer(Int32index){ILayerlayer=this.mapControl.get_Layer(index);StringBuilderbuilder=newStringBuilder();stringareaText=string.Format("面积:{0}\r\n",GetArea(pGeometry));builder.Append(areaText);IDictionary<string,double>results=FeatureDealUtil.QueryLayerAreaForUnikevalues(layerasIFeatureLayer,"地类名称",pGeometry);foreach(varresultinresults){builder.Append(string.Format("{0}:{1}\r\n",result.Key,result.Value.ToString()));}this.richTextBox1.Text=builder.ToString();}privatedoubleGetArea(IGeometrygeometry){IAreapArea=geometryasIArea;returnpArea.Area;}}1.3.3算法实现图1-2面统计结果图1-3线缓冲区统计结果1.4.实验总结地物分类统计因为运用ArcEgnine二次开发接口,所以本身并无多少复杂的算法,核心是熟悉各类开发接口,熟悉
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2026年)护理安全管理、护理核心制度试卷有答案文档
- (2026年)度企业人力资源部工作总结
- 2025年河南省郏县数学三下期中综合测试模拟试题(含答案解析)
- 2025年河南省开封市顺河区四年级数学下学期期末联考试题含答案
- 2025年河南省三门峡市渑池县三年级数学下学期期末学业质量监测模拟试题(含答案)
- 2025年河北省邢台市桥西区三年级数学第二学期期末教学质量检测试题含答案解析
- 髋关节置换术后护理新进展
- 运用PDCA循环降低精神科住院患者约束使用率品管圈汇报
- 医疗器械MDR等同性论证完全指南:临床数据借用条件与合规路径解析
- 2025年河北省廊坊市安次区数学四下期末联考试题(含答案)
- 2025年广西投资集团有限公司高层次人才招聘名笔试参考题库及答案
- 贴片电阻焊接知识培训
- 商厨设备维修知识培训课件
- 皮肤慢性溃疡课件
- 燃气工程危险源辨识与控制方案
- 高素质农民培育项目服务方案投标文件(技术方案)
- 化产车间应急知识培训课件
- 国企综合管理岗招聘笔试题及答案13套
- 电气工程概论 第四章 电力电子技术与电力传动课件
- 《金属非金属矿山建设项目安全预评价报告编写提纲》解读
- 《民族文化的瑰宝》课件
评论
0/150
提交评论