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);
}
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)的更多相关文章
- AE中Shapefile文件添加到SDE数据集
linder_lee 原文 AE中Shapefile文件添加到SDE数据集(c#) 主要完成用C#,通过AE将本地Shapefile文件导入到SDE的指定数据集下面. 首先说下思路: (1) 通过Op ...
- python-geopandas读取、创建shapefile文件
作者:fungis 描述:一个热带生活.乐于分享.努力搬砖的giser 交流邮箱:fungis@163.com shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Fea ...
- 高效读取大文件,再也不用担心 OOM 了!
内存读取 第一个版本,采用内存读取的方式,所有的数据首先读读取到内存中,程序代码如下: Stopwatch stopwatch = Stopwatch.createStarted(); // 将全部行 ...
- 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 ...
- C++ AO读取shapefile的属性值
C++ AO读取一个shapefile文件的所有属性值 #include "stdafx.h" #include "iostream.h" #inc ...
- Unity3D移动平台动态读取外部文件全解析
前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑 ...
- SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)
读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...
- 在C#中创建和读取XML文件
1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...
- 读取Excel文件的两种方法
第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...
随机推荐
- struts2文件上传类型的过滤
转自:http://www.2cto.com/kf/201403/282787.html 第一种解决方案: 1.手动实现文件过滤: 判断上传的文件是否在允许的范围内定义该Action允许上传的文件类型 ...
- ML 05、分类、标注与回归
机器学习算法 原理.实现与实践 —— 分类.标注与回归 1. 分类问题 分类问题是监督学习的一个核心问题.在监督学习中,当输出变量$Y$取有限个离散值时,预测问题便成为分类问题. 监督学习从数据中学习 ...
- SQL_Server_2005_函数大全(描述及实例)
为了方便阅读,把函数分为四种类型,分别表述. SQL_Server_2005_字符串函数(描述及实例) 函数名称:ascii.char.charindex.difference.left.right. ...
- 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置
涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...
- SU Demos-02Filtering-07Sumedian
不足之处,欢迎批评指正. 先看脚本内容: 脚本中用到的4个参数文件,是一系列x,t数据对,数组(x,t) 运行结果,
- js:语言精髓笔记9--函数式语言特征
形式化运算系统的研究: 图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题: 冯诺依曼:提出了冯诺依曼体系:即通过修改内存反映运算结果: 阿隆左.丘奇:提出新的运算范型Lambda演算,计算机 ...
- HashMap两种遍历数据的方式
HashMap的遍历有两种方式,一种是entrySet的方式,另外一种是keySet的方式. 第一种利用entrySet的方式: Map map = new HashMap(); Iterator i ...
- HDU3138 Coconuts(最小割)
题目大概说有n个人每个人各有一个信仰0或1,他们中有m对朋友关系,现在要对一件事投票,可以为了和信仰不同的朋友一样而违背自己的信仰和朋友投一样的票,问违背信仰的人数加上和朋友投票结果不同的人数总和的最 ...
- LightOJ1025 The Specials Menu(区间DP)
给一个字符串,问有几种删字符的方式使删后的非空字符串是个回文串. 当然区间DP:dp[i][j]表示子串stri...strj的方案数 感觉不好转移,可能重复算了.我手算了"AAA" ...
- BZOJ3012 : [Usaco2012 Dec]First!
建立Trie,那么成为答案的串必须满足其终止节点到根路径上没有其它点. 对于Trie上每个节点维护一个bitset,表示哪些字符必须在哪些字符之前. 每到达一个可能成为答案的终止节点,对图进行拓扑排序 ...