一审矢量分析-代码修改_第1页
一审矢量分析-代码修改_第2页
一审矢量分析-代码修改_第3页
一审矢量分析-代码修改_第4页
一审矢量分析-代码修改_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 矢量数据空间分析矢量数据是大多数 GIS 系统的主要数据源,对矢量数据的各种空间分析是 GIS 系统的主要功能之一。矢量数据的位置明显、属性隐含的特点便于高精度地刻画边界明确的地理特征,常用于高精度的地图制图和智能化地理特征的行为控制,传统测绘项目的成果数据也几乎都是以矢量数据的形式表达的。矢量数据的空间分析主要有叠加分析、空间拓扑运算、空间关系运算以及网络分析等类型。此外,数据格式的转换、XY 形式表示的空间数据的可视化等也是矢量数据常用的操作。网络分析由于其重要性和复杂性将单独成章进行介绍,其他矢量数据分析将在本章中详解。此外,由于地理处理工具(Geoprosing,简称 GP 工

2、具)已成为广泛使用的空间分析工具,本章以三个实例介绍了 GP 工具的调用方法。7.1空间拓扑分析通过一系列的基于一个或者多个几何图形间的逻辑比较,然后返回另外一些几何图形的过程就是空间几何图形的拓扑运算。它是空间分析的基础,各种空间分析的结果都可以通过几何图形之间的拓扑运算实现。例如:查询某条道路进行扩建时影响的管线有哪些,就是一个典型的拓扑运算问题(缓冲区分析),可以将该条道路根据一定的宽度做缓冲区,然后将缓冲区多边形与管线进行相交运算即可求解结果。7.1.1 相关类与接口(ITopologicalOperator 接口)空间几何图形的拓扑运算包括裁切、凸多边形、切割、差分、交集、对称差分(

3、又称为异或)和并集等,这些拓扑运算需要用到 ITopologicalOperator 接口。ITopologicalOperator 接口的方法仅仅使用在高级别几何对象上,即 Po、MultiPo、Polyline 和 Polygon,如果要使用在级的几何对象中,如Segment(Line,Circular,Arc,Elliptic Arc,Bezier Curve)、Path 或 Ring 上,需要先将他们组高级别几何对象才行。ITopologicalOperator 接口的主要方法及属性有:1. Boundary 属性Boundary 属性返回几何图形的边界,返回的几何图形边界的维度总是比

4、该图形低一维。即:Polygon 的边界为 Polyline,Polyline 的边界为 Po,Po的边界返回空,如图 7-1 所示。图 7-1 几何对象的边界(Boundary)2. Buffer 方法Buffer 方法可以给一个高级别几何对象产生一个缓冲区,无论是点、多边形还是多义线,它们的缓冲区都是一个具有面积的几何对象,如图 7-2 所示。图 7-2Buffer 方法(点、线、面图形对应缓冲区)3. Clip 方法Clip 方法可以将一个几何对象使用一个包络线来进行裁切,裁切的结果为几何对象被包络线包围的部分,如图 7-3 所示。图 7-3 Clip 方法4. Union 与 Cons

5、tructUnion 方法Union 方法则可以合并两个同纬度的单个几何对象,合并后的两个单个几何对象将变成一个几何对象;ConstructUnion 方法可以将一个几何对象的枚举(包含了多个几何对象的枚举值)与同维度的单个几何对象合并,这种方法在大量几何对象合并时非常有效。如图 7-4所示为几何对象执行Union 操作方法生成结果。图 7-4Union 方法5. ConvexHull 方法ConvexHull 方法计算几何对象的最小外包凸多边形(凸包),Po的凸包为 Po本身,如图 7-5 所示。凸多边形是一个没有凹面且包含其他几何图形的最小多边形。图 7-5ConvexHull 方法6.

6、Cut 方法Cut 方法指定一条切割曲线和一个几何图形,经过切割运算后把几何图形分为左右两部分,沿着 Polyline 的方向,左侧为“左”边,右侧为“右”边。和多点是不能被切割的,而折线和多边形只有与切割曲线相交时才能进行切割运算,如图 7-6 所示。图 7-6Cut 方法7. Difference 方法与 SymmetricDifference 方法Difference 方法可以产生两个几何对象的差集。如A 是源对象,B 是参与运算的几何对象,则 C 是A 减去A 与 B 的交集后剩下的部分。而SymmetricDifference(对称差分)方法则是将 A 与 B 的并集减去 A 与 B

