关于泰森多边形(转两篇)
1 private void CreatVoronoi()
2 {
3 //判定图层是否存在
4 IMap pMap = axMapControl1.Map;
5 if (pMap.LayerCount == 0)
6 {
7 MessageBox.Show("图层不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
8 return;
9 }
10 int k;
11 for (k = 0; k < axMapControl1.LayerCount; k++)
12 if (axMapControl1.get_Layer(k).Name == tbrCombo.Items[tbrCombo.SelectedIndex].ToString())
13 break;
14 IFeatureLayer pFeatureLayer = (IFeatureLayer)axMapControl1.get_Layer(k);
15 //IFeatureLayer pFeatureLayer = (IFeatureLayer)pMap.get_Layer(0);
16 IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
17 //判断图层的类型是否为点状图层
18 if (pFeatureClass.ShapeType != esriGeometryType.esriGeometryPoint)
19 {
20 MessageBox.Show("图层的要素不是Point类型,请重新选择图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
21 return;
22 }
23
24 int featureCount = pFeatureClass.FeatureCount(null);
25 //如果点数小于2则构不成三角形,退出程序
26 if (featureCount < 3)
27 {
28 MessageBox.Show("输入的点数小于3个,不能构成三角形!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
29 return;
30 }
31 MessageBox.Show(featureCount.ToString());
32 IGeoDataset pGDS = (IGeoDataset)pFeatureClass;
33 IEnvelope pEnv = (IEnvelope)pGDS.Extent;
34 pEnv.SpatialReference = pGDS.SpatialReference;
35 IFields pFields = pFeatureClass.Fields;
36 IField pHeightFiled = pFields.get_Field(pFields.FindField("ELEV"));
37 ITinEdit pTinEdit = new TinClass();
38 pTinEdit.InitNew(pEnv);
39 object Missing = Type.Missing;
40 pTinEdit.AddFromFeatureClass(pFeatureClass, null, null , null, esriTinSurfaceType.esriTinMassPoint, ref Missing );
41
42 IWorkspace pWorkspace = OpenWorkspace(InitialPath);
43 IFeatureClass pFClass;
44 pFClass = CreateFeatureClass(pWorkspace, esriGeometryType.esriGeometryPolygon, "Voronoi", 1);
45 ITinNodeCollection pTinNodeCollection = (ITinNodeCollection)pTinEdit;
46 MessageBox.Show(pTinNodeCollection.NodeCount.ToString());
47 pTinNodeCollection.ConvertToVoronoi;
48 Regions(pFClass, null, null, "NodeIndex", "ddd");
49 IFeatureLayer pFVLayer = new FeatureLayerClass();
50 pFVLayer.FeatureClass = pFClass;
51 pFVLayer.Name = pFClass.AliasName;
52 ILayer pVLayer = (ILayer)pFVLayer;
53 axMapControl1.AddLayer(pFVLayer);
54 axTOCControl1.Update();
55 }
2 {
3 //判定图层是否存在
4 IMap pMap = axMapControl1.Map;
5 if (pMap.LayerCount == 0)
6 {
7 MessageBox.Show("图层不存在!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
8 return;
9 }
10 int k;
11 for (k = 0; k < axMapControl1.LayerCount; k++)
12 if (axMapControl1.get_Layer(k).Name == tbrCombo.Items[tbrCombo.SelectedIndex].ToString())
13 break;
14 IFeatureLayer pFeatureLayer = (IFeatureLayer)axMapControl1.get_Layer(k);
15 //IFeatureLayer pFeatureLayer = (IFeatureLayer)pMap.get_Layer(0);
16 IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
17 //判断图层的类型是否为点状图层
18 if (pFeatureClass.ShapeType != esriGeometryType.esriGeometryPoint)
19 {
20 MessageBox.Show("图层的要素不是Point类型,请重新选择图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
21 return;
22 }
23
24 int featureCount = pFeatureClass.FeatureCount(null);
25 //如果点数小于2则构不成三角形,退出程序
26 if (featureCount < 3)
27 {
28 MessageBox.Show("输入的点数小于3个,不能构成三角形!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
29 return;
30 }
31 MessageBox.Show(featureCount.ToString());
32 IGeoDataset pGDS = (IGeoDataset)pFeatureClass;
33 IEnvelope pEnv = (IEnvelope)pGDS.Extent;
34 pEnv.SpatialReference = pGDS.SpatialReference;
35 IFields pFields = pFeatureClass.Fields;
36 IField pHeightFiled = pFields.get_Field(pFields.FindField("ELEV"));
37 ITinEdit pTinEdit = new TinClass();
38 pTinEdit.InitNew(pEnv);
39 object Missing = Type.Missing;
40 pTinEdit.AddFromFeatureClass(pFeatureClass, null, null , null, esriTinSurfaceType.esriTinMassPoint, ref Missing );
41
42 IWorkspace pWorkspace = OpenWorkspace(InitialPath);
43 IFeatureClass pFClass;
44 pFClass = CreateFeatureClass(pWorkspace, esriGeometryType.esriGeometryPolygon, "Voronoi", 1);
45 ITinNodeCollection pTinNodeCollection = (ITinNodeCollection)pTinEdit;
46 MessageBox.Show(pTinNodeCollection.NodeCount.ToString());
47 pTinNodeCollection.ConvertToVoronoi;
48 Regions(pFClass, null, null, "NodeIndex", "ddd");
49 IFeatureLayer pFVLayer = new FeatureLayerClass();
50 pFVLayer.FeatureClass = pFClass;
51 pFVLayer.Name = pFClass.AliasName;
52 ILayer pVLayer = (ILayer)pFVLayer;
53 axMapControl1.AddLayer(pFVLayer);
54 axTOCControl1.Update();
55 }
二篇:
1 /*ArcEngin提供了TIN组件,可以利用等高线或离散的高程值生成TIN的方法,其实等高线和离散点都可以看作是要素类—feature class
2 AE的组件TIN提供了一个非常重要的接口ITinEdit利用这个接口,可以方便地生成三维的TIN,
3 思路:1找到一个数据集,作为生成TIN的数据源,我们用shp文件来做,它必须有一个字段里含用高程值,2.利用ITinEdit接口生成TIN
4 重要的是这两个方法:InitNew(int pExtent,,IEnvelope)它需要一个IEnvelope接口的对象
5
6 以及方法:SetSpatialReference(int pSpatialReference,ISPatialReference);因此我们首先创建一个ISpatialReference接口对象,利用get_SpatialReference属性得到要素类的空间引用并将空间引用赋给ISpatialReference接口对象,再创建一个IEnvelope接口对象,利用putref_ SpatialReference属性将前面创建的ISpatialReference接口对象的空间引用赋给IEnvelope接口对象,再创建一个TIN对象并得到其ITinEdit接口,利用此接口的InitNew方法创建TIN,而前面创建的IEnvelope接口对象作为该方法的输入对象,这样就可以生成TIN了.
7 3.上面已能生成TIN,但生成的TIN并没有高程信息,要获得高程字段,再生成三维TIN,这要用到IFields接口和IField的指针,用其get_Fields方法获取高程信息.
8
9 代码如下:*/
10 //创建TIN数据,同时根据以有的要素类来创建泰森多边形
11
12 Public Sub CreateTin()
13 Dim TinSurface As ITin
14 Set TinSurface = New Tin
15 Dim FeatClass As IFeatureClass
16 Dim Pdocment As IMxDocument
17 Set Pdocment = ThisDocument
18 Dim pFeatureLayer As IFeatureLayer
19 Set pFeatureLayer = Pdocment.ActiveView.FocusMap.Layer(0)
20
21 Dim pEnv As IEnvelope
22 Set pEnv = pFeatureLayer.AreaOfInterest.Envelope
23
24 Dim pTinEdit As ITinEdit
25 Set pTinEdit = New Tin
26 pTinEdit.InitNew pEnv
27 pTinEdit.SaveAs "H:\New Folder\tin\a3", False '创建放的路径
28 pTinEdit.StartEditing
29
30
31 Set FeatClass = pFeatureLayer.FeatureClass
32
33 Dim pTagFeild As IField
34 Set pTagFeild = New Field
35
36
37 Dim pHightFeild As IField
38 Set pHightFeild = FeatClass.Fields.Field(0)
39 'MsgBox pHightFeild.Name
40
41 '//其中FeatClass.Fields.Field(2), 是要素类中的某一字段 作为Tin的高程信息
42 pTinEdit.AddFromFeatureClass FeatClass, Nothing, FeatClass.Fields.Field(2), FeatClass.Fields.Field(0), esriTinMassPoint
43 pTinEdit.StopEditing (True)
44 pTinEdit.Refresh
45
46 Dim pTinNodeCollection As ITinNodeCollection
47 Set pTinNodeCollection = pTinEdit
48 MsgBox pTinNodeCollection.NodeCount
49 Dim ptin As ITin
50 Set ptin = pTinEdit
51 MsgBox ptin.DataNodeCount
52 Dim pNewfeatureclass As IFeatureClass
53 Set pNewfeatureclass = OpenFeatureClass_Example
54
55 MsgBox ptin.DataEdgeCount
56 ///创建泰森多边形 OpenFeatureClass_Example是 找到的要素类图层
57 pTinNodeCollection.ConvertToVoronoiRegions OpenFeatureClass_Example, Nothing, Nothing, "NodeIndex", "asdf"
58
59 End Sub
60
61 //添加要素类的图层函数
62 Public Function OpenFeatureClass_Example() As IFeatureClass
63 Dim pWorkspaceFactory As IWorkspaceFactory
64 Set pWorkspaceFactory = New ShapefileWorkspaceFactory
65 Dim pFeatureWorkspace As IFeatureWorkspace
66 Set pFeatureWorkspace = pWorkspaceFactory.OpenFromFile("H:\New Folder", 0)
67
68 ' Dim pWorkspaceEdit As IWorkspaceEdit
69 ' Set pWorkspaceEdit = pFeatureWorkspace
70 ' pWorkspaceEdit.StartEditing True
71
72 Dim pFeatureClass As IFeatureClass
73 Set pFeatureClass = pFeatureWorkspace.OpenFeatureClass("Vor3")
74 Set OpenFeatureClass_Example = pFeatureClass
75 end function
2 AE的组件TIN提供了一个非常重要的接口ITinEdit利用这个接口,可以方便地生成三维的TIN,
3 思路:1找到一个数据集,作为生成TIN的数据源,我们用shp文件来做,它必须有一个字段里含用高程值,2.利用ITinEdit接口生成TIN
4 重要的是这两个方法:InitNew(int pExtent,,IEnvelope)它需要一个IEnvelope接口的对象
5
6 以及方法:SetSpatialReference(int pSpatialReference,ISPatialReference);因此我们首先创建一个ISpatialReference接口对象,利用get_SpatialReference属性得到要素类的空间引用并将空间引用赋给ISpatialReference接口对象,再创建一个IEnvelope接口对象,利用putref_ SpatialReference属性将前面创建的ISpatialReference接口对象的空间引用赋给IEnvelope接口对象,再创建一个TIN对象并得到其ITinEdit接口,利用此接口的InitNew方法创建TIN,而前面创建的IEnvelope接口对象作为该方法的输入对象,这样就可以生成TIN了.
7 3.上面已能生成TIN,但生成的TIN并没有高程信息,要获得高程字段,再生成三维TIN,这要用到IFields接口和IField的指针,用其get_Fields方法获取高程信息.
8
9 代码如下:*/
10 //创建TIN数据,同时根据以有的要素类来创建泰森多边形
11
12 Public Sub CreateTin()
13 Dim TinSurface As ITin
14 Set TinSurface = New Tin
15 Dim FeatClass As IFeatureClass
16 Dim Pdocment As IMxDocument
17 Set Pdocment = ThisDocument
18 Dim pFeatureLayer As IFeatureLayer
19 Set pFeatureLayer = Pdocment.ActiveView.FocusMap.Layer(0)
20
21 Dim pEnv As IEnvelope
22 Set pEnv = pFeatureLayer.AreaOfInterest.Envelope
23
24 Dim pTinEdit As ITinEdit
25 Set pTinEdit = New Tin
26 pTinEdit.InitNew pEnv
27 pTinEdit.SaveAs "H:\New Folder\tin\a3", False '创建放的路径
28 pTinEdit.StartEditing
29
30
31 Set FeatClass = pFeatureLayer.FeatureClass
32
33 Dim pTagFeild As IField
34 Set pTagFeild = New Field
35
36
37 Dim pHightFeild As IField
38 Set pHightFeild = FeatClass.Fields.Field(0)
39 'MsgBox pHightFeild.Name
40
41 '//其中FeatClass.Fields.Field(2), 是要素类中的某一字段 作为Tin的高程信息
42 pTinEdit.AddFromFeatureClass FeatClass, Nothing, FeatClass.Fields.Field(2), FeatClass.Fields.Field(0), esriTinMassPoint
43 pTinEdit.StopEditing (True)
44 pTinEdit.Refresh
45
46 Dim pTinNodeCollection As ITinNodeCollection
47 Set pTinNodeCollection = pTinEdit
48 MsgBox pTinNodeCollection.NodeCount
49 Dim ptin As ITin
50 Set ptin = pTinEdit
51 MsgBox ptin.DataNodeCount
52 Dim pNewfeatureclass As IFeatureClass
53 Set pNewfeatureclass = OpenFeatureClass_Example
54
55 MsgBox ptin.DataEdgeCount
56 ///创建泰森多边形 OpenFeatureClass_Example是 找到的要素类图层
57 pTinNodeCollection.ConvertToVoronoiRegions OpenFeatureClass_Example, Nothing, Nothing, "NodeIndex", "asdf"
58
59 End Sub
60
61 //添加要素类的图层函数
62 Public Function OpenFeatureClass_Example() As IFeatureClass
63 Dim pWorkspaceFactory As IWorkspaceFactory
64 Set pWorkspaceFactory = New ShapefileWorkspaceFactory
65 Dim pFeatureWorkspace As IFeatureWorkspace
66 Set pFeatureWorkspace = pWorkspaceFactory.OpenFromFile("H:\New Folder", 0)
67
68 ' Dim pWorkspaceEdit As IWorkspaceEdit
69 ' Set pWorkspaceEdit = pFeatureWorkspace
70 ' pWorkspaceEdit.StartEditing True
71
72 Dim pFeatureClass As IFeatureClass
73 Set pFeatureClass = pFeatureWorkspace.OpenFeatureClass("Vor3")
74 Set OpenFeatureClass_Example = pFeatureClass
75 end function