当前位置:文档之家› C#读取shapefile文件

C#读取shapefile文件

C#读取shapefile文件(不用AE)1.创建工程文件,选窗体应用程序,命名为:EsriShpReader2.添加SplitContainer控件到窗体3.在SplitContainer.panel1中添加两个按钮Button,text属性分别改为“打开”,“刷新”4. 在SplitContainer.panel2中添加panel容器,用来显示图像Dock设置为Fill,背景颜色设置为白色5.界面图如下:6.在过程文件中添加类文件,命名为ShpClass编写点、线、面、三个类class Point//点类{public double X;public double Y;}class Polyline//线类{public double[] Box=new double[4];public int NumParts;public int NumPoints;public ArrayList Parts; //在部分中第一个点的索引public ArrayList Points; //所有部分的点}class Polygon : Polyline//面类{ }7.在Form1中添加ArrayList polygons = new ArrayList();//面集合ArrayList polylines = new ArrayList();//线集合ArrayList points = new ArrayList();//点集合Pen pen = new Pen(Color.Black, 1);//定义画笔int ShapeType;//shp文件类型int count;//计数double xmin, ymin, xmax, ymax;double n1, n2;//x,y轴放大倍数8.添加button1的Click事件,添加代码string shpfilepath = "";openFileDialog1.Filter = "shapefiles(*.shp)|*.shp|All files(*.*)|*.*";//打开文件路径if (openFileDialog1.ShowDialog() == DialogResult.OK){shpfilepath = openFileDialog1.FileName;BinaryReader br = new BinaryReader(openFileDialog1.OpenFile());//读取文件过程br.ReadBytes(24);int FileLength = br.ReadInt32();//<0代表数据长度未知int FileBanben = br.ReadInt32();ShapeType = br.ReadInt32();xmin = br.ReadDouble();ymax = -1 * br.ReadDouble();xmax = br.ReadDouble();ymin = -1 * br.ReadDouble();double width = xmax - xmin;double height = ymax - ymin;n1 = (float)(this.panel1.Width * 0.9 / width);//x轴放大倍数n2 = (float)(this.panel1.Height * 0.9 / height);//y轴放大倍数br.ReadBytes(32);switch (ShapeType){case 1:points.Clear();while (br.PeekChar() != -1){Point point = new Point();uint RecordNum = br.ReadUInt32();int DataLength = br.ReadInt32();//读取第i个记录br.ReadInt32();point.X = br.ReadDouble();point.Y = -1 * br.ReadDouble();points.Add(point);}StreamWriter sw = new StreamWriter("point.txt");foreach (Point p in points){sw.WriteLine("{0},{1},{2} ", p.X, -1 * p.Y, 0);}sw.Close();break;case 3:polylines.Clear();while (br.PeekChar() != -1){Polyline polyline = new Polyline();polyline.Box = new double[4];polyline.Parts = new ArrayList();polyline.Points = new ArrayList();uint RecordNum = br.ReadUInt32();int DataLength = br.ReadInt32();//读取第i个记录br.ReadInt32();polyline.Box[0] = br.ReadDouble();polyline.Box[1] = br.ReadDouble();polyline.Box[2] = br.ReadDouble();polyline.Box[3] = br.ReadDouble();polyline.NumParts = br.ReadInt32();polyline.NumPoints = br.ReadInt32();for (int i = 0; i < polyline.NumParts; i++) {int parts = new int();parts = br.ReadInt32();polyline.Parts.Add(parts);}for (int j = 0; j < polyline.NumPoints; j++){Point pointtemp = new Point();pointtemp.X = br.ReadDouble();pointtemp.Y = -1 * br.ReadDouble();polyline.Points.Add(pointtemp);}polylines.Add(polyline);}StreamWriter sw2 = new StreamWriter("line.txt");count = 1;foreach (Polyline p in polylines){for (int i = 0; i < p.NumParts; i++){int startpoint;int endpoint;if (i == p.NumParts - 1){startpoint = (int)p.Parts[i];endpoint = p.NumPoints;}else{startpoint = (int)p.Parts[i];endpoint = (int)p.Parts[i + 1];}sw2.WriteLine("线" + count.ToString() + ":");for (int k = 0, j = startpoint; j < endpoint; j++, k++){Point ps = (Point)p.Points[j];sw2.WriteLine(" {0},{1},{2} ", ps.X, -1 * ps.Y, 0);}count++;}}sw2.Close();break;case 5:polygons.Clear();while (br.PeekChar() != -1){Polygon polygon = new Polygon();polygon.Parts = new ArrayList();polygon.Points = new ArrayList();uint RecordNum = br.ReadUInt32();int DataLength = br.ReadInt32();//读取第i个记录int m = br.ReadInt32();for (int i = 0; i < 4; i++){polygon.Box[i] = br.ReadDouble();}polygon.NumParts = br.ReadInt32();polygon.NumPoints = br.ReadInt32();for (int j = 0; j < polygon.NumParts; j++){int parts = new int();parts = br.ReadInt32();polygon.Parts.Add(parts);}for (int j = 0; j < polygon.NumPoints; j++){Point pointtemp = new Point();pointtemp.X = br.ReadDouble();pointtemp.Y = -1 * br.ReadDouble();polygon.Points.Add(pointtemp);}polygons.Add(polygon);}StreamWriter sw1 = new StreamWriter("polygon.txt");count = 1;foreach (Polygon p in polygons){for (int i = 0; i < p.NumParts; i++){int startpoint;int endpoint;if (i == p.NumParts - 1){startpoint = (int)p.Parts[i];endpoint = p.NumPoints;}else{startpoint = (int)p.Parts[i];endpoint= (int)p.Parts[i + 1];}sw1.WriteLine("多边形" + count.ToString() + ":");for (int k = 0, j = startpoint; j < endpoint; j++, k++){Point ps = (Point)p.Points[j];sw1.WriteLine(" {0},{1},{2} ", ps.X, -1 * ps.Y, 0);}count++;}}sw1.Close();break;}}9. 添加button2的Click事件,添加代码double width = xmax - xmin;//图像宽double height = ymax - ymin;//图像高n1 = (float)(this.panel1.Width * 0.9 / width);//x轴放大倍数n2 = (float)(this.panel1.Height * 0.9 / height);//y轴放大倍数this.panel1.Refresh();10.添加panel1的paint事件private void panel1_Paint(object sender, PaintEventArgs e){PointF[] point;switch (ShapeType){case 1://点类型foreach (Point p in points){PointF pp = new PointF();pp.X = (float)(10 + (p.X - xmin) * n1);pp.Y = (float)(10 + (p.Y - ymin) * n2);e.Graphics.DrawEllipse(pen, pp.X, pp.Y, 1.5f, 1.5f);break;case 3://线类型foreach (Polyline p in polylines){for (int i = 0; i < p.NumParts; i++){int startpoint;int endpoint;point = null;if (i == p.NumParts - 1){startpoint = (int)p.Parts[i];endpoint = p.NumPoints;}else{startpoint = (int)p.Parts[i];endpoint = (int)p.Parts[i + 1];}point = new PointF[endpoint - startpoint];for (int k = 0, j = startpoint; j < endpoint; j++, k++){Point ps = (Point)p.Points[j];point[k].X = (float)(10 + (ps.X - xmin) * n1);point[k].Y = (float)(10 + (ps.Y - ymin) * n2);}e.Graphics.DrawLines(pen, point);}break;case 5://面类型foreach (Polygon p in polygons){for (int i = 0; i < p.NumParts; i++){int startpoint;int endpoint;point = null;if (i == p.NumParts - 1){startpoint = (int)p.Parts[i];endpoint = p.NumPoints;}else{startpoint = (int)p.Parts[i];endpoint = (int)p.Parts[i + 1];}point = new PointF[endpoint - startpoint];for (int k = 0, j = startpoint; j < endpoint; j++, k++) {Point ps = (Point)p.Points[j];point[k].X = (float)(10 + (ps.X - xmin) * n1);point[k].Y = (float)(10 + (ps.Y - ymin) * n2);}e.Graphics.DrawPolygon(pen, point);}}break;}}11.编译运行。

相关主题