对shapefile文件进行读写绘制实验报告_第1页
对shapefile文件进行读写绘制实验报告_第2页
对shapefile文件进行读写绘制实验报告_第3页
对shapefile文件进行读写绘制实验报告_第4页
对shapefile文件进行读写绘制实验报告_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、综合性实验报告专业 地理信息系统 年级 11级 学号 201130670225 姓名 吴秀春时间 2013年7月4日一、 实验名称:设计程序,实现对ESRI的Shapefile格式文件进行读取和绘制,并实现相应的地图(图形)浏览功能。二、 实验目的:考察学生对于课程的基础知识掌握程度,以及检验学生综合运用所学课程知识和技能分析问题,解决问题的能力,为后续课程有的放矢地开展与安排提供参考。三、 实验准备(数据与软件):1开发环境和测试数据开发环境采用Visual studio 2010.Net,开发语言为C#,实验测试数据为.shp类型文件2 相关文档阅读:ESRI公开的Shapefile白皮书

2、ESRI Shapefile Technical Description;IBM公开的DBF文件格式。四、 实验原理(方法):通过进行文件的操作,把.shp文件读取出来,并且通过变量把文件的信息记录下来,通过面向对象的方法,实现对图形的绘制操作,从而实现整一个实验的主要内容。五、 内容与步骤:1、 了解shapefile的文件组织形式,以及各个组成部分的数据结构(1)一个.shp文件由文件头和记录组成。文件头大小为100个字节,其布局如下表:Position Field Value Type OrderByte 0 File Code 9994 Integer BigByte 4 Unused

3、 0 Integer BigByte 8 Unused 0 Integer BigByte 12 Unused 0 Integer BigByte 16 Unused 0 Integer BigByte 20 Unused 0 Integer BigByte 24 File Length File Length Integer BigByte 28 Version 1000 Integer LittleByte 32 Shape Type Shape TypeInteger LittleByte 36 Bounding Box Xmin Double LittleByte 44 Boundin

4、g Box Ymin Double LittleByte 52 Bounding Box Xmax Double LittleByte 60 Bounding Box Ymax Double LittleByte 68* Bounding Box Zmin Double LittleByte 76* Bounding Box Zmax Double LittleByte 84* Bounding Box Mmin Double LittleByte 92* Bounding BoxMmax Double Little* Unused, with value 0.0, if not Measur

5、ed or Z typel 注意其中的字节顺序,Big表示大尾(big endian)型字节顺序,即是高低位字节是反序的,主要适用于Sun or Motorola平台,而Little表示小尾(little endian)型字节顺序,高低位字节顺序不变,主要使用在PC or Intel平台。在读取的字节为Big时,需要进行字节顺序交换,才能得出正确的值。一个把Big顺序转换为Little顺序的函数可以如下:int Big2LittleEndian(int num) int reverse; /返回结果 char bit0, bit1, bit2, bit3; bit0 = (num & 0x00

6、0000ff); bit1 = (num & 0x0000ff00) 8; bit2 = (num & 0x00ff0000) 16; bit3 = (num & 0xff000000) 24; reverse = (bit0 24) | (bit1 16) | (bit2 8) | (bit3); return reverse;l 文件头中第32-35位字节为一个整型,其值反映了shapefile的图形对象类型,具体值对应含义如下:Value Shape Type0 Null Shape1 Point3 PolyLine5 Polygon8 MultiPoint11 PointZ13 Pol

7、yLineZ15 PolygonZ18 MultiPointZ21 PointM23 PolyLineM25 PolygonM28 MultiPointM31 MultiPatchl 第36-67个字节包含了图幅的范围大小。(2)、每条记录由记录头和实体内容组成,记录头格式固定,具体组成如下所示:Position Field Value Type Byte OrderByte 0Record Number Record Number Integer BigByte 4 Content Length Content Length Integer Big记录头包含8个字节,0-3表示记录的顺序号,

8、4-7表示记录实体自身的大小。实体的内容根据对象类型不同而变化,需根据具体情况处理。关于Shapefile的.shx文件的说明.shx文件由文件头和记录组成,文件头与前述.shp文件一致,但需注意File Length字段的值不一样。而每条记录由2个整型组成,具体内容如下:Position Field Value Type Byte OrderByte 0 Offset Offset Integer BigByte 4 Content Length Content Length Integer Big其中,offset表示该条记录在.shp文件中的字节位置,而Content Length说明了

