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);

}

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.编译运行

C#读取shapefile文件(不用AE)的更多相关文章

  1. AE中Shapefile文件添加到SDE数据集

    linder_lee 原文 AE中Shapefile文件添加到SDE数据集(c#) 主要完成用C#,通过AE将本地Shapefile文件导入到SDE的指定数据集下面. 首先说下思路: (1) 通过Op ...

  2. python-geopandas读取、创建shapefile文件

    作者:fungis 描述:一个热带生活.乐于分享.努力搬砖的giser 交流邮箱:fungis@163.com shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Fea ...

  3. 高效读取大文件,再也不用担心 OOM 了!

    内存读取 第一个版本,采用内存读取的方式,所有的数据首先读读取到内存中,程序代码如下: Stopwatch stopwatch = Stopwatch.createStarted(); // 将全部行 ...

  4. maven下读取资源文件的问题(转)

    原文链接:http://shenchao.me/2016/04/20/maven%E4%B8%8B%E8%AF%BB%E5%8F%96%E8%B5%84%E6%BA%90%E6%96%87%E4%BB ...

  5. C++ AO读取shapefile的属性值

    C++ AO读取一个shapefile文件的所有属性值   #include "stdafx.h"   #include "iostream.h"   #inc ...

  6. Unity3D移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑 ...

  7. SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)

    读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...

  8. 在C#中创建和读取XML文件

    1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...

  9. 读取Excel文件的两种方法

    第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...

随机推荐

  1. pl/sql developer 登陆提示ORA-12514(转)

      pl/sql developer 登陆提示ORA-12514 说明监听服务已经起来了 备注:通过 lsnrctl 命令来启动/停止/查看/重载监听器/服务 lsnrctl start|stop|s ...

  2. loj 1017(dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25843 思路:我们可以发现题目与点的X坐标没有关系,于是可以直接对 ...

  3. HealthKit开发快速入门教程之HealthKit开发概述简介

    HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...

  4. 简单几何(线段相交) POJ 2826 An Easy Problem?!

    题目传送门 题意:两条线段看成两块木板,雨水从上方往下垂直落下,问能接受到的水的体积 分析:恶心的分类讨论题,考虑各种情况,尤其是入口被堵住的情况,我的方法是先判断最高的两个点是否在交点的同一侧,然后 ...

  5. cocos2d menu菜单类

    // 在init这个函数当中做一些初始化的事情 bool HelloWorld::init() { ////////////////////////////// // 先构造父级对象 if ( !CC ...

  6. BZOJ3640 : JC的小苹果

    设$f[i][j]$表示$hp$为$i$,在$j$点的概率,$d[i]$表示$i$的度数,$w[i]$表示经过$i$点要扣掉的血量. 对于$j$到$k$这条边,$f[i-w[k]][k]+=\frac ...

  7. BZOJ1707 : [Usaco2007 Nov]tanning分配防晒霜

    S向每头奶牛连边,容量1 每个防晒霜向T连边,容量cover 每头奶牛向SPF在自己范围内的防晒霜连边,容量inf 用线段树优化建图跑最大流即可. #include<cstdio> con ...

  8. TYVJ P1080 N皇后 Label:dfs PS:以前做的一道题,贴出来防忘

    描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描 ...

  9. 【BZOJ】2330: [SCOI2011]糖果(差分约束+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束运用了最短路中的三角形不等式,即d[v]<=d[u]+w(u, v),当然,最长 ...

  10. Java中实现文件上传下载的三种解决方案

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...