7、 的交集部分。两个方法的原理展示如图 7-7 所示。(a)Difference 方法(b)SymmetricDifference 方法图 7-7Difference 方法与SymmetricDifference 方法ersection 方法ersection 返回两个同维度几何形体对象的交集,即两个对象重合部分,如图 7-8 所8.示。图 7-8ersection 方法9. Simplify 方法Simplify 方法检查几何对象是否为简单对象并修正几何对象的拓扑错误。拓扑错误包括冗余节点、线自相交、多边形方向错误等。计算时的容差取决于几何对象的 SpatialReference属性。Simp

8、lify 方法也可以让一个几何对象变得在拓扑上一致,例如在一个 PoCollection中,可以移除所有的重合点(即两个点拥有相同的坐标值);对于 SegmentCollection,它将移除重合的线段,而相交的线段会变成非相交的线段(即在相交点处产生一个顶点);对于Polygon 而言,所有相交的环将被移除,所有内外的方向将被修正,未封闭的环将被封闭,如图 7-9 所示。图 7-9Simplify 方法针对 ITopologicalOperator 接口的上述属性和方法的应用应首先将几何实体对象转换为ITopologicalOperator 对象,然后利用该对象的方法以及传入指定要求的参数进

9、行拓扑运算分析,形成新的几何实体对象。7.1.2 实例详解-缓冲区分析本例的目的是实现在地图上点击选择任意一个多边形要素,程序自动生成该多边形一定范围内的缓冲区并渲染到地图上。实例代码位于随书光盘“chp07矢量数据分析code”中,数据位于随书光盘“chp07矢量数据分析data缓冲区分析”中。实现的基本思路为:(1)添加缓冲区分析操作工具;(2)在其OnMouseDown 方法中执行点击查询要素操作;(3)将查询结果要素通过 ITopologicalOperator. Buffer 方法进行缓冲区生成操作;(4)将缓冲区生成结果利用空间要素渲染方式展示到地图上。其程序设计具体步骤为:(1)

10、向工程项目中添加继承自 BaseTool 类的文件,该类实现了mand 基础类和 ITool 接口的所有方法;具体操作为:在 Visual Studio 2010 中打开【添加新项】框,单击框左边目录栏中的【ArcGIS】选项,选中其下拉子菜单中的【Extending ArcObjects】选项,在中间的窗口中选中【Base Tool】,并将名称改为 ToolBufferysis.cs,如图 7-10 所示。图 7-10Visual Studio 2010 中添加ToolBufferysis 工具类(2)添加 ToolBufferysis 类中的 OnClick 方法的实现代码,用以判定是否符

11、合缓冲区操作的前提条件(地图中是否加载图层),并修改鼠标样式;public override void OnClick()/判断MapControl是否有图层if (m_hookHelper.FocusMap.LayerCount = 0)MessageBox.Show(请先加载图层数据!); return;/修改鼠标样式(this m_hookHelper.Hook as MapControl).MousePo er = esriControlsMousePo er.esriPo erHand;(3)添加 ToolBufferysis 类的 OnMouseDown 方法的实现,生成缓冲区并将