9、记录的大小。关于.DBF文件的说明标准的DBF文件,是由头文件和实体信息两部分构成(如图1所示)。文件头记录1记录2记录3记录4记录n图1 DBF文件的结构(1)、文件头部分文件头部分的长度是不定长的,它主要对DBF文件作了一些总体说明(表),其中最主要的是对这个DBF文件的记录项的信息进行了详细地描述,比如对每个记录项的名称、数据类型、长度等信息都有具体的说明。在文件中的位置内容说明01个字节表示当前的版本信息133个字节表示最近的更新日期,按照YYMMDD格式。471个32位数文件中的记录条数。891个16位数文件头中的字节数。10111个16位数一条记录中的字节长度。12132个字节保留

10、字节,用于以后添加新的说明性信息时使用,这里用0来填写。141个字节表示未完成的操作。 151个字节dBASE IV编密码标记。162712个字节保留字节,用于多用户处理时使用。281个字节DBF文件的MDX标识。在创建一个DBF 表时 ,如果使用了MDX 格式的索引文件,那么 DBF 表的表头中的这个字节就自动被设置了一个标志,当你下次试图重新打开这个DBF表的时候,数据引擎会自动识别这个标志,如果此标志为真,则数据引擎将试图打开相应的MDX 文件。291个字节Language driver ID.30312个字节保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。32X(n*32)

11、个字节记录项信息描述数组。n表示记录项的个数。这个数组的结构在下表中有详细的解释。X11个字节作为记录项终止标识。文件(.dbf)的文件头位置内容说明01011个字节记录项名称,是ASCII码值。111个字节记录项的数据类型,是ASCII码值。(B、C、D、G、L、M和N,具体的解释见下表)。12154个字节保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。161个字节记录项长度,二进制型。171个字节记录项的精度,二进制型。18192个字节保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。201个字节工作区ID。213010个字节保留字节,用于以后添加新的说明性信息时使用

12、,这里用0来填写。311个字节MDX标识。如果存在一个MDX 格式的索引文件,那么这个记录项为真,否则为空。 记录项信息描述代码数据类型允许输入的数据B二进制型各种字符。C字符型各种字符。D日期型用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。G(General or OLE)各种字符。N数值型(Numeric)- . 0 1 2 3 4 5 6 7 8 9 L逻辑型(Logical)? Y y N n T t F f (? 表示没有初始化)。 M(Memo)各种字符。dbf文件中的数据类型注意:记录项的数目在文件头中没有明确给出,但是可以根据第8-9字节的整型知道文件头

13、的大小,减去其他的固定的字节数(32),然后除以32就可以得出其值n。(2)、实体信息实体信息部分就是一条记录,每条记录都是由若干个记录项构成,因此只要依次循环读取每条记录就可以了。2、 系统功能需求分析:根据要求,该程序必须满足最基本的三个功能,一个是能够对shpefile文件进行读取,另外两个分别是对文件属性的浏览还有就是绘制图形文件,所以在程序设计的过程之中,必须要让自己的系统能够满足这三个最基本的要求。3、 整个程序一共有六个模块,系统图如图所示:本程序系统设计六个模块,分别是读取文件,查看文件属性信息,绘制图形,修改颜色,修改线宽和清空图形。模块图如图所示: 程序系统读取.shp文件

14、查看文件属性绘制图形修改颜色修改线宽清空图形4、 打开软件,新建windows 窗体项目,如图所示:5、 在FORM窗体上添加1个menustrip控件,6个label控件,1个penul控件,1个textbook控件,3个button控件,2个groupbox控件并相应的修改部分控件enabled属性,将之初始化为flase。如图所示:6、 为项目添加一个新的窗体form2,用来实现改变线条宽度的功能,结果如图所示:7、 为项目添加一个新的类,取名为helperclass。为即将开展的工作流程做好基础准备。如图所示:8、 编写代码,完善程序的功能。(1) 、heleperclass程序代码段

