全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
地图都有一个单位(Unit)、比例尺(Zoom)的概念,还有投影的问题。对于Unit,一般使用Km、m或者经纬度来表示。一幅地图,在其所有数据的Unit和投影都一致的情况下,在屏幕绘制这些对象到地图时,就要根据比例尺进行坐标转换,将这些坐标变换到屏幕坐标;同时,在进行地图的缩放、移动、拾取等操作的时候,鼠标的坐标是屏幕桌面的坐标系统,也要转换到地图坐标系统(一般称为World Coordinates System,简称WCS)。首先来看比例(Zoom)在Map类里的定义:private double _Zoom;public double Zoom get return _Zoom; set if (value _MaximumZoom) _Zoom = _MaximumZoom; else _Zoom = value; if (MapViewOnChange != null) MapViewOnChange(); 这个Zoom表示使用地图Unit表示的地图宽度。例如地图单位是Km,那么如果目前地图的宽度是500Km,Zoom就是500。这个和Mapinfo中Zoom的概念是一致的。那么在渲染的时候,就要对所有对象进行坐标转换,转换为要渲染的图片的坐标系统,然后调用GDI+进行渲染。对于对象的渲染,定义在Layer的名称空间里,在VectorLayer类的Render方法里,根据Geometry对象的层次依次遍历各个对象,然后调用Rendering名称空间的VectorRenderer的各个方法来渲染不同的点、线、面等对象。在渲染具体对象时,我们看到这些方法都调用了一个TransformToImage的方法,而这个方法定义在不同的Geometry名称空间的不同类里,目的是由空间对象经过坐标变换后返回一个.net的绘图对象。我们把这个流程整理如下: Map对象GetMap方法 GetMap方法遍历其Layer,调用Layer的Render方法 各个Layer开始渲染自己,对于栅格和WMS层,返回范围内的图片即可,主要是VectorLayer的渲染 VectorLayer调用自己DataSource Provider的GetFeaturesInView方法,返回范围内的对象到一个列表 依次遍历列表的各个对象,调用Rendering名称空间的VectorRenderer的各个方法来渲染不同的点、线、面等对象 渲染这些对象前,调用几何对象的TransformToImage方法,返回一个.net的绘图对象 GDI+根据Style渲染在最后一步,各个对象调用的TransformToImage方法其实是逐次转换Geometry对象的各个点(Point)。而点的坐标转换定义在Utilities.Transform下,有2个方法:public static System.Drawing.PointF WorldtoMap(SharpMap.Geometries.Point p, SharpMap.Map map)和public static SharpMap.Geometries.Point MapToWorld(System.Drawing.PointF p, SharpMap.Map map)分别转换WCS坐标到Image坐标和转换Image坐标到WCS坐标。这是转换代码:System.Drawing.PointF result = new System.Drawing.Point();double Height = (map.Zoom * map.Size.Height) / map.Size.Width;double left = map.Center.X - map.Zoom/2;double top = map.Center.Y + Height/2;double pxSize = map.Zoom / map.Size.Width;result.X = (float)Math.Round(p.X - left) / pxSize), 0);result.Y = (float)Math.Round(top - p.Y) / pxSize), 0);return result;left和top表示当前地图的左上角坐标,Height是高度,需要通过Zoom和Height来换算一下,也许写作map.Zoom * (map.Size.Height / map.Size.Width)更好理解一点。pxSize相当于在最终的图片上的一个单位相当于WCS的多少单位,这样,(p.X - left) / pxSize就是横坐标,纵坐标由于图片y轴相反,因此是(top - p.Y) / pxSize。有过Dos或者Windows图形编程经验的人对于这样的代码应该是非常熟悉。这段代码的计算left、height、top、pxSize这些参数的语句其实应该在Map每次更改Zoom时计算比较好,因为这个函数会被调用非常多次(每个点都要转换坐标),不过这些都是优化的话了,可以放在系统稳定以后。SharpMap目前还没有Unit的问题(版本0.8),在Map和Layer里也没有定义Unit,投影在新版0.90的beta里有部分代码。象ArcGIS和Mapinfo都支持动态投影,也就是对Map定义一个Unit和投影,对不同的Layer定义一个投影和Unit,他可以自动的转换这些Layer的Unit到地图,然后叠加显示。这样的话,在显示(渲染)时,就需要对所有对象都要进行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【育人方略】班主任带班育人方略:追风赶月莫停留平芜尽处是春山
- 淄博市人民医院科室教学质量监控考核
- 萍乡市中医院临床能力综合考核
- 南平市人民医院脉管浸润诊断考核
- 三明市中医院透视技术操作考核
- 泰州市人民医院神经调控设备程控技术考核
- 吉安市人民医院幼年特发性关节炎分型与治疗考核
- 福州市中医院鹿角形结石综合治疗考核
- 莆田市中医院医保政策掌握与应用考核
- 合肥市中医院病案质量管理考核
- 兽药安全使用及配伍禁忌快速查阅表
- 新时代乡村治理培训课件
- 道路绿化施工的重点难点分析及措施
- (2025秋新版)外研版八年级英语上册全册教案
- 遵义诚胜商贸有限责任公司铝土矿破碎加工项目环评报告
- 心境障碍患者的护理
- 2025年山东省饲料兽药工程职称考试(畜禽废弃物资源化利用及无害化处理专业·初、中级)历年参考题库含答案详解(5卷)
- 中年职场人员职业规划与能力提升
- 2025至2030年中国春联行业市场供需格局及投资规划建议报告
- 地月VLBI关键技术-洞察及研究
- EPC工程项目管理与实施计划范本
评论
0/150
提交评论