12、生成的缓冲区要素添加到地图中;public override void OnMouseDown(Button,Shift,X,Y)if (Button != 1 | m_hookHelper.FocusMap.LayerCount = 0)return;IActiveViectiveView = m_hookHelper.ActiveView;IGraphicsContainGraCont = (IGraphicsContainActiveView;/删除地图上添加的所有Element pGraCont.DeleteAllElements();/获得点击位置并转化为点图形要素IPopPo= p

13、ActiveView.ScreenDisplay.DisplayTransformation.ToMapPo (X, Y);/获得地图中图层IFeatureLayFeatureLayer = m_hookHelper.FocusMap.get_Layer(0) as IFeatureLayer;if (pFeatureLayer = null)return;IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;/进行点击查询图层要素ISpatialFiltSpatialFilter = new SpatialFilterClass()

14、;pSpatialFilter.Geometry = pPo ;pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelersects; IFeatureCursor featureCursor = pFeatureClass.Search(pSpatialFilter, false);/获得点击查询的要素IFeature pFeature = featureCursor.NextFeature();if (pFeature != null & pFeature.Sh esriGeometryType.esriGeometryP

15、olygon).GeometryType =IGeometry pGeometry = pFeature.Shas IGeometry;/通过ITopologicalOperator接口进行多边形的简单化处理 ITopologicalOperator pTopoOpe = (ITopologicalOperator)pGeometry; pTopoOpe.Simplify();/通过创建缓冲区相关IGeometry pBufferGeo = pTopoOpe.Buffer(5000);/创建多边形符号样式并添加到地图上 IScreenDisplay pdisplay = pActiveView

16、.ScreenDisplay;ISimpleFillSymbol pSymbol = new SimpleFillSymbolClass(); pSymbol.Style = esriSimpleFillStyle.esriSFSCross;RgbColor pColor = new RgbColorClass(); pColor.Blue = 200;pColor.Red = 211;pColreen = 100;pSymbol.Color = (IColor)pColor;/创建多边形渲染效果的ElementIFillShElement pFillShElm = new PolygonEl

17、ementClass();IElement pElm = (IElement)pFillShpElm.Geometry = pBufferGeo;Elm;pFillShEymbol = pSymbol;/将渲染之后的多边形Element添加到地图IGraphicsContainer层中pGraCont.AddElement(IElement)pFillShElm, 0);/地图刷新 pActiveViertialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);(4)在主程序窗体的按钮事件中,利用 Id 接口调用 ToolBuffe

18、rysis 工具类,实现点击选择地理要素并生成缓冲区的操作;private void btnBufferysis_Click(objecder, EventArgs e)Ipd pd = new ToolBufferysis();d.OnCreate(this.axMapControl1.Object);this.axMapControl1.CurrentTool = pd as ITool;pd = null;(5)实现效果如图 7-11 所示。图 7-11 点击选择后的多边形生成缓冲区效果展示7.1.3 实例详解-获取多边形要素边界本例旨在实现通过在地图上点击选择任意一个多边形图形要素,系

19、统自动获得该多边形的边界并渲染展示到地图上,效果如图 7-12 所示。本例代码位于随书光盘“chp07矢量数据分析code”中,实例数据位于随书光盘“chp07矢量数据分析data获取要素边界”中。程序设计过程同缓冲区分析基本一致,只是 OnMouseDown 事件代码有所不同,其代码为:public override void OnMouseDown(Button,Shift,X,Y)if (Button != 1 | m_hookHelper.FocusMap.LayerCount = 0)return;IActiveViectiveView = m_hookHelper.ActiveVi