15、设计,主要函数部分如图所示:(2) helperclass代码段2,如图所示:(3) 对form1的代码进行编写,主要自定义了draw的画图函数和描点的函数,其代码段如图所示:(4) 对各个控件进行代码添加,实现控件的功能,在过程之中有用到异常处理try,catch语句,让程序不至于轻易崩溃,结果如图所示:(5) 实现关闭文件功能代码撰写,此过程中把pg重新实例化,代码段如图所示:(6) 定义一个颜色的静态变量,把它赋予初值为黑色,在程序运行的时候可以对图像的颜色进行修改,其代码段如图所示:(7) 修改线条宽度代码如图所示:六、 实验成果:1、 读取文件测试2、 查看文件属性测试:3、 绘制图

16、形测试:4、 修改线条颜色测试:5、 修改线条宽度测试:6、 清空图形测试:七、 实验总结本次实验花费的时间挺多的,因为一开始根本就看不懂实验要处理的对象文件的属性还有格式说明。花了两天的时间,把那一份白皮书的简略版看了,也弄懂了里面说的一些格式结构的东西。接下来就是要开始编写程序。虽然说我们的目标是很清晰的,就是要实现最最基本的三个功能,但是对于文件操作又不够熟悉,再加上对于.net类库接触的不够深入,很多时候要实现的方法上就很难前进。就好像如何关闭文件,如何打开文件那一块,琢磨了好久,最后通过自己查阅资料,终于找到了方法,应该说是明白了filestream这个类的一些基本的使用方法。对于控

17、件的操作,本人的风格和实验三实验实现的风格比较相像。在代码段上面采取了比较严谨的撰写,让程序运行的每一个步骤都合乎逻辑。就好比说就算让一个什么也不懂的人去操作你的软件,你的软件也能够有足够的容纳性,不至于轻易地崩溃掉。这也是一个软件最最基本的要求。在这次实验中,收获最大的,就是和同学团队合作一起讨论代码,一起讨论如何构建模块,一起讨论如何解决语法和逻辑错误。在以后的道路上,仅仅凭着一个人的力量,是很难把事情做好的,只有有一股团队合作的精神,才能够把事情做好。在实验中,我也发现了自己存在很多不足,首先自己对于C#语言的了解太少太少,对于很多概念和知识至今都没有很清晰的认识。对于.net里面丰富的

18、类库,自己了解的仅仅是九牛一毛,这让自己在处理问题的时候经常都是不知如何下手。这导致自己的效率并不算高。但是无论怎么说,遇到困难就应该想办法解决,可以自己去找资料,可以询问老师同学,通过此次实验,自己对于c#这门语言有了更进一步的了解,在以后的学习过程中,需要更加努力,才能有所收获。八、附录:源程序代码:1.form1代码:using System;using System.Collections.Generic;using System.Collections;using System.ComponentModel;using System.Data;using System.Diagnos

19、tics;using System.Drawing;using System.Drawing.Imaging;using System.Linq;using System.Text;using System.Windows.Forms;using System.Drawing.Drawing2D;using Microsoft.VisualBasic;namespace 对?shapefile文?件t读写绘?制? public partial class Form1 : Form public Form1() InitializeComponent(); button1.Enabled = f

20、alse;/首骸?先将?按恪?钮¥设?置?为a不?可用? button2.Enabled = false; button3.Enabled = false; textBox1.Enabled = false; public static Color gColor=Color.Black; /静2态?颜?色?变?量?,默?认?为a黑色? public static int gLineWidth;/静2态?线?宽变?量? string path; /用?于?传?递蘗路径?名?的?字?符?串?变?量? static Bitmap s = new Bitmap(100, 100); Graphics

21、tu = Graphics.FromImage(s); /定义?graphics类?的?对?象tu helperclass pg = new helperclass(); /类?对?象实害?例化 private void Form1_Load(object sender, EventArgs e) tu = this.panel1.CreateGraphics(); label6.Text = ; timer1.Enabled = true; timer1.Interval = 1000; /设?置?计?时骸?器的?时骸?间?间?隔? public void draw() /画-图?函数簓 P

22、en pen1 = new Pen(gColor,gLineWidth); /通?过ypen1实害?现?修T改?颜?色?功|能 for (int i = 0; i pg.PolygonNumber; i+) /循-环实害?现?对?每?一?个?多边?形?进?行D绘?制? PointF ps = pg.mpysi.polygon.ToArray(); /定义?平?面?上?面?的?坐?标括?有瓺序对? tuxiang(ps); /调獭?用?tuxiang函数簓的?功|能 tu.DrawPolygon(pen1, ps); public void tuxiang(params PointF pt) f

