shp to txt arcgis

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://www.cnblogs.com/hl3292/p/1965566.html