20、ew;IGraphicsContainGraCont = (IGraphicsContainActiveView;/删除地图上添加的所有Element pGraCont.DeleteAllElements();/获得点击位置并转化为点图形要素IPopPo= pActiveView.ScreenDisplay.DisplayTransformation.ToMapPo (X, Y);/获得地图中图层IFeatureLayFeatureLayer = m_hookHelper.FocusMap.get_Layer(0) as IFeatureLayer;if (pFeatureLayer = nu

21、ll)return;IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;/进行点击查询图层要素ISpatialFiltSpatialFilter = new SpatialFilterClass();pSpatialFilter.Geometry = pPo ;pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelersects; IFeatureCursor featureCursor = pFeatureClass.Search(pSpatialFilter,

22、false);/获得点击查询的要素IFeature pFeature = featureCursor.NextFeature();if (pFeature != null & pFeature.Sh esriGeometryType.esriGeometryPolygon).GeometryType =IGeometry pGeometry = pFeature.Shas IGeometry;ITopologicalOperator pTopoOpe = (ITopologicalOperator)pGeometry;/获取边界IGeometry pBoundary = pTopoOpe.Bo

23、undary; ILineElement pLineEle = new LineElementClass(); ISimpleLineSymbol pSLS = new SimpleLineSymbol(); IRgbColor pColor = new RgbColor();pColor.Red = 0;pColreen = 255;pColor.Blue = 0; pSLS.Color = pColor; pSLS.Width = 5;pLineEle.Symbol = pSLS;IElement pElement = pLineEle as IElement;pElement.Geome

24、try = pBoundary; pGraCont.AddElement(pElement, 0); /显示边界/地图刷新 pActiveViertialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);图 7-12 是程序运行结果。图 7-12 获取点击选择的多边形边界展示效果图7.2空间关系运算矢量数据的空间关系是指几何对象间在空间上的某种关系,比如一个点在一个面的内部,两个对象相交、相等、包含、相接等关系。空间关系运算即用以判定矢量数据的上述关系是否成立,以及一定空间范围内的数量统计等。7.2.1 相关类与接口(IRelati

25、onalOperator 接口)几何对象之间空间关系主要有:包含、相等、在、相交等。矢量数据的空间关系运算需要用到 IRelationalOperator 接口,通过该接口的不同方法判定两个几何对象之间的关系是否存在。关系运算符用以比较两个几何体,并返回一个型值来说明某种空间关系是否存在。所有支持 ITopologicalOperator 的几何对象的类也实现了 IRelationalOperator 接口,其中包括 Envelope 对象,这意味着还可以对两个几何对象的 Envelope 进行相关联系的检查。下面具体介绍 IRelationalOperator 各方法的具体含义。1. 空间包

26、含关系(Contains、Within)Contains(空间包含)表示当前几何对象包含输入几何对象。Within(在)表示当前几何对象在输入几何对象的。Contains 和 Within 是相对的关系,即 Contains 的就是 Within。图 7-13 展示的是 Contains 关系和 Within 关系相互对比的九宫格对照图。(a)Contains 几何关系示意图 (b)within 几何关系示意图图 7-13Contains 关系和 Within 关系九宫格对照2. 交叉(Crosses)Crosses(交叉)表示线和线或者线和面的边界之间有相交。如图7-14 为几何对象之间的交

27、叉关系的九宫格对照图。图 7-14Crosses 关系3. 相离(Disjo)Disjo (相离),表示两个几何对象之间没有任何公共部分。如果两个几何对象不相离,那么它们就有“相交”关系。如图 7-15 所示的九宫格表示两个几何对象之间的相离关系。图 7-15Disjo关系4.(Overlaps)Overlaps(),表示两个同一维度的几何对象具有公共部分,并且公共部分和输入几何对象具有相同的维度。图 7-16 所示的九宫格表示两个几何对象之间的 Overlaps 关系。图 7-16Overlaps 关系5. 相等(Equals)Equals(相等),表示两个几何对象具有相同的几何维度、顶点集

28、合等。对于多边形和线几何类型,如果他们具有 Equals 关系,则 SymmetricDifference 方法返回值为空。如图 7-17所示的九宫格表示两个几何对象之间的相等关系。图 7-17Equals 关系6. 相接(Touches)Touches(相接),两个几何对象的边界相交。如果两个几何对象相接,那么它们的交集交集为空。如图 7-18 所示的九宫格表示两个几何对象之间的不为空,但是几何对象的相接关系。图 7-18Touches 关系7.2.2 实例详解-查找一多边形要素的所有邻接要素本例通过在地图上点击选择任意一个多边形,系统自动获取与该多边形要素相邻接的其它多边形并显示到地图上。

29、实例代码位于随书光盘“chp07矢量数据分析code”中,实例数据位于随书光盘“chp07矢量数据分析data邻接要素查询”中。程序实现过程同缓冲区分析基本一致,只是 OnMouseDown代码有所不同,其代码为:public override void OnMouseDown(Button,Shift,X,Y)if (Button != 1 | m_hookHelper.FocusMap.LayerCount = 0) return;IMap pMap = m_hookHelper.FocusMap;IActiveViectiveView = m_hookHelper.ActiveView;