23、or (int i = 0; i pt.Length; i+) pti.X = (float)(pti.X - pg.HBoundingBox0) / (pg.HBoundingBox2 - pg.HBoundingBox0) * this.panel1.Width);/获?取?点?的?横坐?标括? pti.Y = (float)(pg.HBoundingBox3 - pti.Y) / (pg.HBoundingBox3 - pg.HBoundingBox1) * this.panel1.Height);/获?取?点?的?纵罽坐?标括? public void 读入?文?件tToolStrip

24、MenuItem_Click(object sender, EventArgs e) OpenFileDialog openflg = new OpenFileDialog(); openflg.Filter = *.shp|*.SHP; /寻找合?适酣?的?.shp文?件t openflg.Multiselect = false; /把?选?择?文?件t类?型的?功|能改?成否? if (openflg.ShowDialog() = DialogResult.OK) path = openflg.FileName; /把?文?件t路径?用?path保馈?存? button2.Enabled

25、= true; MessageBox.Show(文?件t读取?成功|!?, 提?示?); 选?项?ToolStripMenuItem.Enabled = true; 关?闭?文?件tToolStripMenuItem.Enabled = true; 保馈?存?图?片?ToolStripMenuItem.Enabled = true; 读入?文?件tToolStripMenuItem.Enabled = false; private void button1_Click(object sender, EventArgs e) /绘?图? tu.Clear(this.BackColor); /绘?

26、图?前把?当獭?前的?图?片?区?的?内容清?空? draw(); button3.Enabled = true; 选?项?ToolStripMenuItem.Enabled = true; private void button2_Click(object sender, EventArgs e) /显?示?文?件t属?性?信?息 try /进?行D异皑?常捕?捉? string s = pg.readfile(path); textBox1.Text = 这a个?文?件t共2有瓺个? + pg.PolygonNumber + 多边?形? + nt + s; button1.Enabled

27、= true; button3.Enabled = true; catch /异皑?常处鋦理? MessageBox.Show(本?软?件t不?支持?点?类?型文?件t,?请?重?新?进?行D选?择?!?, 提?示?, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); private void 关?闭?程序ToolStripMenuItem_Click(object sender, EventArgs e) /退?出?程序 DialogResult result = MessageBox.Show(确?定要癮退?出???, 提?示?, Mes

28、sageBoxButtons.OKCancel); if (result = DialogResult.OK) Application.Exit(); private void 关?闭?文?件tToolStripMenuItem_Click(object sender, EventArgs e) /更新?数簓据Y DialogResult result = MessageBox.Show(确?定要癮关?闭?当獭?前文?件t??, 提?示?, MessageBoxButtons.OKCancel);/实害?现?选?择?功|能,?选?择?确?定就退?出?,?否?就保馈?留?在原-来?的?界?面?

29、if (result = DialogResult.OK) tu.Clear(this.BackColor); /清?空?当獭?前图?片?区?的?内容 textBox1.Text = ; /清?空?当獭?前的?文?档苔?区?的?内容 pg = new helperclass(); /类?对?象重?新?实害?例化 button1.Enabled = false; button2.Enabled = false; 选?项?ToolStripMenuItem.Enabled = false; 读入?文?件tToolStripMenuItem.Enabled = true; 关?闭?文?件tToolS

30、tripMenuItem.Enabled = false; 保馈?存?图?片?ToolStripMenuItem.Enabled = false; button3.Enabled = false; MessageBox.Show(请?打洙?开a文?件t或者?退?出?程序!?, 提?示?); private void 修T改?颜?色?ToolStripMenuItem_Click(object sender, EventArgs e) /修T改?颜?色? ColorDialog cdlg = new ColorDialog(); cdlg.Color = gColor; if (cdlg.Sho

31、wDialog() = DialogResult.OK) gColor = cdlg.Color; draw(); MessageBox.Show(修T改?颜?色?成功|!?, 提?示?); private void 线?条?宽度ToolStripMenuItem_Click(object sender, EventArgs e) 修T改?线?条?宽度 lf = new 修T改?线?条?宽度(); lf.ShowDialog(); tu.Clear(this.BackColor); draw(); MessageBox.Show(修T改?线?宽成功|!?, 提?示?); private voi

