欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    最新GIS暑期实习.docx

    • 资源ID:33807709       资源大小:5.45MB        全文页数:27页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    最新GIS暑期实习.docx

    精品资料GIS暑期实习.GIS暑期实习课程实习报告姓名:学号:专业:地球信息科学与技术教师: 2017年6月目录第一部分 GIS开发基础1.1 实习概要(1)按照 Shape 白皮书对于 shape 格式的介绍,从 shape 文件中读取空间数据。并按照空间数据的特点,自己规定一种二进制格式存储所读取的 shape 文件。 (2)按照 SFF 模型对于空间对象的定义,用面向对象的编程语言,实现 GIS 空间数据结构,并将(1)中从 shape 文件中读取的空间数据存储到空间数据结构中。(3)以 VC 为 IDE,调用 VC 的绘图函数及其他函数,将实习 2 中的空间数据结构可视化。并实现 GIS 常用的放大、缩小、漫游等功能。(4)在实习(3)的基础之上,实现空间点、线、面等空间对象的缓冲区分析,并将缓冲区分析的结果高亮显示。1.2 思路及结果1.2.1点、线、面的读取Shapefile中的点状目标由一对X、Y坐标构成,坐标值为双精度型(double)。Shapefile中的线状目标是由一系列点坐标串构成,一个线目标可能包括多个子线段,子线段之间可以是相离的,同时子线段之间也可以相交。NumParts记录了当前线目标所包含的子线段的个数;NumPoints记录了当前线目标的坐标点总数;Parts记录了每个子线段的第一个坐标点在坐标数组points中的位置,以便读取数据;Points是用于存放当前线目标的X、Y坐标的数组;Box 记录了当前线状目标的坐标范围(同样适用于面状目标)。Shapefile中的面状目标是由多个子环构成,每个子环是由至少四个顶点构成的封闭的、无自相交现象的环。对于含有岛的多边形,构成它的环有内外环之分,每个环的顶点的排列顺序或者方向说明了这个环到底是内环还是外环。一个内环的顶点是按照逆时针顺序排列的;而对于外环,它的顶点排列顺序是顺时针方向。如果一个多边形只由一个环构成,那么它的顶点排列顺序肯定是顺时针方向。1.2.2点、线、面的显示成功读取点,线,面后,即可显示。由于shapefile覆盖的地理范围千差万别,为了方便显示,需要把坐标改到适应当前窗口大小,这里四个显示的边界(left, right, top, bottom)均保留20px的空白,在余下的空间里显示该shapefile,原坐标(x,y)转换到新的坐标(x,y)d 公式如下,图1为显示的过程的示意图。图1 坐标变换示意图(x,y)为shp上一点原始的坐标,(x,y)为显示的坐标黑色边框为shp的范围或者为应用显示界面的范围(此时橙色为实际显示范围,两者之间相差20px)x'=left+20+right-left-40 x-box0box1-box0 y'=top+20+bottom-top-40 y-box3box2-box3 其中(x,y)为shp上一点原始的坐标,(x,y)为显示的坐标。1.2.3主要功能放大、缩小、漫游等操作在MFC以及点的缓冲区十分简单,所以这里仅介绍线和面的缓冲区。缓冲区程序将遍历输入要素的每个折点并创建缓冲区偏移。通过这些偏移创建输出缓冲区要素。许多软件(例如ArcGis Desktop和ArcGis Pro)生成缓冲区的原理如图2所示。(a)(b)(c)图2 创建缓冲区(a) 输入线要素 (b) 在输入线要素周围创建的偏移 (c) 通过偏移获得的缓冲区图片来源但是每条线段的首尾的半圆形缓冲区建立上比较困难,所以在这里进行了简化处理,及将原来的半圆改为线段连接,原理如图3所示。但当缓冲区半径相对较大时,容易出现一些问题。(a)(b)(c)图3 创建缓冲区(本文)(a) 输入线要素(不同的颜色为) (b) 对每一个线段的按照缓冲区半径生成周围的四个点(对应点的颜色与线段一致) (c)按一定顺序(注意转折点处)连接这些点面和线的缓冲区创建方式类似,仅需画出多边形外侧的缓冲区。1.2.4 结果下图分别为点线面的缓冲区。点的缓冲区半径为100,显示时已经缩小一次;(玉树断层)线的缓冲区半径为0.02;(大连市)面的缓冲区半径为0.02。图4. (a)点缓冲区 (b)线缓冲区 (c)面缓冲区第二部分 Mo二次开发2.1 实习概要(1) 学习MO的安装,以及MO工程的建立。(2) 了解基于组件GIS的图层和数据操作, 重点掌握通过编写代码的方式加载数据的方法; 查询并显示某一图层的相关属性; 编写代码实现调整地图图层顺序的功能.(3) 掌握MO中GIS查询功能的实现方法。(4) 掌握MO中图例控件的使用。2.2概述与结果按照指导文件实现了:添加图层、重置、下移图层、上移图层、自动调整、删除图层、清空图层、唯一值渲染、点密度渲染、放大、缩小、全屏显示、查询、漫游的基本功能,这些功能添加起来十分简单。此外,利用WindowsMediaplayer控件配合CommandButton实现了音乐的播放和停止播放的功能;利用WebBrowser控件实现gif图(该软件的背景)的动态显示。结果如下:图5. (a)添加图层并放大 (b)重置 (c)下移图层 (d)上移图层 (e)自动调整 (f)删除图层 (g)清空图层 (h)唯一值渲染 (i)点密度渲染 (j)放大 (k)缩小 (l)全屏显示 (m)查询 (n)漫游第三部分 GIS系统的设计与实现基于MO的公交换乘系统摘要: 随着经济的发展和人们价值观的改变,绿色出行理念越来越深入人心。乘坐公交车是绿色出行的主要方式,优秀的公交查询系统可以为市民带来很多便利,而且对于缓解城市的交通压力和降低城市的环境污染都有很大意义。在北京市迷你交通地图的基础上,研究基于组件式 GIS 的公交查询系统的设计,探讨了课提供换乘方案的公交查询系统的实现方案,以 MO2.4 +VB 6.0作为系统开发平台, 以 Microsoft Access 2016为后台数据库实现公交换乘方案和地名查询、路线查询等空间查询功能。3.1 引言公共交通是各大城市市民出行的首选交通工具, 面对错综复杂的交通网络, 手动查找乘车线路是另广大市民为难的事情,因此, 开发公交查询系统或者推行基于网络电子地图的公交查询服务显得越来越重要。公交换乘查询就是要快速、准确地搜索网络上两点之间的路径。现有的很多公交换乘算法都是将公交站点、公交线路的地理位置作为属性字段存储到关系数据库或文件中, 然后采用最短路径算法、矩阵运算或者链表查询等方式求解换乘路径, 如廖楚江等1使用“图论”和空间网络数据库相结合的方法实现了一种基于最少换乘次数的算法;翁敏等2使用关联矩阵实现最优换乘路径求解;杨新苗等3设计了一种基于链表的公交乘客出行路径选择模型。这些算法有些计算复杂, 效率低下;有些没有考虑步行换乘、上下行线路、环形线路、最优换乘点选择等实际问题。公交出行与很多因素相关, 大量调查研究表明, 换乘次数、出行距离、出行时间和出行费用是当今乘客选择公交出行的主要影响因素4 。结合公交乘客出行心理的考虑, 一般都是以换乘次数为优先考虑目标3 ,其次是出行费用、耗时和距离长短。乘客往往选择直观、易量算的出行距离作为第二考虑目标5 。对公交换乘的问题进行研究,首先就是要解决公共交通网络模型如何合理地表述。组件式 GIS作为现今 GIS应用发展最流行的一种开发方式, 给整个 GIS技术体系和应用模式带来巨大影响。 将组件 GIS技术应用于建立城市公交信息查询系统, 在地图上直观显示出目标的地理位置和周边环境, 并查询到目标周边的公交站点及公交乘车路线和换乘方案, 可以为人们的出行提供极大的方便6 。 同时能满足不同部门和用户对空间信息的需求, 并借助其空间分析能力和可视化表达,用于各种辅助决策 7。本文为实现公交系统的查询功能,在北京市迷你交通地图的基础上,研究基于组件式 GIS 的公交查询系统的设计,探讨了课提供换乘方案的公交查询系统的实现方案,以 MO2.4 +VB 6.0作为系统开发平台, 以 Microsoft Access 2016为后台数据库实现公交换乘方案和地名查询、路线查询等空间查询功能。3.2 数据本文所用数据见表1.和图6.表1. 公交线路表ID线路12345671K29北站六公园胜利新村康乐新村庆丰村采荷新村25红菱施家桥中北桥体育场路采荷新村3101康乐新村八字桥武林门余杭塘上丰潭路口市府大楼西站459丰潭路口景芳二区古荡新村天苑花园5709八字桥闸弄口新村凤起路胜利剧院岳坟6K203康乐新村庆丰村余杭塘上丰潭路口景芳二区焦家村上宁桥图6. 公交线路图3.3 方法公交车查询系统主要包括4个模块:公交线路、站点的线路、始终点站查询、和查询线路。其中公交线路和查询线路两个模块功能相似,但表现上有所不同,其功能是根据选择选择的线路查询该线路下的站点;站点的路线与前者目的相反,是根据给定的站点查询线路一个站点可以被多个线路所经过;始终点站查询则是根据输入起始站点和终点站搜索有无包含两站的线路,若有则返回结果,若没有则在起始站的所在线路的换乘站继续搜索完全一次,若有则返回全部的结果,若没有则不在进行搜索,因为两次更换公交车会给用户带来极大的麻烦。3.4 结果软件的界面如图7.所示,可以进行公交线路查询、站点的线路查询、始终点站查询、和查询线路这些功能。图7. 公交查询系统(a)查询线路 (b)始终点站查询(无需换乘) (c) 始终点站查询(换乘一次)3.5 总结本系统十分简单,功能还不够健全,应考虑增加站点间最短线路、最佳线路、最优观光线路等功能模块。通过对软件功能和相关算法的进一步完善, 可以使其在物流运输、车辆调度、突发事件的应急处理等应用领域发挥重要的作用。3.6 参考文献1 付仲良, 张文元, 孟庆祥. 基于 GIS 的公交数据模型研究及换乘算法实现J. 测绘通报, 2010 (7): 15-18.2 翁敏, 毋河海, 杜清运,等. 基于公交网络模型的最优出行路径选择的研究J. 武汉大学学报(信息科学版), 2004, 29(6):500-503.3 杨新苗, 马文腾. 基于 GIS 的公交乘客出行路径选择模型J. 东南大学学报: 自然科学版, 2000, 30(6): 87-91.4 王庆平, 张兴芳, 宋颖, 等. 城市公交换乘的数学模型及其算法实现J. 计算机工程与应用, 2008, 44(7): 246-248.5 向万里, 刘洪升. 城市公交网络出行路径选择的计算机算法研究J. 兰州交通大学学报, 2006, 25(1):121-124.6 徐枫, 刘兆礼, 陈建军. 长春市近 50 年城市扩展的遥感监测及时空过程分析J. 干旱区资源与环境, 2005, 19(7): 80-84.7 牟风云, 张增祥, 迟耀斌, 等. 基于多源遥感数据的北京市 1973-2005 年间城市建成区的动态监测与驱动力分析J. 遥感学报, 2007, 11(2): 257-268.附录(精选代码)1.读取点状目标/*读取点状目标记录*/int CReadlayer:ReadPointlayer(FILE* shpehandle,FILE* shpewrite,CLayer *lyr)fprintf(shpewrite,"shapeType:%dn",1);/读取点状目标的实体信息int RecordNumber;int ContentLength;int num =0;while(fread(&RecordNumber, sizeof(int), 1,shpehandle)!=0)num+;fread(&ContentLength,sizeof(int), 1,shpehandle);RecordNumber = OnChangeByteOrder (RecordNumber);ContentLength = OnChangeByteOrder (ContentLength);fprintf(shpewrite,"RecordNumber:%dn",RecordNumber);fprintf(shpewrite,"ContentLength:%dn",ContentLength);int shapeType;double x;double y;fread(&shapeType, sizeof(int), 1, shpehandle);fread(&x, sizeof(double), 1, shpehandle);fread(&y, sizeof(double), 1,shpehandle);CPt pt;pt.x = x;pt.y = y;lyr->m_point.Add(pt);fprintf(shpewrite,"x: %f,y: %fnn",x,y);return TRUE;2.读取线状目标/*读取线状目标的记录*/int CReadlayer:ReadPolyLinelayer(FILE* shpehandle,FILE* shpewrite,CLayer *lyr) fprintf(shpewrite,"shapeType:%dn",3); /读取线状目标的实体信息 int RecordNumber; int ContentLength; int num =0; CPolyline line; while(fread(&RecordNumber, sizeof(int), 1,shpehandle)!=0) fread(&ContentLength,sizeof(int), 1,shpehandle); RecordNumber = OnChangeByteOrder (RecordNumber); ContentLength = OnChangeByteOrder (ContentLength); fprintf(shpewrite,"RecordNumber:%dn",RecordNumber); fprintf(shpewrite,"ContentLength:%dn",ContentLength); int shapeType; double Box4; int NumParts; int NumPoints; int *Parts; int i; fread(&shapeType, sizeof(int), 1,shpehandle); if(shapeType = 0) continue; fprintf(shpewrite,"border_x,border_y: "); /读Box for(i=0;i<4;i+) fread(Box+i, sizeof(double),1,shpehandle); fprintf(shpewrite,"%f ",Boxi); line.Boxi = Boxi; fprintf(shpewrite,"n"); /读NumParts和NumPoints fread(&NumParts, sizeof(int), 1,shpehandle); fprintf(shpewrite,"NumParts:%dn",NumParts); line.NumParts = NumParts; fread(&NumPoints, sizeof(int), 1,shpehandle); fprintf(shpewrite,"NumPoints:%dn",NumPoints); line.NumPoints = NumPoints; /读Parts和Points Parts =new intNumParts; for(i=0;i<NumParts;i+) fread(Parts+i, sizeof(int), 1,shpehandle); line.Parts = Parts; fprintf(shpewrite,"n"); int pointNum; pointNum = NumPoints; double *PointsX; double *PointsY; PointsX =new doublepointNum; PointsY =new doublepointNum; int j; line.points = new CPtpointNum; for(j=0;j<pointNum;j+) fread(PointsX+j, sizeof(double),1,shpehandle); fread(PointsY+j, sizeof(double),1,shpehandle);fprintf(shpewrite,"x: %f ,y: %fn",PointsXj,PointsYj);line.pointsj.x = PointsXj;line.pointsj.y = PointsYj; lyr->m_polyline.Add(line); fprintf(shpewrite,"n"); delete PointsX; delete PointsY; Parts = NULL; return 1;3. 读取面状目标/*读取面状目标的记录*/int CReadlayer:ReadPolygonlayer(FILE* shpehandle,FILE* shpewrite,CLayer *lyr) CPolygon polygon; fprintf(shpewrite,"shapeType:%dn",5); int RecordNumber; int ContentLength; while(fread(&RecordNumber, sizeof(int), 1,shpehandle)!=0) fread(&ContentLength,sizeof(int), 1,shpehandle); RecordNumber = OnChangeByteOrder (RecordNumber); ContentLength = OnChangeByteOrder (ContentLength); fprintf(shpewrite,"RecordNumber:%dn",RecordNumber); fprintf(shpewrite,"ContentLength:%dn",ContentLength); int shapeType; double Box4; int NumParts; int NumPoints; int *Parts; int i; fread(&shapeType, sizeof(int), 1,shpehandle); /读Box fprintf(shpewrite,"border_x,border_y: "); for(i=0;i<4;i+) fread(Box+i, sizeof(double),1,shpehandle); fprintf(shpewrite,"%f ",Boxi); polygon.Boxi = Boxi; fprintf(shpewrite,"n"); /读NumParts和NumPoints fread(&NumParts, sizeof(int), 1,shpehandle); polygon.NumParts = NumParts; fread(&NumPoints, sizeof(int), 1,shpehandle); polygon.NumPoints = NumPoints; fprintf(shpewrite,"NumParts:%dn",NumParts); fprintf(shpewrite,"NumPoints:%dn",NumPoints); /读Parts和Points Parts =new intNumParts; for(i=0;i<NumParts;i+) fread(Parts+i, sizeof(int), 1,shpehandle); polygon.Parts = Parts; int pointNum;pointNum = NumPoints; double *PointsX; double *PointsY; PointsX =new doublepointNum; PointsY =new doublepointNum; int j; polygon.points = new CPtpointNum; for(j=0;j<pointNum;j+) fread(PointsX+j, sizeof(double),1,shpehandle); fread(PointsY+j, sizeof(double),1,shpehandle);fprintf(shpewrite,"x: %f ,y: %fn",PointsXj,PointsYj);polygon.pointsj.x = PointsXj;polygon.pointsj.y = PointsYj; lyr->m_polygon.Add(polygon); fprintf(shpewrite,"n",PointsXj,PointsYj); delete PointsX; delete PointsY; Parts = NULL; return TRUE;4.显示点、线、面/*绘制点方法*/void CGIS_Shapefile_SiyuanView:DrawPoint(CLayer *layer, double ratio,CPoint mpt)CClientDC dc(this);OnPrepareDC(&dc);CRect rc;GetClientRect(rc);CBrush brush(RGB(255,120,150);CBrush *oldbrush = dc.SelectObject(&brush);/dc.SetPolyFillMode(WINDING);rc.bottom -=20;rc.right -=20;rc.top +=20;rc.left +=20;int center_x;int center_y;center_x = (rc.left + rc.right)/2;center_y = (rc.bottom + rc.top)/2;CLayer *currentlayer;currentlayer = layer;int num = currentlayer->m_point.GetSize();int i;double x,y;for(i = 0;i<num;i+)x = currentlayer->m_point.GetAt(i).x;y = currentlayer->m_point.GetAt(i).y;x = (rc.right - rc.left)*(x - m_headlayer->box0)/(m_headlayer->box2 - m_headlayer->box0) + rc.left;y = rc.bottom + 20 -(rc.bottom - rc.top)*(y - m_headlayer->box1)/(m_headlayer->box3 - m_headlayer->box1) + rc.top);x = (ratio * (x - center_x) + center_x + mpt.x);y = (ratio * (y - center_y) + center_y + mpt.y);dc.Ellipse(CRect(int)x-3,(int)y-3,(int)x+3,(int)y+3);dc.SelectObject(oldbrush);/*绘制线方法*/void CGIS_Shapefile_SiyuanView:DrawPolyLine(CLayer *layer, double ratio,CPoint mpt)CClientDC dc(this);OnPrepareDC(&dc);CRect rc;GetClientRect(rc);CPen pen(PS_SOLID, 1.8, RGB(60,120,125);CPen *oldpen = dc.SelectObject(&pen);rc.bottom -=20;rc.right -=20;rc.top +=20;rc.left +=20;int center_x;int center_y;center_x = (rc.left + rc.right)/2;center_y = (rc.bottom + rc.top)/2;CLayer *currentlayer;currentlayer = layer;int recordnum = currentlayer->m_polyline.GetSize();int NumParts,NumPoints;int i,j,k;double x,y;for (i = 0;i<recordnum;i+) NumParts = currentlayer->m_polyline.GetAt(i).NumParts;NumPoints = currentlayer->m_polyline.GetAt(i).NumPoints;int up; for(j = 0;j<NumParts;j+)if (j = (NumParts - 1) up = NumPoints;elseup = currentlayer->m_polyline.GetAt(i).Partsj+1;x = currentlayer->m_polyline.GetAt(i).pointsj.x;y = currentlayer->m_polyline.GetAt(i).pointsj.y;x = (rc.right - rc.left)*(x - m_headlayer->box0)/(m_headlayer->box2 - m_headlayer->box0) + rc.left;y = rc.bottom + 20 -(rc.bottom - rc.top)*(y - m_headlayer->box1)/(m_headlayer->box3 - m_headlayer->box1) + rc.top);x = (ratio*(x - center_x) + center_x + mpt.x);y = (ratio*(y - center_y) + center_y + mpt.y);for(k = currentlayer->m_polyline.GetAt(i).Partsj + 1;k<up;k+)dc.MoveTo(int)x,(int)y);x = currentlayer->m_polyline.GetAt(i).pointsk.x;y = currentlayer->m_polyline.GetAt(i).pointsk.y;x = (rc.right - rc.left)*(x - m_headlayer->box0)/(m_headlayer->box2 - m_headlayer->box0) + rc.left;y = rc.bottom + 20 -(rc.bottom - rc.top)*(y - m_headlayer->box1)/(m_headlayer->box3 - m_headlayer->box1) + rc.top);x = (ratio*(x - center_x) + center_x + mpt.x);y = (ratio*(y - center_y) + center_y + mpt.y); dc.LineTo(int)x,(int)y);dc.SelectObject(oldpen);/*绘制面方法*/void CGIS_Shapefile_SiyuanView:DrawPolygon(CLayer *layer, double ratio,CPoint mpt)CClientDC dc(this);OnPrepareDC(&dc);CRect rc;GetClientRect(rc);CBrush brush(RGB(120,60,30);CBrush *oldbrush = dc.Selec

    注意事项

    本文(最新GIS暑期实习.docx)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开