基本信息
源码名称:C#操作shapfile
源码大小:0.70M
文件格式:.rar
开发语言:C#
更新时间:2019-08-10
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 11 元×
微信扫码支付:11 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
读取shapfile文件
读取shapfile文件
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace EsriShpReader { public partial class Form1 : Form { public Form1() { InitializeComponent(); } 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轴放大倍数 private void Form1_Load(object sender, EventArgs e) { } private void button_open_Click(object sender, EventArgs e) { string shpfilepath = ""; OpenFileDialog openFileDialog1 = new OpenFileDialog(); 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; } } } private void button_updata_Click(object sender, EventArgs e) { 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(); } 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; } // 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; } } } }