欢迎来到天天文库
浏览记录
ID:41887643
大小:40.00 KB
页数:3页
时间:2019-09-04
《4.坐标和比例尺》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、地图都有一个单位(Unit)、比例尺(Zoom)的概念,还有投影的问题。对于Unit,一般使用Km.m或者经纬度来表示。一幅地图,在其所冇数据的Unit和投影都一致的情况下,在屏幕绘制这些对象到地图时,就要根拯比例尺进行坐标转换,将这些坐标变换到屏幕坐标;同吋,在进行地图的缩放、移动、拾取等操作的时候,鼠标的坐标是屏幕桌面的坐标系统,也要转换到地图坐标系统(一般称为WorldCoordinatesSystem,简称WCS)。首先来看比例(Zoom)在Map类一里的定义:privatedouble_Zoom;publicdoubleZoom{get{return_Zoo
2、m;}set{if(value<_MinimumZoom)_Zoom=_MinimumZoom:elseif(value>_MaximumZoom)_Zoom=_MaximumZoom:else_Zoom=value;if(MapViewOnChange!=null)MapViewOnChange();这个Zoom表示使用地图Unit表示的地图宽度。例如地图单位是Km,那么如果口前地图的宽度是500Km,Zoom就是500。这个和Mapinfo屮Zoom的概念是一致的。那么在演染的时候,就要对所冇对象进行坐标转换,传换为要渲染的图片的坐标系统,然后调用GDI+进行渲染
3、。对于对象的渲染,定义在Layer的名称空间里,在VectorLayer类的Render方法里,根据Geometry对象的层次依次遍历各个对象,然后调用Rendering名称空间的VectorRenderer的各个方法来渲染不同的点、线、而等对彖。在渲染具体对象吋,我们看到这些方法都调用了一个TransformTolmage的方法,而这个方法定义在不同的Geometry名称空间的不同类里,目的是出空间对象经过坐标变换后返回一个.net的绘鹵对象。我们把这个流程整理如下:①Map对象GetMap方法一②GetMap方法遍历其Layer,调用Layer的Render方法-
4、>③各个Layer开始渲染自己,对于栅格和WMS层,返回范围内的图片即可,主要是VectorLayer的渲染一④VectorLayer调用口己DataSourceProvider的GetFeaturesInView方法,返冋范围内的对象到一个列表一⑤依次遍历列表的各个对象,调用Rendering名称空间的VectorRenderer的各个方法来渲染不同的点、线、面等对象一⑥渲染这些对彖前,调用几何对彖的TransformTolmage方法,返回一个.net的绘图对彖->⑦GDI+根据Style渲染在最后一步,各个对象调用的TransformTolmage方法其实是逐次
5、转换Geometry对象的各个点(Point)。而点的坐标转换定义在Utilities.Transform下,有2个方法:publicstaticSystem.Drawing.PointFWorldtoMap(SharpMap.Geometries.Pointp5SharpMap.Mapmap)和publicstaticSharpMap.Geometries.PointMapToWorld(System.Drawing.PointFp,SharpMap.Mapmap)分别转换WCS坐标到Image坐标和转换Image坐标到WCS坐标。这是转换代码:System.Dra
6、wing.PointFresult=newSystem.Drawing.Point();doubleHeight=(map.Zoom*map.Size.Height)/map.Size.Width;doubleleft=map.Center.X・map.Zoom/2;doubletop=map.Center.Y+Height/2;doublepxSize=map.Zoom/map.Size.Width;result.X=(float)Math.Round(((p.X-left)/pxSize),0);result.Y=(float)Math.Round(((top-p
7、.Y)/pxSize),0);returnresult;left和top表示当前地图的左上角坐标,Height是高度,需要通过Zoom和Height如换算一下,也许写作map.Zoom*(map.Size.Height/map.Size.Width)更好理解一点。pxSize相当于在最终的图片上的一个单位相当于WCS的多少单位,这样,(p.X・left)/pxSize就是横坐标,纵坐标由于图片y轴相反,因此是(top・p.Y)/pxSizeo冇过Dos或者Windows图形编程经验的人对于这样的代码应该是非常熟悉。这段代码的计算leftheight>
此文档下载收益归作者所有