32、d 保馈?存?图?片?ToolStripMenuItem_Click(object sender, EventArgs e) /保馈?存?图?片? s.Save(c:baocunde.jpeg, ImageFormat.Jpeg); MessageBox.Show(图?片?已?保馈?存?!?); private void button3_Click(object sender, EventArgs e) /清?空?当獭?前图?片?区?域? tu.Clear(this.BackColor); button3.Enabled = false; 选?项?ToolStripMenuItem.Enabl

33、ed = false; MessageBox.Show(图?形?区?域?已?经-被?清?空?!?, 提?示?); private void timer1_Tick(object sender, EventArgs e) label6.Text = DateTime.Now.ToLongTimeString(); /在labell中D显?示?时骸?间? 2、 helperclass类代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using S

34、ystem.Drawing;using System.Collections;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Drawing.Imaging;using System.Windows.Forms;using System.Drawing.Drawing2D;using Microsoft.VisualBasic;namespace 对?shapefile文?件t读写绘?制? class helperclass string shpetype = ; /用?来?

35、记?录?图?形?类?型的?字?符?串?变?量? int filelength; / 文?件t长度 public int FileLength /定义?方?法?实害?现?获?取?文?件t长度(都?是?实害?现?接口的?方?法?,?以?此?来?获?取?文?件t的?属?性?) get return filelength; set filelength = value; int version; /定义?版?本? public int Version /定义?获?取?版?本?的?方?法? get return version; set version = value; int hshapetype;

36、/ 头?文?件t中D的?shape类?型 public int HShapeType get return hshapetype; set hshapetype = value; public double HBoundingBox = new double8; / 头?文?件t中D的?边?界?盒D 边?界?盒D的?定义?参?考?.shp文?件t的?白恪?皮书酣? int recordnumber; /记?录?头? public int RecordNumber / 记?录?数簓目? get return recordnumber; set recordnumber = value; int

37、contentlength; / 内容长度 public int ContentLength get return contentlength; set contentlength = value; int pshapetype; /记?录?内容 public int PShapeType / 记?录?内容中D的?shape类?型 get return pshapetype; set pshapetype = value; public double PBoundingBox = new double4; / 记?录?内容中D的?边?界?盒D int numparts; /部?分?的?数簓目?

38、 public int NumParts get return numparts; set numparts = value; int numpoints = 0; / 点?的?总哩?数簓目? public int NumPoints get return numpoints; set numpoints = value; public int Parts; / 在部?分?中D第台?一?个?点?的?索引皔 public PointF points; /定义?浮?点?有瓺序对? /所有瓺部?分?的?点? int polygonnumber = 0; / 多边?形?个?数簓 public int

39、PolygonNumber get return polygonnumber; set polygonnumber = value; public IList mpys = new List(); public string readfile(string path) StringBuilder str = new StringBuilder(); /为a此?类?创洹?建对?象,?实害?际可以?考?虑?为astring类?型的?变?量? FileStream file = new FileStream(path, FileMode.Open); /为afilestream类?创洹?建file对

40、?象,?并打洙?开a文?件t BinaryReader bw = new BinaryReader(file); /为a此?类?创洹?建对?象,?实害?现?读取?数簓据Y做?二t进?制?值 #region 读取?头?文?件t /开a始?读文?件t bw.ReadBytes(24); /从洙?当獭?前流?中D读取?下?24个?字?节,?并使?当獭?前位?置?提?升24个?字?节(辍?以?下?的?定义?需要癮参?考?.shp文?件t的?格?式?说明)? FileLength = readbigint(bw.ReadInt32(); /获?取?文?件t长度,?在.shp文?件t中Dfile leng

41、th 的?位?置?在 byte 2427 即一?个?int 类?型数簓据Y Version = bw.ReadInt32(); /获?取?文?件t的?版?本? 文?件t位?置?同?上? HShapeType = bw.ReadInt32(); /获?取?文?件t图?形?的?形?状痢? 其?位?置?如?上? HBoundingBox0 = bw.ReadDouble();/Xmin /获?取?边?界?盒D HBoundingBox1 = bw.ReadDouble();/Ymin HBoundingBox2 = bw.ReadDouble();/Xmax HBoundingBox3 = bw.ReadDouble();/Ymax HBoundingBox4 = bw.ReadDouble();/Zmin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论