/// <summary> /// 打开mdb数据库 /// </summary> /// <param name="mdbFile"></param> /// <returns></returns> private static ESRI.ArcGIS.Geodatabase.IFeatureWorkspace GetAeWorkspace(string mdbFile) { ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace; ESRI.ArcGIS.Geodatabase.IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass(); featureWorkspace = workspaceFactory.OpenFromFile(mdbFile, 0) as ESRI.ArcGIS.Geodatabase.IFeatureWorkspace; System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceFactory); return(featureWorkspace); }
public static IPolygon GetPolyGonFromFile(string path) { IPolygon pGon = null; if (path.EndsWith(".mdb")) { string errmsg = ""; IWorkspaceFactory pwf = new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass(); IWorkspace pworkspace = pwf.OpenFromFile(path, 0); IEnumDataset pEnumdataset = pworkspace.get_Datasets(esriDatasetType.esriDTFeatureClass); pEnumdataset.Reset(); IDataset pDataset = pEnumdataset.Next(); while (pDataset != null) { IFeatureClass pFeatureclass = pDataset as IFeatureClass; if (pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolygon && pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolyline) { pDataset = pEnumdataset.Next(); continue; } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolygon) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { pGon = pFeature.Shape as IPolygon; break; } else { pDataset = pEnumdataset.Next(); continue; } } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolyline) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { IPolyline pPolyline = pFeature.Shape as IPolyline; pGon = GetPolygonFormLine(pPolyline); if (pGon.IsClosed == false) { errmsg = "选择的要素不能构成封闭多边形!"; pGon = null; pDataset = pEnumdataset.Next(); continue; } else { break; } } } } if (pGon == null) { IEnumDataset pEnumdataset1 = pworkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); pEnumdataset1.Reset(); pDataset = pEnumdataset1.Next(); while (pDataset != null) { IFeatureDataset pFeatureDataset = pDataset as IFeatureDataset; IEnumDataset pEnumDataset2 = pFeatureDataset.Subsets; pEnumDataset2.Reset(); IDataset pDataset1 = pEnumDataset2.Next(); while (pDataset1 != null) { if (pDataset1 is IFeatureClass) { IFeatureClass pFeatureclass = pDataset1 as IFeatureClass; if (pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolygon && pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolyline) { pDataset1 = pEnumDataset2.Next(); continue; } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolygon) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { pGon = pFeature.Shape as IPolygon; break; } else { pDataset1 = pEnumDataset2.Next(); continue; } } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolyline) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { IPolyline pPolyline = pFeature.Shape as IPolyline; pGon = GetPolygonFormLine(pPolyline); if (pGon.IsClosed == false) { errmsg = "选择的要素不能构成封闭多边形!"; pGon = null; pDataset1 = pEnumDataset2.Next(); continue; } else { break; } } } } } if (pGon != null) { break; } pDataset = pEnumdataset1.Next(); } } if (pGon == null) { if (errmsg != "") { System.Windows.Forms.MessageBox.Show(errmsg, "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); } else { System.Windows.Forms.MessageBox.Show("请选择一个包含面要素和线要素的文件", "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); } return(pGon); } } else if (path.EndsWith(".shp")) { IWorkspaceFactory pwf = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass(); string filepath = System.IO.Path.GetDirectoryName(path); string filename = path.Substring(path.LastIndexOf("\\") + 1); IFeatureWorkspace pFeatureworkspace = (IFeatureWorkspace)pwf.OpenFromFile(filepath, 0); IFeatureClass pFeatureclass = pFeatureworkspace.OpenFeatureClass(filename); if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolygon) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { pGon = pFeature.Shape as IPolygon; } } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolyline) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { IPolyline pPolyline = pFeature.Shape as IPolyline; pGon = GetPolygonFormLine(pPolyline); if (pGon.IsClosed == false) { System.Windows.Forms.MessageBox.Show("选择的线要素不能构成封闭多边形!", "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); return(null); } } } else { System.Windows.Forms.MessageBox.Show("请选择一个面或者线要素文件!", "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); return(null); } } else if (path.EndsWith(".txt")) { string txtpath = path; System.IO.StreamReader smRead = new System.IO.StreamReader(txtpath, System.Text.Encoding.Default); //设置路径 string line; IPointCollection pc = pGon as IPointCollection; double x, y; while ((line = smRead.ReadLine()) != null) { if (line.IndexOf(",") > 0) { try { x = double.Parse(line.Substring(0, line.IndexOf(","))); y = double.Parse(line.Substring(line.IndexOf(",") + 1)); } catch { System.Windows.Forms.MessageBox.Show("文本文件格式不正确!", "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); smRead.Close(); return(null); } IPoint tmpPoint = new ESRI.ArcGIS.Geometry.Point(); tmpPoint.X = x; tmpPoint.Y = y; object ep = System.Reflection.Missing.Value; pc.AddPoint(tmpPoint, ref ep, ref ep); } } smRead.Close(); ICurve pCurve = pGon as ICurve; if (pCurve.IsClosed == false) { System.Windows.Forms.MessageBox.Show("导入点坐标不能构成封闭多边形!", "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); return(null); } } else if (path.EndsWith("gdb")) { string errmsg = ""; IWorkspaceFactory pwf = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass(); IWorkspace pworkspace = pwf.OpenFromFile(path.Substring(0, path.LastIndexOf("\\")), 0); IEnumDataset pEnumdataset = pworkspace.get_Datasets(esriDatasetType.esriDTFeatureClass); pEnumdataset.Reset(); IDataset pDataset = pEnumdataset.Next(); while (pDataset != null) { IFeatureClass pFeatureclass = pDataset as IFeatureClass; if (pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolygon && pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolyline) { pDataset = pEnumdataset.Next(); continue; } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolygon) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { pGon = pFeature.Shape as IPolygon; break; } else { pDataset = pEnumdataset.Next(); continue; } } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolyline) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { IPolyline pPolyline = pFeature.Shape as IPolyline; pGon = GetPolygonFormLine(pPolyline); if (pGon.IsClosed == false) { errmsg = "选择的要素不能构成封闭多边形!"; pGon = null; pDataset = pEnumdataset.Next(); continue; } else { break; } } } } if (pGon == null) { IEnumDataset pEnumdataset1 = pworkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); pEnumdataset1.Reset(); pDataset = pEnumdataset1.Next(); while (pDataset != null) { IFeatureDataset pFeatureDataset = pDataset as IFeatureDataset; IEnumDataset pEnumDataset2 = pFeatureDataset.Subsets; pEnumDataset2.Reset(); IDataset pDataset1 = pEnumDataset2.Next(); while (pDataset1 != null) { if (pDataset1 is IFeatureClass) { IFeatureClass pFeatureclass = pDataset1 as IFeatureClass; if (pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolygon && pFeatureclass.ShapeType != esriGeometryType.esriGeometryPolyline) { pDataset1 = pEnumDataset2.Next(); continue; } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolygon) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { pGon = pFeature.Shape as IPolygon; break; } else { pDataset1 = pEnumDataset2.Next(); continue; } } else if (pFeatureclass.ShapeType == esriGeometryType.esriGeometryPolyline) { IFeatureCursor pCursor = pFeatureclass.Search(null, false); IFeature pFeature = pCursor.NextFeature(); if (pFeature != null) { IPolyline pPolyline = pFeature.Shape as IPolyline; pGon = GetPolygonFormLine(pPolyline); if (pGon.IsClosed == false) { errmsg = "选择的要素不能构成封闭多边形!"; pGon = null; pDataset1 = pEnumDataset2.Next(); continue; } else { break; } } } } } if (pGon != null) { break; } pDataset = pEnumdataset1.Next(); } } if (pGon == null) { if (errmsg != "") { System.Windows.Forms.MessageBox.Show(errmsg, "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); } else { System.Windows.Forms.MessageBox.Show("请选择一个包含面要素和线要素的文件", "提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); } return(pGon); } } return(pGon); }