关于GIS的图形绘制方法的分析

2016-05-30 10:48王盼
科技风 2016年14期
关键词:经纬度调用图层

摘 要:地理信息系统是空间信息系统的一种特定形式,本文通过介绍地理信息系统(GIS)、函数转换、绘图、封装地图等基本知识,详细的分析了GIS的图形绘制方法。

关键词:地理信息系统(GIS);地图绘制

地理信息系统(Geographic Information System或 Geo-Information system,GIS)称为“地理学信息系统”,是空间信息系统的一种特定形式。需要在计算机硬、软件系统的支持下,对整个或部分地球表层空间中的有关地理分布的数据进行采集、储存、运算、分析、管理、描述、显示的技术系统。

地理位置中的经纬度坐标只能在地理信息中代表为某个地点、标志或方位,对于用户理解和认识周边信息有一定的局限;在通过相关技术获取到位置之后,了解了所处的地理环境,通过查询和分析环境信息,为用户的活动提供信息支持与服务,更注重用户的需求,满足用户的各种体验。

一、地图是通过函数的调用绘制出来的

地图的绘制是对函数的基本操作,即使用绘图语句画出来的。从基础的底层地图绘制,就是使用绘图函数绘制点、线、面、标准、栅格等组合起来,就形成了一张地图。

二、地图绘制中的关键——坐标转换

.NET提供了大量绘图方法,基本上都是以Graphics类的函数形式提供,包括各类几何形状、图像、文字的绘制,通过这些方法可以画出各种图形。但是图形的绘制和坐标方位有着赞扬联系,使我们绘制的地图可以转换为地图元素,即地理坐标的经纬度,需要解决坐标转换问题。

首先了解一下转换函数:

///经纬度

///屏幕坐标

public Point WorldToScreen(PointF xy)

再一个,有时,还需要根据屏幕上点位置反算出它的经纬度,如在需要显示鼠标指针处的经纬度,所以还需要这么一个函数:

///屏幕坐标

///经纬度

public PointF ScreenToWorld(Point xy)

有了这两个函数,就可以将以经纬度表示的地理坐标转换为屏幕坐标,然后再屏幕绘图了。

三、绘图

有了坐标转换类Coordinator,就可以用经纬度数据来绘图了,如得到了经纬度坐标数据,就可以将经纬度数据转换为屏幕坐标,然后用Graphics的方法来画出来了,Graphics对象又从哪里来呢?可以从一个Image对象创建,也可以从一个控件的Paint事件中取得。

为了使用方便,FreeMicaps把符号绘制功能封装到三个符号类中,以静态方法提供。

.NET的绘图是对GDI+的封装,包括了对点、线、面等各种图形元素的封装,图形图像的绘制、坐标旋转,各种反走样和平滑等功能,功能十分强大,利用它可以绘出各种图形。

四、图层

为了使绘图过程便于管理,可将绘图过程分为组,如可以将一张地图的绘制分为:交通地图、建筑地图、管道地图、区域地图等几个过程,每次绘图好像就是在一张玻璃上绘制,叠加起来就形成了一张地图,这里把每次绘图过程形象地称为一个图层。地图分层后,图层可以增删,每个图层可以单独进行隐藏、设置属性等,更重要的是可以将利用面向对象技术把每个图层当做一个对象进行管理。

对图层进行抽象,需要调用图层绘制方法(Render),图层标题(LayerName)和用于表示数据源的字符串(DataSource)。用于表示绘图样式的设置的LayerStyle,加上一些辅助方法属性,最终形成如下抽象图层类(CustomLayer)。

FreeMicaps中,每种数据对应一种图层类,为了使图层类编写方便,使用了设计模式中的模板方法,定义绘制流程,主程序在调用图层的Render()方法时,会自动判断是否已经读入数据,根据需要分析数据绘图。

对于同一种类型数据,需要从CustomLayer继承新建一个图层类。各种类型数据图层的工作方式一样,仅在数据读取和绘制方面不同。所以,写新图层类时,仅需实现DoLoad()和DoRender()两个抽象方法,完成读取数据和绘制图层代码即可。FreeMicaps里使用了字符串作为数据源标识,通用GIS系统对数据源进行了抽象。

