using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Text; using System.Windows.Forms; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; namespace ShpTxt { public partial class FrmShapfile : Form { public FrmShapfile() { InitializeComponent(); } string InTxtpath; string InTxtName; string OutShapepath; string OutShapeName; string InShapepath; string InShapeName; string OutTxtPath; string OutTxtName; ISpatialReference pSRef = new ProjectedCoordinateSystemClass(); private void btnCreate_Click(object sender, EventArgs e) { //获取要存储的txt文件 string filepath = OutTxtPath+"\\"+OutTxtName+".txt"; string AttributePth = OutTxtPath + "\\"+OutTxtName + "Attr.txt"; FileStream myStream = new FileStream(filepath, FileMode.Create, FileAccess.ReadWrite); StreamWriter myWrite = new StreamWriter(myStream); FileStream attrStream = new FileStream(AttributePth, FileMode.Create, FileAccess.Write); StreamWriter attriWrite = new StreamWriter(attrStream); //打开工作空间 string fullpath = InShapepath; string filename =InShapeName ; IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass(); IWorkspace pWS = pWSF.OpenFromFile(fullpath, 0); IFeatureWorkspace pFWS = pWS as IFeatureWorkspace; IFeatureClass pFeatClass = pFWS.OpenFeatureClass(filename); IFields pFields = pFeatClass.Fields; //获取字段的名称 string FieldNameCol = ""; for (int j = 2; j < pFields.FieldCount-1; j++) { IField pField = pFields.get_Field(j); if (pField.Type != esriFieldType.esriFieldTypeGeometry) { string Name = pField.Name.Trim (); FieldNameCol += Name + "\t"; } } FieldNameCol += pFields.get_Field(pFields.FieldCount - 1).Name.Trim (); attriWrite.WriteLine(FieldNameCol); //获取字段的类型 string FieldTypeCol = ""; for (int j = 2; j < pFields.FieldCount-1; j++) { IField pField = pFields.get_Field(j); if (pField.Type != esriFieldType.esriFieldTypeGeometry) { string type = pField.Type.ToString().Trim(); FieldTypeCol += type + "\t"; } } FieldTypeCol += pFields.get_Field(pFields.FieldCount - 1).Type.ToString ().Trim (); attriWrite.WriteLine(FieldTypeCol); IFeatureCursor pFeatCursor = pFeatClass.Search(null, false); IFeature pFeat = pFeatCursor.NextFeature(); myWrite.WriteLine( pFeat.Shape.GeometryType.ToString().Remove(0, 12)); while (pFeat != null) { IGeometry pGeo = pFeat.Shape; IPointCollection pPointCol = pGeo as IPointCollection; string filedvalue = pFeat.get_Value(0).ToString().Trim(); myWrite.WriteLine(filedvalue); attriWrite.WriteLine(filedvalue); for (int i = 0; i < pPointCol.PointCount; i++) { IPoint pPoint = pPointCol.get_Point(i); myWrite.Write(i.ToString() + "\t"); string corrdinate = ""; corrdinate += pPoint.X.ToString() + "\t"; corrdinate += pPoint.Y.ToString(); myWrite.WriteLine(corrdinate); } myWrite.Flush(); //获得属性值 string ValueCol = ""; for (int k = 2; k < pFeat.Fields.FieldCount - 1; k++) { ValueCol += pFeat.get_Value(k).ToString().Trim() + "\t"; } ValueCol += pFeat.get_Value(pFeat.Fields.FieldCount - 1).ToString().Trim(); attriWrite.WriteLine(ValueCol); attriWrite.Flush(); pFeat = pFeatCursor.NextFeature(); } attriWrite.Close(); attrStream.Close(); myWrite.Close(); myStream.Close(); MessageBox.Show("成功!"); //this.Close(); } private void btnTransfer_Click(object sender, EventArgs e) { //创建一个新的shapfile工作空间 string fullpath = OutShapepath; IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass(); IWorkspace pWS = pWSF.OpenFromFile(fullpath, 0); IFields pFields = new FieldsClass(); IFieldsEdit pFEdits = pFields as IFieldsEdit; IField pField = new FieldClass(); IFieldEdit pFEdit = pField as IFieldEdit ; pFEdit.Name_2 = "Shape"; pFEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; IGeometryDef pGeoDef = new GeometryDefClass(); IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit ; //获取几何类型 string filepath = InTxtpath + "\\" + InTxtName + ".txt"; StreamReader myReader = new StreamReader(filepath, System.Text.Encoding.GetEncoding("GB2312"), true); string data = myReader.ReadLine().Trim(); if (data == "Polyline") pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline; else if (data == "Polygon") pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; else if (data == "Point") pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; pGeoDefEdit.SpatialReference_2 = pSRef; pFEdit.GeometryDef_2 = pGeoDef; pFEdits.AddField(pField); //获取字段的名称和类型 string AtrtiPath = InTxtpath + "\\" + InTxtName + "Attr.txt"; StreamReader AttriReader = new StreamReader(AtrtiPath, System.Text.Encoding.Default, true); AttriReader.BaseStream.Seek(0, SeekOrigin.Begin); string AReader = AttriReader.ReadLine(); string[] NameCol = AReader.Split('\t'); AReader = AttriReader.ReadLine(); string[] TypeCol = AReader.Split('\t'); for (int i = 0; i < NameCol.GetLength(0); i++) { pField = new FieldClass(); pFEdit = pField as IFieldEdit; pFEdit.Name_2 = NameCol[i].Trim(); string type = TypeCol[i].Trim() ; switch (type) { case "esriFieldTypeString": pFEdit.Type_2 = esriFieldType.esriFieldTypeString; break ; case "esriFieldTypeDouble": pFEdit.Type_2 = esriFieldType.esriFieldTypeDouble; break ; case "esriFieldTypeDate": pFEdit.Type_2 = esriFieldType.esriFieldTypeDate; break ; case "esriFieldTypeInteger": pFEdit.Type_2= esriFieldType.esriFieldTypeInteger ; break ; case "esriFieldTypeSmallInteger": pFEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger; break; } pFEdits.AddField(pField); } IFeatureWorkspace pFeatWS = pWS as IFeatureWorkspace; IFeatureClass pFeatClass = pFeatWS.CreateFeatureClass(OutShapeName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IPointCollection pPointCol = new MultipointClass(); while (data !="" && data !=null) { string[] d = data.Split('\t'); if (d.GetLength(0) == 1) { if (pPointCol.PointCount > 0) { AReader = AttriReader.ReadLine(); AReader = AttriReader.ReadLine(); string []AttriCol = AReader.Split('\t'); addFeature(pPointCol, pWS, pFeatClass,AttriCol); pPointCol = new MultipointClass(); } } else { string X = d[1]; string Y = d[2]; IPoint pPoint = new PointClass(); pPoint.X = Convert.ToDouble(X); pPoint.Y = Convert.ToDouble(Y); object missing= Type.Missing ; pPointCol.AddPoint(pPoint,ref missing, ref missing); } data = myReader.ReadLine(); } if (pPointCol.PointCount > 0) { AReader = AttriReader.ReadLine(); AReader = AttriReader.ReadLine(); string[] AttriCol = AReader.Split('\t'); addFeature(pPointCol, pWS, pFeatClass,AttriCol); pPointCol = new MultipointClass(); } myReader.Close(); MessageBox.Show("完成!"); //this.Close(); } private void addFeature(IPointCollection pPointCol, IWorkspace pWS, IFeatureClass pFeatClass, string[] ACol) { IWorkspaceEdit pWSEdit = pWS as IWorkspaceEdit; pWSEdit.StartEditOperation(); IFeature pFeat = pFeatClass.CreateFeature(); if (pFeat.Shape.GeometryType == esriGeometryType.esriGeometryPolygon) pFeat.Shape = AddPloygon(pPointCol); else if (pFeat.Shape.GeometryType == esriGeometryType.esriGeometryPolyline) pFeat.Shape = AddPolyline(pPointCol); else if (pFeat.Shape.GeometryType == esriGeometryType.esriGeometryPoint) pFeat.Shape = pPointCol.get_Point(0) as IGeometry; for (int i = 0; i < ACol.GetLength(0); i++) { pFeat.set_Value(i + 2, ACol[i].ToString()); } pFeat.Store(); pWSEdit.StopEditOperation(); } private IGeometry AddPloygon(IPointCollection pPointCol) { object missing = Type.Missing; IPolygon pPolygon = new PolygonClass(); ISegmentCollection pSegCol = pPolygon as ISegmentCollection; for (int i = 0; i < pPointCol.PointCount - 1; i++) { ILine pLine = new LineClass(); IPoint pFrom = pPointCol.get_Point(i); IPoint pTo = pPointCol.get_Point(i + 1); pLine.FromPoint = pFrom; pLine.ToPoint = pTo; ISegment pSeg = pLine as ISegment; pSegCol.AddSegment(pSeg, ref missing, ref missing); } ILine pLastLine = new LineClass(); IPoint pFromP = pPointCol.get_Point(pPointCol.PointCount - 1); IPoint pToP = pPointCol.get_Point(0); pLastLine.FromPoint = pFromP; pLastLine.ToPoint = pToP; ISegment pLastSeg = pLastLine as ISegment; pSegCol.AddSegment(pLastSeg, ref missing, ref missing); pPolygon.Close(); IGeometry pGeometry = pPolygon as IGeometry; return pGeometry; } private IGeometry AddPolyline(IPointCollection pPointCol) { object missing = Type.Missing; IPolyline pPolline = new PolylineClass(); ISegmentCollection pSegCol = pPolline as ISegmentCollection; for (int i = 0; i < pPointCol.PointCount - 1; i++) { ILine pLine = new LineClass(); IPoint pFrom = pPointCol.get_Point(i); IPoint pTo = pPointCol.get_Point(i + 1); pLine.FromPoint = pFrom; pLine.ToPoint = pTo; ISegment pSeg = pLine as ISegment; pSegCol.AddSegment(pSeg, ref missing, ref missing); } IGeometry pGeometry = pPolline as IGeometry; return pGeometry; } private void btnTxtOpen_Click(object sender, EventArgs e) { OpenFileDialog InputTxt = new OpenFileDialog(); InputTxt.Filter = "Text file(*.txt)|*.txt"; InputTxt.Multiselect = false; DialogResult txtResult = InputTxt.ShowDialog(); if (txtResult != DialogResult.OK) return; string InTxtfullpath = InputTxt.FileName; InTxtpath = System.IO.Path.GetDirectoryName(InTxtfullpath); InTxtName = System.IO.Path.GetFileNameWithoutExtension(InTxtfullpath); txtInputTxt.Text = InTxtfullpath; } private void btnInputShape_Click(object sender, EventArgs e) { SaveFileDialog OutPutShape = new SaveFileDialog(); OutPutShape.Filter = "Shapefile(*.shp)|*.shp"; DialogResult shapeResult = OutPutShape.ShowDialog(); if (shapeResult != DialogResult.OK) return; string Shapefullpath = OutPutShape.FileName; OutShapepath = System.IO.Path.GetDirectoryName(Shapefullpath); OutShapeName = System.IO.Path.GetFileNameWithoutExtension(Shapefullpath); txtOutputShape.Text = Shapefullpath; } private void btnCnacel_Click(object sender, EventArgs e) { this.Close(); } private void btnCoordinate_Click(object sender, EventArgs e) { OpenFileDialog OpenRef = new OpenFileDialog(); OpenRef.Filter = "Shapefile(*.shp)|*.shp|坐标系统(*.prj)|*.prj"; OpenRef.Multiselect = false; DialogResult RefResult = OpenRef.ShowDialog(); if (RefResult != DialogResult.OK) return; string fullpath = OpenRef.FileName; string filepath = System.IO.Path.GetDirectoryName(fullpath); string filename = System.IO.Path.GetFileNameWithoutExtension(fullpath); if (OpenRef.FilterIndex == 1) { IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass(); IWorkspace pWS = pWSF.OpenFromFile(filepath, 0); IFeatureWorkspace pFWS = pWS as IFeatureWorkspace; IFeatureClass pFeatClass = pFWS.OpenFeatureClass(filename); IGeoDataset pGeoDataset = pFeatClass as IGeoDataset; pSRef = pGeoDataset.SpatialReference; ISpatialReferenceInfo pSRFInfo = pSRef as ISpatialReferenceInfo; txtCoordinate.Text = pSRFInfo.Name; } else { ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass(); pSRef= pSRF.CreateESRISpatialReferenceFromPRJFile(fullpath); txtCoordinate.Text = filename; } } private void btnClose_Click(object sender, EventArgs e) { this.Close(); } private void btnInShape_Click(object sender, EventArgs e) { OpenFileDialog OpenShape = new OpenFileDialog(); OpenShape.Filter = "Shapefile(*.shp)|*.shp"; OpenShape.Multiselect = false; DialogResult OpenResult = OpenShape.ShowDialog(); if (OpenResult != DialogResult.OK) return; string fullpath = OpenShape.FileName; InShapepath = System.IO.Path.GetDirectoryName(fullpath); InShapeName = System.IO.Path.GetFileNameWithoutExtension(fullpath); txtInShape.Text = fullpath; } private void btnOutTxt_Click(object sender, EventArgs e) { SaveFileDialog SaveTxt = new SaveFileDialog(); SaveTxt.Filter = "Text file(*.txt)|*.txt"; DialogResult SaveResult = SaveTxt.ShowDialog(); if (SaveResult != DialogResult.OK) return; string fullpath = SaveTxt.FileName; OutTxtPath = System.IO.Path.GetDirectoryName(fullpath); OutTxtName = System.IO.Path.GetFileNameWithoutExtension(fullpath); txtOutTxt.Text = fullpath; } } } ...
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240825082459112-376424429.jpg)