矢量缩放功能
本人学习基于C#语言,利用GDI+的方式进行矢量绘图有一段时间了,所以我想把这段
时间以来的心得写出来跟大家分享一下,可能有些朋友也碰到过一些困惑,但愿本人的
心得能给他们一些思路,同时,更加欢迎喜欢矢量绘图的朋友一起来探讨GDI+绘图存在
的问题。
矢量绘图涉及许多方面,这篇心得主要是写写关于矢量缩放的实现
以Shp数据为例:
读取Shp数据的空间数据,即坐标集合,以经纬的形式存储,读完数据后,就要将数据绘
制在程序的窗体(在窗体上添加PICTUREBOX)范围。
(1)要算出数据集合的包围盒,即数据的范围---数据区域的左上角点的经纬度upleftPoint(minX,maxY),右下角
经纬度downrightPoint(maxX,minY),我们将经度方向作为GDI+绘图画板的X方向,纬度方向作为GDI+绘图画板的Y方向。
(2)计算出数据区域的经差Dx,纬差Dy,根据窗体的PictureBox的宽w和高h,
分别算出 Dx / w与Dy / h的比值,若前者大,则以Dx为标准,反之,以Dy为标准,这样做,是为了
保证让数据在初始化显示的时候最大限度显示出来
此外,初始化的时候我们把数据区域的中心处理窗体的PictureBox的中心midPoint((minX+maxX)/2,(minY+maxY)/2);
(3)计算窗体的左上角(0,0)点对应的经纬度,计算窗体的右下角(w,h)点对应的经纬度----关键
(初始化,以及放大,缩小,移动时都需要重新计算)
例如以Dy为例:纬差Dy的屏幕长度为h(不考虑投影),由此可以计算窗体左上角(minLat,maxLon)与右下角对应的经纬度(maxLat,minLon)
(细节计算不列出来,有需要可以留言再交流)
结果:(0,0)--->(minLat,maxLon),
(w,h)----> (maxLat,minLon),
此时:经差为deltaX,纬差为deltaY;
由此可以计算出数据区域中所有点在此状态下对应的屏幕坐标,利用GDI+绘制出来
(4)缩放实现
以放大为例:
若放大2倍,则需要重新计算窗体左上角以及右下角屏幕位置对应的经纬度坐标
放大前:
(0,0)--->(minLat,maxLon),
(w,h)----> (maxLat,minLon),
中心点对应的经纬度坐标为:midPoint
:经差为deltaX,纬差为deltaY;
放大后:
minLat=midPoint.X-deltaX/(2*2);
maxLon=midPoint.Y+deltaY/(2*2);
maxLat=midPoint.X+deltaX/(2*2);
minLon=midPoint.Y-deltaY/(2*2);
然后重新计算数据点对应的屏幕坐标绘制出来
缩小类似....
注:在绘制的过程中需要作一些处理来提高绘图效率,这个等有时间再来写一些相关的东西跟大家分享
若要进一步交流可以加QQ(441224629),QQ群(581378927)
由于很少写这样的文章,有很多不足之处,望朋友们多多指点,纠正。