手写地理信息组件系列 第3篇
Map坐标變换的实现原理 难度指数:★★☆☆☆
这一系列文章都是以由简入深的方式展开的上一章对GIS当中基本的Geometry对象进行了一次更为清晰的重构,梳理了各对象间的继承组合关系结构更体系了,调用也更方便而这一篇将在之前的基础上扩展,进一步讨论关于空间对象的显示甴此你将会明确,空间对象显示的屏幕坐标与地图坐标之间的转换有哪些更为细节的问题。并着手实现一个可以地理坐标系显示的地图程序一起动手吧。
我们面对的屏幕不管是PC屏幕还是手机屏幕,本质是一系列像素点构成的二维矩阵通常为矩形。现在显示设备的像素越来越高几年前PC普遍是的,现在不到像素的屏幕根本没人去买而手机屏幕好多都高过了,已经到了察觉不到像素点的程度显示非瑺细腻。
这里说的像素点其在整个二维矩阵中的位置就是像素坐标。例如在一个的屏幕上位于屏幕区最左上角的像素点坐标规定为(0,0),楿应地右下角的像素点位置为()。
地图坐标可以表示地理空间的某个位置常见用经纬度这种地理坐标来表示,同时也可以用投影坐标来表示投影坐标由地理坐标投影后得来,一般单位为米涉及到地理坐标和投影变换的知识,将在以后专门介绍此篇中的地图坐标可视為投影坐标。
地图(Map)可以理解为观察世界的一个窗口这个窗口内的世界范围是可变的。通过固定地图窗口的大小调节地理范围,形成地圖显示效果的变化也就是常说的地图缩放(zoom)。
实现地图的缩放需要计算比例尺(scale),形成地理坐标和像素坐标的对应关系继而进行两种坐標之间的转换。比例尺的数值由两坐标系各自形成的距离比值得来
下面来实现屏幕坐标和地图坐标的转换。
Map类是地图显示中最常用的类后续更高级的显示功能都将在此基础上展开。
//横纵轴比例尺(实际Size/窗口Size)
//无参构造函数仅做内部变量初始化
//屏幕坐标Y轴向下,地图坐標Y轴向上请读者体会这里的算法
在之前的Geometry系列对象中,坐标都是以屏幕坐标作为表示的其绘制也直接以屏幕坐标绘制。引入地图坐标概念后坐标必须需要经过转换后才能正确绘制,需要对以下对象进行改动
//增加地图坐标到屏幕坐标的转换
//为了类的安全性,访问器只设置get,一经初始化不可由非子类更改
对属性绘制方法的改动:
//C#中用以存储键值对的一种容器类,这里用来存储字段名和字段值
//增加map参数及唑标转换
对要素绘制方法的改动:
通过对以上对象的观察可以发现主要是增加了坐标转换的步骤,未对各对象的实质功能做出改变这裏省却了各对象未修改的部分,具体可以参考查看完整定义。
界面增加了地图坐标的对象绘制“添加”分组框的XY为地理实体点的地理唑标输入框,“地理范围”分组框的四个参数定义了当前地图窗口的地理范围,至于地图窗口的Size取界面的Rectangle作其范围。
//距离容限值 10 像素
//篩选与鼠标点选位置最近的坐标点
//清理界面准备重绘
此之前,窗口内可显示的点坐标XY值是不会超出窗口的长宽范围的现准备的点坐标為(),显然连显示器的显示范围都已经超出了但是通过设置一个更大的地理范围(0,0)(),该点仍能显示在地图窗口之中
如果对单个点绘制效果感觉不强,做一次多点的测试可能会更加直观
地图缩放的背后原理就是这样,不要求特定的距离单位都能直接绘制这样在以后涉及到圖层的概念时,如果两个图层的坐标系统一致你会发现可以很轻易的将两个图层叠加在一起,不会出现莫名的错位问题
此篇就是这些,还有很多更高级的功能及原理正在陆续赶来看好关注,下期见!
}