ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:2.12MB ,
资源ID:3735074      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3735074.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(对shapefile文件进行读写绘制实验报告概述.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

对shapefile文件进行读写绘制实验报告概述.docx

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

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

3、nteger BigByte 4 Unused 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 Type Integer LittleByte 36 Bounding Box Xmin Doub

4、le LittleByte 44 Bounding 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 Box Mmax Double Little* Unused, with

5、 value 0.0, if not Measured or Z type 注意其中的字节顺序,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,

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

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

8、g记录头包含8个字节,0-3表示记录的顺序号,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文件中的

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

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

11、信息时使用,这里用0来填写。32X(n*32)个字节记录项信息描述数组。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文件中的数据类型注意:记录项的数目在文件头中没有明确

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

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程序代码段设计,主要函数部分如图所示:(2)hel

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

16、空图形测试:七、 实验总结本次实验花费的时间挺多的,因为一开始根本就看不懂实验要处理的对象文件的属性还有格式说明。花了两天的时间,把那一份白皮书的简略版看了,也弄懂了里面说的一些格式结构的东西。接下来就是要开始编写程序。虽然说我们的目标是很清晰的,就是要实现最最基本的三个功能,但是对于文件操作又不够熟悉,再加上对于.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.Diagnostics;using System.Drawing;using

19、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 = false;/首骸?先将?按恪?钮¥设?置?为a不?可用? but

20、ton2.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 tu = Graphics.FromImage(s); /定义

21、?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() /画-图?函数簓 Pen pen1 = new Pen(gColor,gLine

22、Width); /通 ?过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) for (int i = 0; i pt.Length; i

23、+) 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 读入?文?件tToolStripMenuItem_Click(object sender,

24、 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 = true; MessageBox.Show(文?件t读

25、取?成功|!?, 提 ?示?); 选?项?ToolStripMenuItem.Enabled = true; 关?闭?文?件tToolStripMenuItem.Enabled = true; 保馈?存?图?片?ToolStripMenuItem.Enabled = true; 读入?文?件tToolStripMenuItem.Enabled = false; private void button1_Click(object sender, EventArgs e) /绘?图? tu.Clear(this.BackColor); /绘?图?前把?当獭?前的?图?片?区?的?内容清?空? dr

26、aw(); 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 = true; button3.Enabled = tr

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

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

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1