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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

GIS暑期实习报告.docx

1、GIS暑期实习报告GIS暑期实习报告 班 号: 06408128 姓 名: 任 远 完成日期: 2011-07-14 提交日期: 2011-07-14 目录第一部分 1程序设计思路: 1程序实现过程: 11.定义图形类: 12.读取Shape文件并存储在图形类中 23.文件的显示 44.图形的放大、缩小和漫游 65.缓冲区的创建 76.视图的重绘 11程序运行结果: 111.图形的显示: 122.缓冲区分析: 12第二部分 12程序实现过程: 121.建立VB工程 122.通过代码加载数据 133.图层操作 134.显示图层要素类型 145.地图属性的查询 156.地图信息可视化 16程序运行

2、结果: 171.加载图层 172.图形的放大、缩小、漫游 173.显示图层要素信息 184.地图属性的查询 185.地图信息可视化 18第一部分程序设计思路:首先定义图形类,在图形类的定义中编写图形绘制方法和缓冲区创建方法,将缩放倍数与平移坐标作为这些方法的传入参数以适应后面所要实现的种各功能。然后编写函数将shape文件中的数据读入图形类中,采用图形类基类的指针的结点以链表方式存储。接下来在视图类中通过调用图形绘制方法来显示图形,改变缩放倍数与平移坐标等传入参数可以实现图形的放大缩小与漫游。当需要进行缓冲区分析时,则在视图类中调用缓冲区创建方法进行缓冲区的创建。程序实现过程:1.定义图形类:

3、 首先定义图形类基类CShape,然后定义派生图形类CSPoint(点类)、CPolyLine(线类)、CPolygon(多边形类):1)定义图形类基类CShapeclass CShape: public CObjectpublic: CShape(); /构造函数 int ShapeType; /图形几何类型virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n); /图形绘制方法virtual void CreateBuffer(CDC* pDC,dou

4、ble Xmin, double Ymin, double Ymax, double mX, double mY, double n,double BufferRadius, COLORREF Color); /创建缓冲区方法 CShape(); /析构函数;2)定义派生图形类CSPointclass CSPoint:virtual public CShapepublic: CSPoint();public: double x; /点坐标 double y; virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, do

5、uble mX, double mY, double n); /点绘制方法 virtual void CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n,double BufferRadius, COLORREF Color); /点缓冲区创建方法 CSPoint();3)定义派生图形类CPolyLineclass CPolyLine:virtual public CShapepublic: CPolyLine();public: double Box4; /坐标

6、范围 int NumParts; /子线段个数 int NumPoints; /坐标点数 int* Parts; /子线段起始位置数组 double* PointsX; /线上各点X坐标数组 double* PointsY; /线上各点Y坐标数组 virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n); /线绘制方法 virtual void CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ym

7、ax, double mX, double mY, double n,double BufferRadius, COLORREF Color); /线缓冲区创建方法 CPolyLine();4)定义派生图形类CPolygonclass CPolygon:virtual public CPolyLinepublic: CPolygon(); virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n); /多边形绘制方法 virtual void CreateBu

8、ffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n,double BufferRadius, COLORREF Color); /多边形缓冲区创建方法 CPolygon();2.读取Shape文件并存储在图形类中 在CGISDoc中声明并定义链表和文件读取函数,用来将Shape文件读入图形类并存储在链表中。这里在链表中保存图形类基类的指针,用图形类基类的指针来指向派生图形类的对象。 在CGISView中响应菜单项【打开】,在消息响应函数中首先调用文件读取函数将shape文件中的数

9、据读入图形类并存储在链表中,然后遍历链表调用图形绘制方法显示图形。1)菜单项【打开】的消息响应函数 void CGISView:OnFileOpen() / TODO: Add your command handler code here CGISDoc* pDoc = GetDocument(); /获取文档类指针 CFileDialog dlg(TRUE,NULL,NULL,0,(*.shp)|*.shp); /创建文件打开对话框 dlg.m_ofn.lpstrTitle = 打开文件 ; CString path; if( dlg.DoModal() != IDOK ) return;

10、path = dlg.GetPathName(); /获得打开文件路径 FILE* fp=fopen(path,rb); /打开文件if(!fp) return; pDoc-ReadShp(fp); /调用文档类中的文件读取函数 /从文档类中获得图幅范围 double Xmax=pDoc-Xmax; double Xmin=pDoc-Xmin; double Ymax=pDoc-Ymax;double Ymin=pDoc-Ymin; CClientDC dc(this); /获得客户区 CRect rectClient;GetClientRect(rectClient); CSize size

