GIS课程设计.docx

上传人:夺命阿水 文档编号:955250 上传时间:2024-01-29 格式:DOCX 页数:23 大小:339.43KB
返回 下载 相关 举报
GIS课程设计.docx_第1页
第1页 / 共23页
GIS课程设计.docx_第2页
第2页 / 共23页
GIS课程设计.docx_第3页
第3页 / 共23页
GIS课程设计.docx_第4页
第4页 / 共23页
GIS课程设计.docx_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《GIS课程设计.docx》由会员分享,可在线阅读,更多相关《GIS课程设计.docx(23页珍藏版)》请在课桌文档上搜索。

1、本科生实验报告实验课程GIS课程设计学院名称地球科学学院专业名称地理信息科学摘要针对本专业目前所学的GIS应用与GIS开发课程的要求,本次课程设计主要是对GlS二次开发与GlS软件应用进行相关编码和上机实验,主要利用ArCEngine二次开发平台和VS2013开发工具完成了地物统计的GIS二次开发实验、利用ArcGIS和Envi等相关软件完成了甘孜水利侵蚀的计算,旨在培养GIS的开发与应用能力,实际的问题解决能力和动手能力,加强了学生对GlS相关应用领域的理解。关键词:空间分析、算法、GIS应用、ArcEngineArcMapEnVi、甘孜、水利侵蚀目录实验一:ArCEngine二次开发实验:

2、地物分类统计11.1. 实验目的11.2. 实验内容11.3. 地物分类统计技术流程11.3.1 算法思想及算法流程图11.3.2 关键代码21.3.3 算法实现111.4. 实验总结12实验二:GIS应用实验:甘孜县水利侵蚀132. 1.实验目的133. 2.实验内容134. 3.甘孜县水利侵蚀统计技术流程132.3.1流程图132.3.2技术流程132.3.3技术成果192.4.实验总结20实验一:ArCEngine二次开发实验:地物分类统计1.1. 实验目的(I)熟练搭建ArCEngine开发环境,了解ArCEngine和ArCObjeCtS相关接口和实体类(2)利用ArCEngine实

3、现地物分类统计,缓冲区运算,拓扑运算和地图导出等功能(3)进一步熟悉ArCEngine开发接口以及高级功能,加深对GIS空间分析和空间统计的理解1.2. 实验内容利用C#语言、VS开发工具、ArCEngine开发平台实现地物分类统计1.3. 地物分类统计技术流程1.4. 1算法思想及算法流程图算法基本思想:(1)二次开发Com组件TTool,分别是用于线统计和面统计两类的工具(2)数据输入及相关初始化,选择统计工具(3)如果统计工具是面统计,则获取地图控件的轨迹多边形,否则就是线统计,获取地图控件的轨迹线,并对线做35的缓冲区。使用IElement接口绘图,然后使用IActivView导出地图

4、(4)使用TQueryFilter进行空间查询,然后使用IDataStatiStiCS接口统计地类名称字段的值集合(5)遍历上步中的值集合,每个迭代中通过值构造SqI语句Where条件”地类名称二值”,同时结合(3)步中的轨迹多边形或者缓冲区,运用ISPatialFilter进行空间查询。遍历每个要素,统计该要素与轨迹多边形或缓冲区的相交图形的距离,从而得出每类地物的面积(6)使用IArea求出轨迹多边形或者缓冲区的总面积(7)相关结果可视化展示,算法结束算法流程图:图1-1地物分类统计流程图1.5. 2关键代码实现该算法的核心代码如下:统计工具核心:/Summarydescriptionfo

5、rStaticTool./Guid(*0428808a-4782-4f81-a0b3-93be6e9226dc*)Classinterface(ClassInterfaceType.None)ProgId(wGisStatistics.Com.StaticTool*)publicsealedclassPolygonStaticTool:BaseToolprivateIHookHelperm_hookHelper=null;privateIMapControlSmapControl=null;privateIToolbarControltooIBarControl=null;publicPoly

