arcengine 兩個圖層疊加獲得,獲得地區圖層中各地區的對應的型別的面積
阿新 • • 發佈:2019-01-25
/// <summary> /// 兩個圖層疊加獲得,獲得地區圖層中各地區的對應的型別的面積 /// </summary> /// <param name="pathArea">邊界</param> /// <param name="pathType">型別</param> /// <param name="areaNameColumn">名字</param> /// <param name="typeColumn">型別欄位</param> private DataTable getTypeAreaPerRange(string pathArea, string pathType, string areaNameColumn, string typeColumn) { DataTable dt = new DataTable(); dt.Columns.Add("地名"); dt.Columns.Add("長度"); // HashTable hs = new HashTable(); //分別獲取Polyline和Polygon的要素類 IFeatureLayer pFeatureLayerPolygonArea = Lib.Layer.getShpLayer(pathArea, "polygon1"); IFeatureLayer pFeatureLayerPolygonType = Lib.Layer.getShpLayer(pathType, "polygon2"); IFeatureClass pFeatureClassPolygonArea = pFeatureLayerPolygonArea.FeatureClass; IFeatureClass pFeatureClassPolygonType = pFeatureLayerPolygonType.FeatureClass; IFeatureCursor pPolyCursor = pFeatureClassPolygonArea.Search(null, false); IFeature pPolyFeature = pPolyCursor.NextFeature(); int nameIndex = pPolyFeature.Fields.FindField(areaNameColumn); while (pPolyFeature != null) { Application.DoEvents(); //IFeature pFeaturePolygon = pFeatureClassPolygon.GetFeature(18); IPolygon pPolygon = pPolyFeature.ShapeCopy as IPolygon; //獲取線要素類的所有要素 IFeatureCursor pFeatureCursorPolyType = pFeatureClassPolygonType.Search(new QueryFilterClass(), false); IFeature pFeaturePolyType = pFeatureCursorPolyType.NextFeature(); //遍歷每一個線要素 double totalArea = 0; while (pFeaturePolyType != null) { //求該線與某個面要素相交的幾何線段 IPolygon pPolyType = pFeaturePolyType.ShapeCopy as IPolygon; ITopologicalOperator pTopologicalOperator = pPolyType as ITopologicalOperator; IGeometry Geo = pTopologicalOperator.Intersect(pPolygon, esriGeometryDimension.esriGeometry2Dimension); IFeatureBuffer FeaBuffer = pFeatureClassPolygonType.CreateFeatureBuffer(); FeaBuffer.Shape = Geo; IArea pArea = (IArea)FeaBuffer.Shape; totalArea += pArea.Area; //累加面內線要素幾何線段的長度 pFeaturePolyType = pFeatureCursorPolyType.NextFeature(); } DataRow dr = dt.NewRow(); dr[0] = pPolyFeature.get_Value(nameIndex); dr[1] = totalArea; dt.Rows.Add(dr); // MessageBox.Show(totalLength.ToString()); pPolyFeature = pPolyCursor.NextFeature(); } dataGridView1.DataSource = dt; tabControl1.SelectTab(tabPage2); return dt; }