11、Client=rectClient.Size(); /获得客户区大小 double nx=(Xmax-Xmin)/(double(sizeClient.cx)-100);double ny=(Ymax-Ymin)/(double(sizeClient.cy)-100); n=(nxny)?nx:ny; /计算图幅缩放比例 mX=(Xmax-Xmin)/n-sizeClient.cx)/2; mY=(Ymax-Ymin)/n-sizeClient.cy)/2; /计算图形平移距离CTypedPtrList& shapeList = pDoc-m_shapeList; /图形类链表 POSITIO

12、N pos = shapeList.GetHeadPosition();while (pos != NULL) CShape* m_shape = shapeList.GetNext(pos); m_shape-Draw(&dc,Xmin,Ymin,Ymax,mX,mY,n); /调用图形绘制方法 2)Shape文件读取函数(1)读取完整文件: 完整文件的读取包括头文件的读取与分类型的实体信息读取:void CGISDoc:ReadShp(FILE* m_ShpFile_fp) int type=OnReadShphead(m_ShpFile_fp); /读取头文件并返回图形类型值 switc

13、h(type) /根据图形类型值确定实体信息读取方法 case 1: OnReadPointShp(m_ShpFile_fp); /读取点实体信息 break; case 3: OnReadLineShp(m_ShpFile_fp); /读取线实体信息 break; case 5: OnReadAreaShp(m_ShpFile_fp); /读取多边形实体信息 break; default: return; (2)头文件的读取(3)分类型的实体信息读取 由于这里是使用示例代码读取文件,因此对于(2)、(3)部分的代码这里不再列出。3.文件的显示 文件的显示是通过在视图类的消息响应函数以及重绘函

14、数中调用图形类中的图形绘制方法来实现的,而图形绘制方法则封装在各图形类中。 在图形绘制中,首先根据客户区的大小进行图形的缩放与平移,然后进行图形的绘制。 在图形绘制方法中,Xmin、Ymin、Xmax、Ymax为图幅坐标范围,mX、mY为平移坐标大小,n为缩放比例。1)点类的图形绘制方法void CSPoint:Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n) double X, Y; /进行坐标转换 X=(x-Xmin)/n-mX; Y=(Ymax+Ymin)-y-Ymin

15、)/n-mY; pDC-Ellipse(int(X)-3, int(Y)-3, int(X)+3, int(Y)+3);2)线类的图形绘制方法void CPolyLine:Draw(CDC* pDC, double Xmin, double Ymin, double Ymax, double mX, double mY, double n) int i, j; int pointNum; for(i=0;iNumParts;i+) /绘制子线段 if(i!=NumParts-1) pointNum=Partsi+1-Partsi; else pointNum=NumPoints-Partsi;

16、/将线上原始点的坐标进行转换后存入CPoint数组中 CPoint* point=new CPointpointNum; for(j=Partsi;jPolyline(point,PartPoints); delete point; 3)多边形类的图形绘制方法void CPolygon:Draw(CDC* pDC, double Xmin, double Ymin, double Ymax, double mX, double mY, double n) int i, j; double Ymid=(Ymin+Ymax)/2; int pointNum; for(i=0;iNumParts;i

17、+) /绘制子线段 if(i!=NumParts-1) pointNum=Partsi+1-Partsi; else pointNum=NumPoints-Partsi; /将多边形边界上原始点的坐标进行转换后存入CPoint数组中 CPoint* point=new CPointpointNum; for(j=Partsi;jPolygon(point,PartPoints); delete point; 4)显示窗口大小的调整 为了更好的显示图形,这里在创建窗口前对窗口的大小进行设定,在创建窗口时设置窗口大小为800*800。 具体的做法为在CMainFrame.cpp文件中的CMainF

18、rame : PreCreateWindow (CREATESTRUCT & cs)函数加入如下代码: cs.style&=WS_EX_CLIENTEDGE; CRect rect(0, 0, 800, 800); AdjustWindowRectEx(&rect, cs.style, TRUE,cs.dwExStyle); cs.cx = rect.right - rect.left; cs.cy = rect.bottom - rect.top;4.图形的放大、缩小和漫游 在菜单中添加菜单项【视图】并为其添加子菜单项【放大】、【缩小】、【漫游】,并分别为其添加消息响应函数。 在视图类中添加

19、变量m_zoom和m_wander作为指标值本别指示当前状态是否为放大、缩小和漫游。 在消息响应函数中只改变当前状态指标值,真正的功能实现放在对鼠标事件的响应中。主要的相应步骤为首先判断当前状态,然后根据当前状态调整缩放比例与平移坐标,最后强制视图重绘。1)鼠标左键按下void CGISView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default start=point; if(m_zoom=1) /放大 n*=0.5; /调整缩放比例 n