30、/获得点击位置并转化为点图形要素IPopPo= pActiveView.ScreenDisplay.DisplayTransformation.ToMapPo(X,Y);/获得地图中图层IFeatureLayIFeatureLayer;FeatureLayer = m_hookHelper.FocusMap.get_Layer(0) asif (pFeatureLayer = null)return;IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;/进行点击查询图层要素ISpatialFiltSpatialFilter = ne

31、w SpatialFilterClass();pSpatialFilter.Geometry = pPo;pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelersects;IFeatureCursor featureCursor = pFeatureClass.Search(pSpatialFilter, false);/获得点击查询的要素IFeature pFeature = featureCursor.NextFeature();if (pFeature != null & pFeature.Sh esriGeomet

32、ryType.esriGeometryPolygon)pMap.ClearSelection();.GeometryType =IRelationalOperator pRelationalOperator = pFeature.Sh IRelationalOperator;/设置被选择要素的颜色IRgbColor pColor = new RgbColorClass(); pColor.Red = 255;asIFeatureSelection pFeatueSelection = pFeatureLayer as IFeatureSelection; pFeatueSelection.Se

33、lectionColor = pColor;/查找邻接 要素,并置于地图的选择集中IFeatureCursor pCompFeaureCursor = pFeatureLayer.Search(null, false); IFeature pCompFeature = pCompFeaureCursor.NextFeature();/遍历图层内所有要素进行邻接判定 while(pCompFeature != null)if (pRelationalOperator.Touches(pCompFeature.Sh)/如果对比要素与当前选择要素相连接,则加入到地图选择集中pMap.SelectFe

34、ature(pFeature);pCompFeature = pCompFeaureCursor.NextFeature();/地图刷新 pActiveViepActiveView.Extent);rtialRefresh(esriViewDrawPhase.esriViewGeoSelection, null,程序运行效果如图7-19 所示。图 7-19 获取点击选择的多边形邻接要素展示效果图7.3叠加分析叠加分析(也称叠置分析)是将同一区域,相同参考系统、相同比例尺的两个或多个数据进行叠加产生一个新数据层的操作,其结果综合了原来两层或多层要素所具有的属性信息,并且还能从已有的数据中提取空间

35、隐含的信息。矢量数据的叠加分析分为点与多边形、线与多边形和多边形与多边形的叠加分析。(1)点与多边形的叠加分析是计算多边形对点的包含关系,用于统计或者属性赋值。例如:统计每个普查区中有多少个灯杆等。(2)线与多边形的叠加分析是比较线上坐标与多边形坐标的关系,判断线是否落入多边形内。利用它可以查找一个线要素类和一个多边形要素类共在的地理空间。例如:利用一个道路要素类和一个宗地要素类,可找出某条道路落在哪些宗地内,以及确定这条道路有多大部分落在这块宗地内。(3)多边形与多边形的叠加分析是将两个多边形叠加产生一个新多边形的操作,利用它可研究两要间的公共区域。例如:一个宗地多边形要素类和一个洪水区多边

36、形要素叠加,可获得每幅宗地是否被淹以及受淹的准确面积。7.3.1 相关类与接口(IBasicGeoprosor 接口)叠加分析所用到的主要接口是 IBasicGeoprosor 接口,它提供了基本的矢量数据处理的方法和属性,概况为叠置求交与叠置求和。组件类 BasicGeoprosor 封装了该接口,该接口包括 5 个方法( ersect、Union、Clip、Dissolve、Merge)和 2 个属性(SpatialReference和 CancelTracker)。1. Clip 方法Clip(剪切)方法是将输入要素数据集与裁切要素数据集的部分提取出来,并生成一个新的数据集的过程。它不改

37、变任何原有的数据集,图 7-20 是裁剪操作的输入条件和输出结果的示意图。图 7-20 矢量数据裁剪原理图2. Dissolve 方法Dissolve(融合)方法是将具有相同类别的要素合并为一个新的要素,具有相同属性的两个相邻多边形将合并成一个多边形,具有相同属性的两条相邻弧段将合并成一条弧段。图7-21 即展示了空间要素融合操作的输入条件和输出结果的示意图。图 7-21 矢量数据融合原理图3.ersect 方法ersect(相交)方法是计算两个图层的交集,裁切出两个矢量要素的公共部分,并保留两个数据集的所有属性信息。图 7-22 是矢量空间要素相交操作的输入条件和输出结果的示意图。图 7-2

38、2 矢量数据相交原理图4. Merge 方法Merge(合并)方法是将相同几何类型的多个要素类合并到一个新的要素类里面,常用于几何接边等操作。Merge 可以合并相同类型的点、线、多边形等要素类和表,合并操作并不处理要素,只简单地把要素放到一个要素类里,因此输出的要素类可能会有或缝隙;Merge 处理属性表时会把相同名字的字段一个,不同名字的字段按原名字、顺序全部加入输出要素类属性表中。图 7-23 是合并操作的示意图。图 7-23 合并操作原理图5. Union 方法Union(联合)方法是将两个多边形要素集的要素合并到一个新的要素集中,并保留两个要素集的属性和空间范围。Union 只能合并

39、 Polygon 类型的要素类,两个要素类合并时会处理相交部分。Union 处理属性表时不会把相同名字的字段一个,按照原字段样式全部加入输出要素类属性表中。图 7-24 是联合操作示意图。图 7-24 矢量数据联合原理图7.3.2 实例详解:两相交面图层的裁剪(Clip)分析关于裁剪操作,在 本书 7.1 讲解 ITopologicalOperator 接口时介绍了 Clip 方法,在IBasicGeoprosor 接口中也有 Clip 方法。这两个方法的区别是:ITopologicalOperator 是针对两矢量空间要素进行图形信息的裁剪;IBasicGeoproso 主要针对矢量要素集(

40、图层),其结果综合了原来两层或多层要素所具有的属性信息。实例代码位于随书光盘“chp07矢量数据分析code”中,实例数据位于随书光盘“chp07矢量数据分析data裁剪分析”中。本例利用 IBasicGeoprosor 接口的 Clip 方法实现两个相交面图层的裁剪分析操作,通过输入被裁剪要素图层和裁剪要素图层,获得目标要素图层,该图层的数据结构同被裁剪要素的数据结构保持一致。实现步骤如下:(1)主窗体中添加触发裁剪操作按钮事件的代码,通过获取裁剪图层和被裁剪图层,调用 Clip 公共方法,返回结果 FeatureClass 数据集,并加载到地图中;private void btnClipy

41、sis_Click(objecder, EventArgs e)/获得裁剪图层和被裁剪图层ILayILayInputLayer = GetLayerByName(省界面);ClipLayer = GetLayerByName(总地区界面);if (pInputLayer != null & pClipLayer != null)IFeatureLayIFeatureLayInputFeaLayer = pInputLayer as IFeatureLayer;ClipFeaLayer = pClipLayer as IFeatureLayer;/通过Clip方法进行裁剪操作,返回结果Featu

42、reClassIFeatureClass outFeatureClass = Clip(pInputFeaLayer.FeatureClass, pClipFeaLayer.FeatureClass, c:, 裁剪分析结果);if (outFeatureClass != null)/将结果FeatureClass数据转为FeatureLayerIFeatureLayFeatueLayer = new FeatureLayerClass();pFeatueLayer.FeatureClass = outFeatureClass; pFeatueLayer.Name = outFeatureCla

43、ss.AliasName;/将结果数据加载到地图中,并刷新地图控件this.axMapControl1.AddLayFeatueLayer);this.axMapControl1.Refresh();this.axTOCControl1.Refresh();( 2 ) 添加通过图层名称从地图 mapControl 空间中获取对应图层公共方法函数GetLayerByName(string layerName);private ILayer GetLayerByName(string layerName)/ 通过图层名称获取目标图层,传入参数为layerNameILayLayer = null;/

