C#读取shapefile文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#读取shapefile文件(不用AE)
1.创建工程文件,选窗体应用程序,命名为:EsriShpReader
2.添加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);
}