20、out+; /计算平移坐标 mX+=(pow(2,nout)-pow(2,nout-1)*(start.x+mX)/pow(2,nout-1); mY+=(pow(2,nout)-pow(2,nout-1)*(start.y+mY)/pow(2,nout-1); Invalidate(); /强制视图重绘 if(m_zoom=2) /缩小 n*=2; /调整缩放比例 nin+; / 计算平移坐标 mX+=(pow(0.5,nin)-pow(0.5,nin-1)*(start.x+mX)/pow(0.5,nin-1); mY+=(pow(0.5,nin)-pow(0.5,nin-1)*(star

21、t.x+mX)/pow(0.5,nin-1); Invalidate(); /强制视图重绘 if(m_wander=1) /漫游 prepoint= point; nextpoint=point; CView:OnLButtonDown(nFlags, point);2)鼠标移动 void CGISView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(m_wander=1) /漫游 nextpoint=point; mX+=pre

22、point.x-nextpoint.x; mY+=prepoint.y-nextpoint.y; /计算平移坐标 Invalidate(); /强制视图重绘 prepoint=point; CView:OnMouseMove(nFlags, point);5.缓冲区的创建 在菜单中添加菜单项【分析】并为其添加子菜单项【缓冲区分析】,在消息响应函数中首先唤起缓冲区分析对话框由用户输入缓冲区半径,然后改变当前状态指标值,最后强制视图重绘,此时在重绘函数中调用各图形类的缓冲区创建方法。 在各图形类的缓冲区创建方法方法的各传入参数中,Xmin、Ymin、Xmax、Ymax为图幅坐标范围,mX、mY为平

23、移坐标大小,n为缩放比例,BufferRadius为缓冲区半径,Color为缓冲区颜色。 各图形类的缓冲区创建方法如下:1)点类的缓冲区创建方法 点的缓冲区创建比较简单,直接以各点为圆心、以输入缓冲区半径为半径画圆即可。 void CSPoint:CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n, double BufferRadius, COLORREF Color) /创建点类缓冲区 double X, Y; X=(x-Xmin)/n-mX; Y=(Ymax

24、+Ymin)-y-Ymin)/n-mY; double m_nBuffer=BufferRadius/n; /创建新画刷 CBrush *newBrush = new CBrush(Color); CBrush *oldBrush; oldBrush = pDC-SelectObject(newBrush); pDC-Ellipse(int(X-m_nBuffer),int(Y-m_nBuffer),int(X+m_nBuffer),int(Y+m_nBuffer); newBrush = pDC-SelectObject(oldBrush); delete newBrush;2)线类的缓冲区

25、创建方法 由于每一个线类的对象都是由多条子线段组成的,在创建线类缓冲区时对其进行分段处理,即为每个子线段创建缓冲区,具体过程为在子线段中间部分创建多边形区域,其中多边形区域的顶点需要根据线上的下一个子线段端点来计算,在子线段边缘创建圆形区域,然后将其合并。void CPolyLine:CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double mY, double n, double BufferRadius, COLORREF Color) int i; CPoint* point=new CP

26、ointNumPoints; double Ymid=(Ymin+Ymax)/2; for(i=0;iNumPoints;i+) double X,Y; X=PointsXi-Xmin; Y=(Ymax+Ymin)-PointsYi-Ymin; pointi.x=int(X/n-mX); pointi.y=int(Y/n-mY); double m_nBuffer=BufferRadius/n; double arctangent; /记录角度和点位坐标 CPoint pointBuffer4; CRgn pNewRgn,pRgn; pRgn.CreateEllipticRgn(point0.

27、x-m_nBuffer, point0.y-m_nBuffer, point0.x+m_nBuffer, point0.y+m_nBuffer); for(i = 0;iNumPoints-1;i+) /计算角度 arctangent = atan2(-(pointi.x-pointi+1.x),(pointi.y-pointi+1.y); /计算坐标 pointBuffer0.x = long(pointi.x + m_nBuffer*cos(arctangent); pointBuffer0.y = long(pointi.y + m_nBuffer*sin(arctangent); po

28、intBuffer1.x = long(pointi.x - m_nBuffer*cos(arctangent); pointBuffer1.y = long(pointi.y - m_nBuffer*sin(arctangent); pointBuffer2.x = long(pointi+1.x - m_nBuffer*cos(arctangent); pointBuffer2.y = long(pointi+1.y - m_nBuffer*sin(arctangent); pointBuffer3.x = long(pointi+1.x + m_nBuffer*cos(arctangent); pointBuffer3.y = long(pointi+1.y + m_nBuffer*sin(arctangent); /创建多边形区域 pNewRgn.CreatePolygonRgn(pointBuffer,4,WINDING); pRgn.CombineRgn(&pRgn,&pNewRgn,RGN_OR); /合并区域 pNewRgn.DeleteObject(); /

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

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