44、遍历MapControl中所有图层,找到与layerName名称相同的图层for (i = 0; i this.axMapControl1.LayerCount; i+)if (this.axMapControl1.get_Layer(i).Name = layerName)pLayer = this.axMapControl1.get_Layer(i); break;return pLayer;(3)添加 Clip 裁剪公共方法,利用 IBasicGeoprosor 接口中的 Clip 方法实现裁剪操作,生成ShFile 数据作为保存在磁盘中,并输出结果 FeatureClass 作为返回结

45、果数据;public IFeatureClass Clip(IFeatureClass pInputFeatureClass, IFeatureClass pClipFeatureClass, string filePath, string _pFileName)/设置输出结果IFeatureClaame相关必备属性IFeatureCla pOutPut.ShpOutPut.Shame pOutPut = new FeatureClaameClass();Type = pInputFeatureClass.ShType;FieldName = pInputFeatureClass.ShFiel

46、dName;pOutPut.FeatureType = esriFeatureType.esriFTSimple;/获取shFile数据工作空间IWorkspaceName pWsN = new WorkspaceNameClass();pWsN.WorkspaceFactoryProgID =esriDataSourFile.ShfileWorkspaceFactory;pWsN.PathName = filePath;/通过IDatasetName设置输出结果相关参数IDatasetName pDatasetName = pOutPut as IDatasetName; pDatasetN