6、gonStaticToolO(/TODO:Definevaluesforthepublicproperties/base.m_category=*;/localizabletextbase.m_caption=面统计;/localizabletextbase.m_message=而统计;/localizabletext(e. g.base.m,toolTip=使用多边形进行统计;/localizabletextbase,mname=面统计;/uniqueid,non-localizable*MyCategory_MyTool*)try/TODO:changeresourcenameifnece

7、ssary/stringbitmapResourceNamc=GetTypeO.Name+”.bmp;base.m_bitmap=newBitmap(GetTypeO,bitmapResourceNamc);base.m_cursor=newSystem.Windows.Forms.Cursor(GetTypeO,GetType().Name)catch(Exceptionex)System.Diagnostics.Trace.WriteLine(ex.Message,“InvalidBitmap);#regionOverriddenClassMethods/Occurswhenthistoo

8、liscreated/InstanceofthealicationpublicoverridevoidOnCreateCobjecthook)(try(m_hookllelper=newHookHelperClassO;m_hookllelper.Hook=hook;if(m_hookllelper.ActiveView=null)(m_hookHelper=null;catchm_hookllelper=null;)if(m-hook11elper=null)base.m_enabled=false;elsebase.m_enabled=true;/TODO:Addotherinitiali

9、zationcodethis.toolBarControl=hookasIToolbarControl;this.mapControl=this.toolBarControl.BuddyasIMapControl3;/Occurswhenthistoolisclicked/publicoverridevoidOnClickO(/TODO:AddStaticTool.OnClickimplementationthis.mapControl.CurrentTool=this;)publicoverridevoidOnMouseDown(intButton,intShift,intX,intY)(/

10、TODO:AddStaticTool.OnMouseDownimplementationif(Button=1)!GeometrypGeometry=this.mapControl.TrackPolygonO;SymbolUtil.InsertNormalLineElement(mapControl,TopologicOpreatorUtil.GetGeometryBoundary(PGeometry),255,O,O);newStatisForm(pGeometry,this.mapControl,OutputImage(pGeometry).ShowDialogO;SymbolUtiLCl

11、earElement(mapContro1);)privatevoidoutPutArea(IGeometrypGeometry)(ITopologicalOperatorpTopoIogicOperator=pGeometryasITopologicalOperator;pTopo1ogicOperator.Simplify();/pTopologicOperator.ClipIActiveViewpActiveView=this.mapControlasIActiveView;/PictureBoxp=newPictureBoxO;/pActiveView.Output();private

12、ImageOutputImagedGeometrypGeometry)(returnMapImageUtil.SaveCurrentToImage(mapControl.Map,331,151,pGeometry.Envelope);#CndregiOn/IllSummarydescriptionforPolylineStaticTool./Guid(*62751d8d-07b3-4d84-a559-5ebdafbb4e0e*)Classinterface(ClassInterfaceType.None)ProgId(wGisStatistics.Com.PolylineStaticTool*

13、)publicsealedclassPolylineStaticTool:BaseToolprivateIHookHelperm_hookHelper=null;privateIMapContro13mapControl=null;privateIToolbarControltooIBarControl=null;publicPolylineStaticToolO(/TODO:Definevaluesforthepublicproperties/base.m_category=;/localizabletextbase.m_caption=线统计;/localizabletextbase.m_

14、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(GetTypeO,bitmapResourceName);base.m_cursor=newSystem.

15、Windows.Forms.Cursor(GetTypeO,GetType().Name+”.cur*);)catch(Exceptionex)System.Diagnostics.Trace.WriteLine(ex.Message,*InvalidBitmap*);)regionOverriddenClassMethods/OccurswhenthistooliscreatedIII/InstanceoftheapplicationpublicoverridevoidOnCreate(objecthook)trym_hookHelper=newHookHelperClassO;m_hook

16、Helper.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,tooIBarControl.BuddyasIMapControl3;)/Occurswhen

17、thistoolisclicked/publicoverridevoidOnClickO/TODO:AddPolylineStaticTool.OnClickimplementation)publicoverridevoidOnMouseDown(intButton,intShift,intX,intY)/TODO:AddPolylineStaticTool.OnMouseDownimplementationif(Button=1)(!GeometrypGeometry=this.mapControl.TrackLineO;ITopologicalOperatorpTopoOpreator=p

18、GeometryasITopologicalOpcrator;!GeometrynewGeometry=pTopoOpreator.Buffer(35);SymbolUtil.InsertNormalLineElement(mapControl,pGeometry,255,O,O);SymbolUtil.InsertNormalLineElement(mapControl,TopologicOpreatorUtil.GetGeometryBoundary(newGeometry),O,255,O);newStatisForm(newGeometry,this.mapControl,Output

19、Image(pGcometry).ShowDialogO;SymbolUtil.ClearElement(mapControl);privateImageOutputImagedGeometrypGeometry)(returnMapImageUtiLSaveCurrentToImage(mapControl.Map,331,151,pGeometry.Envelope);)核心统计类:/空间查询与操作帮助类/2015/12/11fhr/classFeatureDealUtil(ublicstaticboolUpdateFeature(IListpfeatuers,DataTable(Iata

20、Table)for(inti=O;idataTable.Rows.Count;i+)(!FeaturepFeature=pfeatuersi;DataRowdRow=dataTable.Rowsi;boolisUdate=false;for(intj=O;jdRow.ItemArray.CountO;j+)(IFieldpField=pFeature.Fields.get_Field(j);if(!pField.Editable)(continue;if(pField.Type=esriFieldType.esriFieldTypeBlobpField.Type=esriFieldType.G

21、sriFieldTypeRaster11pField.Type=esriFieldType.esriFie1dTypeGeometry)(continue;)if(pFeature.get_Value(j)!=dRowj)isllpdate=true;objectVaIUe=dRowj;if(pFeature.Fields.get_Field(j).CheckValue(value)pFeature.set_Value(j,value);if(isUpdate)pFeature.StoreO;returntrue;/统计某一段各值的个数III/publicstaticIDictionaryQu

22、eryLayercountForUnikevaluesdFeatureLayerlayer,stringfieldName,!GeometryGeometry)(IDictionaryresult=newDictionary();IListvalues=GetUnikeValues(layer,fieldName);foreach(stringvalueinvalues)(stringwhere=string.Format(*0=1,*,fieldName,value);Int32count=GetLayerCountdayer,pGeometry,where,fieldName);resul

23、t.Add(value,count):)returnresult;)publicstaticIDictionaryQueryLayerAreaForUnikevaluesdFeatureLayerlayer,stringfieldName,!GeometrypGeometry)IDictionaryresult=newDictionary();IListvalues=GetUnikeValues(layer,fieldName);foreach(stringvalueinvalues)stringwhere=string.Format(z,0=,fieldName,value);doublec

24、ount=GetLayerClipArea(layer,pGeometry,where,fieldName);result.Add(value,count);returnresult;publicstaticIListGetUnikeValues(IFeatureLayerlayer,stringfieIdName)IListvalues=newList();IFeatureCursorPFeatUreCUrSor=QueryFeatureInLayer(layer,;IDataStatisticsHataStatistics=newDataStatiStiCSCIaSS();dataStat

25、istics.Cursor=pFeatureCursoras!Cursor;dataStatistics.Field=fieldName;/IStatisticsResultsresult=dataStatistics.Statistics;!EnumeratormyEnumerator=dataStatistics.UniqueValues;1.istmyValueList=newList();myEnumerator.ResetO;while(myEnumerator.MoveNextO)(if(myEnumerator.Current!=null)(values.Add(myEnumer

26、ator.Current.ToStringO);)/IStatisticsResultsresult=dataStatistics.Statistics;returnvalues;)publicstaticdoubleGetLayerClipAreadFeatureLayerlayer,!GeometrypGeometry,stringwhere,stringfieldName)(!CursorpCursor=QueryFeatureInLayerdayer,pGeometry,where)as!Cursor;/returnGetLayerCount(pCursor,fieldName);re

27、turnGetLayerClipArea(pCursor,pGeometry);ublicstaticdoubleGetLayerClipArea(!CursorpCursor,!GeometryoriginGeo)(doublearea=O;IFeatureCursorcursor=pCursorasIFeatureCursor;!FeaturepFeature=cursor.NextFeatureO;while(pFeature!=null)(ITopologicalOperatorpTopo=pFeature.ShapeasITopologicalOperator;!Geometryge

28、ometry=pTopo.Intersect(originGeo,esriGeometryDimension.esriGeometry2Dimension);area+=(geometryas!Area).Area;pFeature=cursor.NextFeatureO;)returnarea;/利用语句进行查询返回游标和查询过滤类/publicstaticIFeatureCursorQueryFeatureInLayerdFeatureLayerfeatureLayer,StringwhereClause)(IFeatureCursorfeatureCursor=null;IQueryFi

29、lter2queryFilter=newQueryFiiterClassO;queryFilter.WhereClause=whereClause;IFeatureClassFeatureClass=featureLayer.FeatureClass;featureCursor=featureClass.Search(queryFi1ter,false);returnfeatureCursor;)/利用空间位置进行查询返回游标/paramname=geometry/publicstaticIFeatureCursorQueryFeatureInLayerdFeatureLayerfeature

30、Layer,!Geometrygeometry)(IFeatureCursorfeatureCursor=null;ISpatialFilterSpatialFilter=newSpatialFilterO;switch(featureLayer.FeatureClass.ShapeType)(caseesriGeometryType.esriGeometryPoint:SpatialFilter.SpatialRel=CsriSpatialRelEnum.esriSpatialRelContains;break;caseesriGeometryType.esriGeometryPoIylin

31、e:SpatialFiiter.SpatialRel=esriSpatialRelEnum.esrISpatialRelIntersects;break;caseesriGeometryType.CsriGeonietryPolygon:SpatialFiiter.SpatialRel=esriSpatialRelEnum.esrISpatialRelIntersects;break;)SpatialFilter.Geometry=geometry;IFeatureClassfeatureClass=featureLayer.FeatureClass;featureCursor=feature

32、Class.Search(spatialFiIter,false);returnfeatureCursor;统计窗体核心代码:private!GeometrypGeometry=null;privateIMapContro13mapCotrol=null;publicStatisForm(IGeometrypGeometry,IMapContro13mapControl,Imageimage)InitialiZeCoraponentO;this.pGeometry=pGeometry;this.mapControl=mapControl;this.pictureBoxl.Image=image

33、;)privatevoidbuttonl_Click(objectsender,EventArgse)(if(string.IsNullOrEnipty(boBoxl.Text)MessageBox.Show(请选择操作图层”);return;Dea1QueryLayer(boBoxl.SelectedIndex);privatevoidDealQueryLayer(Int32index)ILayerlayer=this.mapControl.get_Layer(index);StringBuilderbuilder=newStringBuilderO;stringareaTexl=strin

34、g.Formal(面积:0rn*,GetArea(pGeometry);buiIder.Append(areaText);IDictionaryresultsFeatureDealUtil.QueryLayerAreaForUnikevaluesdayerasIFeatureLayer,地类名称,pGeometry);foreach(varresultinresults)builder.Append(string.Format(*0:lrn*,result.Key,result.Value.ToStringO);)this.richTextBoxl.Text=builder.ToStringO

35、;)privatedoubleGetAreadGeometrygeometry)IAreapArea=geometryas!Area;returnpArea.Area;1.3.3算法实现图13线缓冲区统计结果1.4.实验总结地物分类统计因为运用ArCEgnine二次开发接口,所以本身并无多少复杂的算法,核心是熟悉各类开发接口,熟悉相关空间分析和统计功能的ArCEngine的代码实现。在实际的试验中,还需要熟悉相关字典和集合的运用,特别是对于地物分类统计面积中,首先需要统计地物类,再根据地物类进行分类统计。实验二:GIS应用实验:甘孜水利侵蚀2.1. 实验目的(1)了解和熟悉常用GIS和RS等软

36、件的应用(2) 了解和掌握水利侵蚀相关计算模型和计算方法,运用相关软件实现(3)进一步加深对GlS的理解2.2. 实验内容利用ArCGIS、Envi和网络资源进行甘孜水利侵蚀的计算2.3, 甘孜县水利侵蚀统计技术流程2.3. 1流程图流程图如下:图2-1水利侵蚀计算流程图2.3.2技术流程(1)获取数据,包括甘孜县遥感影像、土地利用类型数据、dem数据(2)利用Envi软件根据遥感影像计算和生成NDVI。图2-2NDVl计算过程图2-3NDVl计算结果(3)对遥感数据进行预处理(正射校正等),处理完后就该数据生成植被覆盖度。(4)利用ArcGlS重分类工具对植被指数覆盖度进行重分类:图2-4重

37、分类过程图2-5重分类结果(5)利用ArcGIS的slope工具根据DEM数据生成坡度。4SlopeIxtrasterOutputrstrD:GISCTSgS计.通S1”Ja0PUtlut5Qarsmt(optional)rag31hex(option)I-11图2-6坡度计算过程图2-7坡度计算结果(6)使用ArCGlS重分类工具对坡度进行重分类,t RecbssifyInput rsttr a,” ReKt fi14 ;VluOntput rasterC13ify lt EntritcisA图2-8坡度重分类过程图2-9坡度重分类结果(7)利用ArcMap要素转栅格工具将土地利用数据按CL

38、ASS字段转成栅格图2-10要素转栅格过程图2-11土地利用栅格数据(8)对土地利用栅格数据进行重分类,分为非耕地、耕地2类。% Red”的- X图2-12土地利用重分类过程图2-13土地利用重分类结果(9)根据下图进行计算非耕地与耕地的侵蚀程度。由栅格计算器计算:FUsterCalculator-XpAlgbrexpressionlayersandvariables图2-16耕地侵蚀计算结果(10)按照9步相同方法计算非耕地侵蚀:.RasterCalculatorAIGrQ*xprstio地心ureure -1SiOPe雌翎 ConditionalConPKkSetNJMath*1lltMS

39、a多耕地RedM$.9ope图2-17非耕地侵蚀计算过程2.3.3技术成果图2-18非耕地侵蚀计算结果甘孜县水利侵蚀图,学,twyn学*,rr图2-19阿坝地区水利侵蚀计算结果2.4. 实验总结阿坝地区水利侵蚀的计算运用到了一系列的空间数据处理和空间分析等操作,使用到了ArCGIS和EnVi等两大比较常用的GlS和遥感软件,在实际的操作中,遇到了一系列的相关问题,比如因为细节问题而导致的重分类结果不正确等,所有的操作均是对平时的GIS操作的实践与巩固,收获还是比较巨大的。通过对此次GIS课程设计,我们按照老师课堂的要求和相关数据,利用ArcEngine二次开发平台,VS2013集成开发工具、A

40、rcMap,Envi等几大工具分别完成了地物统计的开发实验和甘孜水利侵蚀计算的应用实验,收获良多,主要体现在几个方面:1 .深刻理解和掌握了ArcEngine二次开发平台的相关接口和类库。2 .在利用ArCEngine实现地物分类统计时,比较全面的应用了缓冲区运算,拓扑运算和地图导出等功能,所以整体提升了对GIS开发的掌握能力。3 .我们也进一步熟悉了ArcEngine开发接口以及高级功能,加深了自己对GIS空间分析和空间统计的理解。4 .加强了对ArcMap和Envi软件掌握和熟练程序,在一定程度上提升了我们的实践和动手能力。5 .ArcEngine和ArcMap整体上是相通的,同为ArcG

41、IS产品,同时ArcObjects又是整个ArCGIS产品的核心,所以在实际的实验当中,我们也运用到了ArCObjeCtS的相关开发组件,所有的开发功能均与ArCMaP类似,只不过将UI互动改为了代码的操作和处理。6 .相比开发实验,我们在GlS应用实验,也就是甘孜水利侵蚀的计算当中,遇到了更多的问题,主要是由于我们的知识面比较有限、对相关模型和计算公式不太了解,因此比较难以下手,不过在后期的讨论与查询资料中,很好的解决了这些问题,这是一次比较成功的实践虽然本地的GlSKEC课程设计比较简单,不过在背后有深刻的意义,我们应该重点的去学习和总结,两个实验的背后都代表了GIS领域中比较重要的开发应用平台和相关分析方法,所以我们应该加以拓展和理解。学生(签名):2017年1月9日成绩评定:指导教师(签名):年月日22

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号