一张地图有多个图层,所以还需要将图层放入一个列表,用于绘制地图时遍历图层。调用每个图层的Render()方法,形成一张完整的地图。

图层绘制是需要有顺序的,在图层的样式(LayerStyle)中放了一个ZOrder属性,通过它来控制图层顺序。但由于List本身的排序方法是一种“非稳固排序”,也就是说当两个图层的ZOrder相等时,它们的顺序是不确定的,为了避免这个问题,FreeMicaps从CollectionBase继承了一个类LayerList,实现对图层的管理,并实现了IXmlSerializable接口,完成图层序列化功能。

FreeMicaps中,每种数据对应一种图层类,为了使图层类编写方便,使用了设计模式中的模板方法,定义绘制流程,主程序在调用图层的Render()方法时,会自动判断是否已经读入数据,根据需要读数据绘图。

五、封装地图

有了坐标转换类、图层类、图层列表类,就可以利用它们做出一个具有缩放平移、图层管理等功能的地图了,但为了更方便地对地图进行操作,还需要对这些类进行组合封装。

新建一个类WeatherMap,添加Coordinator和LayerList类的实例作为它的属性,将Coordinator类的实例作为私有成员,将地图坐标转换等方法加入WeatherMap类,调用WeatherMap类的方法。

再回到抽象图层类CustomLayer,它有一个成员Map,即为WeatherMap对象,在将图层加入图层列表时会自动赋值。在编写CustomLayer的子类时,可调用它来进行坐标转换和地图操作。

为了使地图在绘制复杂图形过程中不至于BUG,需要在绘图过程中能随时中断绘图,如快速缩放平移地图中,可终止前次绘图过程直接绘制最后一次,就实现了地图绘制的多线程,特别是多线程操作UI,对程序流程造成了一定混乱。

六、再次封装-增加UI

上面已完成了地图绘制的核心代码,为了使代码编写更加容易,需要对WeatherMap类再次进行封装(MapView类),加入UI部分,即给地图加一个具有界面的壳,并在上面实现地图的操作如缩放、拖动功能。

MapView从PictureBox类继承,内建了WeatherMap类的实例,在MapView的Refresh()方法中调用WeatherMap.Render()对地图进行绘制。

为了完成对地图的操作,FreeMicaps定义一个IMapTool接口,包含了鼠标和键盘操作方法,MapView类内建一个IMapTool接口成员,MapView的鼠标和键盘操作,将被IMapTool接口的实例接管,在实现IMapTool接口的类中,可对地图做各种操作,如平移、缩放等操作,这个对象可随时替换以实现不同方式的地图操作。

在FreeMicaps中,已完成一个实现IMapTool接口的类ZoomTool,此类为默认的地图缩放和平移工具。

另外,在MapView中,还引入了一个当前图层的概念CurrentLayer,用它来表示当前操作的图层,后面用它来实现图层元素拾取、图层工具条等功能。

通过以上论述的方法,可以对地图的开发有了全面、透彻的了解,便于开发人员对地图系统的优化和升级。文章对GIS系统的论述仅限于基础应用和开发,不妥之处请批评指正。

参考文献:

[1] 朱洪军.基于GIS的移动终端LBS系统建设与实现[D].华东师范大学,2008.

[2] 李海艳.移动GIS的概念体系研究[D].长安大学,2006.

作者简介:

王盼(1985-),男,汉族,北京人,本科,工程师,单位:国家新闻出版广电总局北京广播电视维护中心,研究方向:广电系统节目传输和调度。

猜你喜欢
经纬度调用图层
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
基于经纬度范围的多点任务打包算法
巧用混合图层 制作抽象动感森林
自制中学实验操作型经纬测量仪
基于系统调用的恶意软件检测技术研究
澳洲位移大,需调经纬度
图层法在地理区域图读图中的应用
跟我学添加真实的光照效果
浅析“递层优化法”在矿井制图中的应用