47、ame.Name = _pFileName;pDatasetName.WorkspaceName = pWsN;/初始化IBasicGeoprosor对象,调用Clip方法IBasicGeoprosor pBasicGeo = new BasicGeoprosorClass();pBasicGeo.SpatialReference = axMapControl1.SpatialReference;/运用进行裁剪运算IFeatureClass pFeatureClass = pBasicGeo.Clip(pInputFeatureClass as false, pClipFeatureClass

48、 as ITable, false, 0.01, pOutPut);return pFeatureClass;ITable,(4)程序输出结果如图 7-25 所示。图 7-25 clip 裁剪分析输出结果展示7.4数据格式转换矢量数据的格式转换是 GIS常用的功能之一,在自己编写的应用中,也经常用到该功能。常用的数据格式转换方法主要有 ShFile 文件和 CAD 文件、Coverage 文件等的转换。在工程中经常使用空间数据库数据,因此将数据的文件格式导入(转化)为空间数据库格式(个人数据库、文件数据库和ArcSDE 数据库)也是常用的操作。ArcGIS Engine 针对上述转换方法提供了

49、相关接口和相应的地理处理工具,但是这些接口还不能做到无损转换,只是将一种格式文件的坐标和属性值写为另一种格式,符号信息往往丢失。如果要保证这些符号信息也能在另一种格式的文件中正确显示,则需要对原始的数据进行、遍历,然后写成指定的格式,7.4.3 节采用这种方式实现了保证符号不变情况下的ShFile 文件转 CAD 文件。(这里需要特别注意,ShFile 等文件是不能符号信息的,ArcGIS 能符号信息的是*.mxd 地图文档文件)7.4.1 相关类与接口(IFeatureDonverter 接口)数据格式转换操作主要用到 IFeatureDonverter 接口,它包含三个方法: Conver

50、tFeatureClass、ConvertFeatureDataset 和 ConvertTable,分别可以将要素类、要素集或表转换成其它数据集,它不仅可以转换单个的要素类或表,也可以转换整个数据集(如ArcInfo Coverage)。同时,FeatureDonverter 对象能够使数据在 Geodatabase,ShFile和 Coverages 等大多数的数据类型(除了标注)之间实现转换。在把数据引入 Geodatabase时,可以进行数据的条件筛选,只将符合条件的要素转换到目标要素集;当进行数据转入到ArcSDE Geodatabase 中时,还可以通过配置ArcSDE 的某些关键

51、字来指定参数。以 ConvertFeatureClass 方法为例说明,其转换过程各参数意义如下:(1)InputDatasetName(IFeatureClaame)参数用于指定输入要素类的一个 Name 对象,以确定待转换的矢量数据。(2)InputQueryFilter(IQueryFilter)参数用于过滤要转换的要素的 QueryFilter 对象,用以筛选待转换的矢量数据。(3)outputFDatasetName(IFeatureDatasetName)参数转换完成的要素类输出的新数据结果集成到现有数据集的IFeatureDatasetName 对象中。(4)outputFCla

