txt转shp

Posted 慕尼黑哲哉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了txt转shp相关的知识,希望对你有一定的参考价值。

实现坐标txt文件转shp点集数据文件的窗体Form

 

txt格式为:首行为“id,x,y”

第二行开始输入具体数值:id,x,y(x,y为具体的xy坐标)

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using NewDistrict;
 10 using System.IO;
 11 
 12 using System.Threading.Tasks;
 13 using ESRI.ArcGIS.Carto;
 14 using ESRI.ArcGIS.Controls;
 15 using ESRI.ArcGIS.DataSourcesFile;
 16 using ESRI.ArcGIS.Geodatabase;
 17 using ESRI.ArcGIS.Geometry;
 18 
 19 namespace SignalDeal
 20 {
 21     public partial class Formtxt2shp : Form
 22     {
 23         public Formtxt2shp()
 24         {
 25             ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
 26             InitializeComponent();
 27         }
 28 
 29 
 30         //选择Txt文件
 31         private void btn_TxtPath_Click(object sender, EventArgs e)
 32         {
 33             OpenFileDialog xjTxtOpenFileDialog = new OpenFileDialog();
 34             xjTxtOpenFileDialog.Multiselect = false;
 35             xjTxtOpenFileDialog.Title = "打开txt坐标文件";
 36             xjTxtOpenFileDialog.Filter = "txt坐标文件(*.txt)|*.txt";
 37             if (xjTxtOpenFileDialog.ShowDialog() == DialogResult.OK)
 38             {
 39                 txt_TxtPath.Text = xjTxtOpenFileDialog.FileName;
 40             }
 41         }
 42 
 43         //Shp矢量点保存路径
 44         private void btn_ShpPath_Click(object sender, EventArgs e)
 45         {
 46             SaveFileDialog xjShpSaveFileDialog = new SaveFileDialog();
 47             xjShpSaveFileDialog.Filter = "Shape文件(*.shp)|*.shp";
 48             if (File.Exists(txt_TxtPath.Text))
 49             {
 50                 xjShpSaveFileDialog.FileName = System.IO.Path.GetFileNameWithoutExtension(txt_TxtPath.Text);
 51             }
 52             if (xjShpSaveFileDialog.ShowDialog() == DialogResult.OK)
 53             {
 54                 txt_ShpPath.Text = xjShpSaveFileDialog.FileName;
 55             }
 56         }
 57 
 58 
 59         //显示保存
 60         //检查数据和路径
 61         private bool Check()
 62         {
 63             if (txt_TxtPath.Text == "" || !File.Exists(txt_TxtPath.Text))
 64             {
 65                 MessageBox.Show("数据无效,重选", "提示", MessageBoxButtons.OK);
 66                 return false;
 67             }
 68             if (txt_ShpPath.Text == "" || System.IO.Path.GetExtension(txt_ShpPath.Text).ToLower() != ".shp")
 69             {
 70                 MessageBox.Show("Shp矢量点保存路径无效,重选", "提示", MessageBoxButtons.OK);
 71                 return false;
 72             }
 73             return true;
 74         }
 75         //结构体
 76         struct Point
 77         {
 78             public string Name;
 79             public double X;
 80             public double Y;
 81         }
 82         List<string> xjColumn = new List<string>();
 83         //获取点数据
 84         private List<Point> GetPoint(string surveyDataFullName)
 85         {
 86                 List<Point> xjList = new List<Point>();
 87                 char[] xjchar = new char[] { \',\', \' \', \'\\t\' };  //常用的分隔符为逗号、空格、制位符
 88                 //读取
 89                 FileStream xjFileStream = new FileStream(surveyDataFullName, FileMode.Open);
 90                 StreamReader xjStreamReader = new StreamReader(xjFileStream, Encoding.Default);
 91                 string xjstringLine = xjStreamReader.ReadLine();
 92                 if (xjstringLine != null)
 93                 {
 94                     string[] xjstrArray = xjstringLine.Split(xjchar);
 95                     if (xjstrArray.Length > 0)
 96                     {
 97                         for (int i = 0; i < xjstrArray.Length; i++)
 98                         {
 99                             xjColumn.Add(xjstrArray[i]);
100                         }
101                     }
102 
103                     while ((xjstringLine = xjStreamReader.ReadLine()) != null)
104                     {
105                         //点信息的读取
106                         xjstrArray = xjstringLine.Split(xjchar);
107                         Point xjPoint = new Point();
108                         xjPoint.Name = xjstrArray[0].Trim();
109                         xjPoint.X = Convert.ToDouble(xjstrArray[1]);
110                         xjPoint.Y = Convert.ToDouble(xjstrArray[2]);
111 
112                         xjList.Add(xjPoint);
113                     }
114                 }
115                 else
116                 {
117                     return null;
118                 }
119                 xjStreamReader.Close();
120                 return xjList;
121             //catch (Exception ex)
122             //{
123             //    MessageBox.Show(ex.Message);
124             //    return null;
125             //}
126         }
127         //创建Shp矢量图层
128         private IFeatureLayer CreateShpFromPoints(List<Point> xjPointList, string xjFilePath)
129         {
130             int index = xjFilePath.LastIndexOf(\'\\\\\');
131             string xjFolder = xjFilePath.Substring(0, index);
132             string xjShapeName = xjFilePath.Substring(index + 1);
133             IWorkspaceFactory xjWsF = new ShapefileWorkspaceFactoryClass();
134             IFeatureWorkspace xjFWs = (IFeatureWorkspace)xjWsF.OpenFromFile(xjFolder, 0);
135 
136             IFields xjFields = new FieldsClass();
137             IFieldsEdit xjFieldsEdit;
138             xjFieldsEdit = (IFieldsEdit)xjFields;
139 
140             IField xjField = new FieldClass();
141             IFieldEdit xjFieldEdit = (IFieldEdit)xjField;
142             xjFieldEdit.Name_2 = "Shape";
143             xjFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
144             IGeometryDef xjGeometryDef = new GeometryDefClass();
145             IGeometryDefEdit xjGDefEdit = (IGeometryDefEdit)xjGeometryDef;
146             xjGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
147             //定义坐标系
148             ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
149             ISpatialReference pSpatialReference = pSRF.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Beijing1954_3_Degree_GK_CM_114E);
150             xjGDefEdit.SpatialReference_2 = pSpatialReference;
151 
152             xjFieldEdit.GeometryDef_2 = xjGeometryDef;
153             xjFieldsEdit.AddField(xjField);
154 
155             IFeatureClass xjFeatureClass;
156             xjFeatureClass = xjFWs.CreateFeatureClass(xjShapeName, xjFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
157 
158             IPoint xjPoint = new PointClass();
159 
160             for (int j = 0; j < xjPointList.Count; j++)
161             {
162 
163                 xjPoint.X = xjPointList[j].X;
164                 xjPoint.Y = xjPointList[j].Y;
165 
166                 IFeatureBuffer xjFeature = xjFeatureClass.CreateFeatureBuffer();
167                 IFeatureCursor featureCursor = xjFeatureClass.Insert(true);
168                 
169                 xjFeature.Shape = xjPoint;
170                 xjFeature.set_Value(xjFeature.Fields.FindField("id"), xjPointList[j].Name);
171                 featureCursor.InsertFeature(xjFeature); 
172             }
173 
174             IFeatureLayer xjFeatureLayer = new FeatureLayerClass();
175             xjFeatureLayer.Name = xjShapeName;
176             xjFeatureLayer.FeatureClass = xjFeatureClass;
177             return xjFeatureLayer;
178         }
179         //单击显示保存
180         private void btn_ShowSave_Click(object sender, EventArgs e)
181         {
182             if (Check())
183             {
184                 List<Point> xjPointList = GetPoint(txt_TxtPath.Text);
185                 if (xjPointList == null)
186                 {
187                     MessageBox.Show("选择文件是空的!");
188                 }
189                 else
190                 {
191                     IFeatureLayer pFeatureLayer = CreateShpFromPoints(xjPointList, txt_ShpPath.Text);
192                     //MainForm.m_mapControl.Map.AddLayer(pFeatureLayer);
193                 }
194             }
195             MessageBox.Show("完成!");
196         }
197     }
198 }
199 
200 Formtxt2shp.cs
Formtxt2shp.cs

 

以上是关于txt转shp的主要内容,如果未能解决你的问题,请参考以下文章

在Arcmap中将数据从文本格式转成点状shp格式数据,其中的坐标点在shp中展示出来

arcgis中如何将多个shp文件合并

shp与geojson格式互转

[Github]shapefile转json——对Github上shp2json项目的修改

如何把shp格式的文件转成CAD的dwg格式的文件

如何转换shp到geojson