52、ame(IFeatureClaame)参数转换完成后,输出要素类的Name 对象。(5)OutputGeometryDef(IGeometryDef)参数用于指定输出要素类的空间参考信息的 GeometryDef 对象。如果为 null,就使用输入要素类的空间参考信息。(6)OutputFields(IFields)参数用于指定输出要素类的字段集。如果把要素结果类输出为同样的数据格式,可以使用输入的要素类的字段集。如果格式有变化,建议使用 FieldChecker 以确保输出的格式有效。FieldChecker 对象可以用来验证一个字段集,这对于在不同格式间转换数据时很有用,因为不同格式的数据

53、集字段名可能不通用。FieldChecker 遇到字段名时能够根据一定的标准来纠正错误从而产生一个合法的字段集。在把数据转换成 Geodatabase 格式时,FieldChecker 将为 Geometry 字段和 OID 字段生成标准的名字(Sh和 ObjectID 字段)。(7)configKey(string)参数用于指定ArcSDE 配置关键字的字符串。此外, IFeatureDonverter 接口不支持下列数据的转换: Geometric Networks、Topologies、Network Datasets、 Relationship Classes、 Network fea

54、ture classes、Annoion orDimenfeature class、Feature classes with class extens 等等,因此在使用该方法时首先要进行有效验证。7.4.2实例详解-将 ShFile 数据导入到File Geodatabase本实例通过IFeatureDonverte 接口的ConvertFeatureClass 方法将ShFile 格式的数据转换导入到 File Geodatabase 数据库中,并可以设置属性筛选条件进行部分导入,实例代码位于随书光盘“chp07矢量数据分析code”中,实例数据位于随书光盘“chp07矢量数据分析dataS

55、hToFileDB”中。实现步骤为:(1)通过OpenFileDialog框打开需要导入的Sh格式数据;/首先打开sh数据IWorkspaceFactory pWorkspaceFactory = new ShfileWorkspaceFactory();OpenFileDialog openFileDialog1 = new OpenFileDialog();openFileDialog1.Filter = ShrFile(*.shp)|*.shp;openFileDialog1.Multiselect = false;DialogResult pDialogResult = openFil

56、eDialog1.ShowDialog(); if (pDialogResult != DialogResult.OK)return;string pPath = openFileDialog1.FileName;string pFolder = System.IO.Path.GetDirectoryName(pPath); string pFileName = System.IO.Path.GetFileName(pPath);(2)获得打开的ShFile 数据的工作空间和需要导入目标 File Geodatabase 文件空间数据库的工作空间,方便ShFile 数据的以及空间数据库的写入;

57、/获得ShFile数据的工作空间IWorkspaceName sourceWorkspaceName = new WorkspaceNameClass();sourceWorkspaceName.WorkspaceFactoryProgID =esriDataSourFile.ShfileWorkspaceFactory;sourceWorkspaceName.PathName = pFolder;IName sourceWorkspaceIName = (IName)sourceWorkspaceName;IWorkspaourceWorkspace = (IWorkspaourceWork

58、spaceIName.Open();/ 打开目标File GeodataBase然后并打开此文件数据库工作空间IWorkspaceNameWorkspaceName = new WorkspaceNameClassWorkspaceFactoryProgID = esriDataSourGDB.FileGDBWorkspaceFactory,PathName =pFolder+FileGDB.gdb;IName IWorkspaceWorkspaceIName = (IName)WorkspaceName;Workspace = (IWorkspace)WorkspaceIName.Open(

59、);(3)ShFile 数据的相关属性字段信息并且进行格式验证转换,以属性克隆的方式在 File Geodatabase 中新建相同属性字段的数据集;/ 将sh数据转化为IDatasetName数据集IFeatureClaame sourceFeatureClaame = new FeatureClaameClass();IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureCla sourceDatasetName.Name = pFileName.Split(.)0; sourceDatasetName.WorkspaceN

60、ame = sourceWorkspaceName;/ 为目标转化图层创建数据集ame;IFeatureClaIDatasetNameameFeatureClaame = new FeatureClaameClass();DatasetName = (IDatasetName)FeatureClaame;DatasetName.Name = pFileName.Split(.)0;DatasetName.WorkspaceName =WorkspaceName;/ 打开源sh数据获得IFeatureClassIName sourceName = (IName)sourceFeatureClaa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论