桌面GIS平台效率提升的一点小经验

本文分享了在开发跨平台桌面GIS平台时提高效率的经验,包括建立物理索引加速数据读取、内存索引提高筛选效率、数据抽稀减少绘图负担、优化绘图算法、适度缓存以及良好的刷新机制,旨在提供给GIS开发者参考。
摘要由CSDN通过智能技术生成


        最近 一直在做一个跨平台的桌面GIS平台,本来这个平台定义为移动GIS平台的,可是因为一些策划和领导意愿等原因,就把他当成一个PC桌面GIS平台来写了,反正也是跨平台也不怕多一个平台~

         做这个项目我是项目组中最年轻也是最没有资历最没有实力的一个成员了,但是由于人手问题,我还是在项目组的要求下单独负责了一个模块,地图符号库符号化模块的设计与开发,地图符号化做GIS的人都懂的,虽说算不上一个核心功能但是也是很麻烦的,其中还有很多设计地图渲染的一些技巧和效率的提升优化,在这个项目快完成之际,我也把自己在项目中的一些小经验记录下来,留给以后备用,也给需要的人一些参考。


        首先,要想提高一个GIS平台效率,我们必须明白一个问题就是,GIS平台究竟为什么慢,慢在那里?

搞清楚这个问题,首先我们要从GIS的实现说,一个GIS的平台要想画出一副漂亮的地图正确的地图,首先要到磁盘里面读数据,读取到数据之后要进行数据的坐标转换,将GIS坐标(可能是WGS84下的经纬度,也可能是BJ54下的米等等)转换为屏幕坐标,若是设置当前平台绘图的坐标系和原数据不同的话还需要进行动态投影的坐标转换,之后才是将GIS坐标转换为屏幕坐标,有了屏幕坐标之后那就直接调用绘图API进行绘图啦~

从这个流程我们可以看出,可能导致我们程序慢的原因就在于两个地方,第一,读取数据,实际上就是磁盘IO。第二,绘图,若是使用系统绘图API可能在绘图上能做的优化不多,但是可以肯定的是适当的调整绘图策略,肯定是可以极大的提高效率的。


在这个项目中我总结了以下几点经验:

        1.建立良好的物理索引,加快数据读取的时间。我们都知道,磁盘读取数据的速度取决于磁盘的查找数据时间,等待数据读取时间,和数据传输时间,其中后面两点是我们无法干涉的,能做的很少。这里所谓的物理索引指的是数据磁盘文件数据的索引,这样的索引标记了当前需要读取的数据在该文件的某个地方以便快速的定位到该数据块,如Shpfile的shx文件,建立这样的索引我们可以加快磁盘查找数据的时间。另外,存储数据的时候尽量要整块存储,读取的时候也要整块读取来减少磁盘IO次数来提高数据读取效率。


        2.建立良好的内存索引,加快数据筛选效率。对于GIS来说,绘图的时候为了加快显示时间,都不会去把所有的数据图层数据读取出来进行绘制,正确的做法是先通过屏幕显示范围计算出来地图数据所要显示的范围,然后通过一定的索引机制迅速的找到需要显示数据的ID,再通过数据的ID去硬盘查找数据读取数据,这个过程内存索引就显得异常重要,如何快速的找到要显示的地图数据数据的ID就是关键。最简单的地图索引有四叉树索引,R树索引等,当然对于四叉树索引,需要注意保持数据的深度不能太深,就是要尽量保持树的平衡,因为树一般都是递归搜索,树深度过深会直接影响到效率。例如有些数据中某一块(地域范围)数据非常多保存了几百条数据,另一块保存了几条甚至一条数据,这个时候若是四叉树建立不好的话不能平衡,也会导致效率比较低。


         3.数据的筛选抽稀。减少数据量,加快速度。假设这样一个场景,屏幕是1000*1000的分辨率,而由于地图的比例缩到比较小,此时显示的数据条数必定非常多,假设显示了100万条数据,而绘制每一条数据至少都需要一个像素宽,20个像素长,那么势必会导致有大量的数据的叠加显示,全部绘制显示这样的数据一方面会导致地图不美观,量一方面由于绘图数据特别多严重的拖慢了数据的读取和绘图世间。试想,当一个地物在地图上显示的已经没有一个像素那么大的时候你绘制他还有意义吗?答案当然是没有意义,既然没有意义那就不要画了吧,但是问题又来了,所有数据都小于一个像素了你全部都不画吗?地图是空白显然不是我们想要的结果。因此我们需要一定的算法来将部分数据绘制在图上,一方面要保证数据绘制出来的效果美观,另一方面要保证数据量大大的减少。


        4.高效的绘图算法。在平台开发过程中有很多算法 的使用率是非常之高的,例如当地图需要做动态投影的时候,那么需要绘制的每一条数据都要经过投影转换,实际上投影转换就是把每一个点的坐标都重新计算一遍,若是是你的屏幕上绘制的地物的点的个数有100万个的话,这个算法将使用100万次,显然他足以影响到我们的平台效率了,这样的情况还有很多,例如将屏幕坐标转换到地图坐标和降地图坐标转到屏幕坐标,这个算法应该是整个平台中使用最为频繁的一个算法了,他的效率直接影响了平台的效率,当然这个算法很简单也没有太多优化空间,只要不犯错误就行了,还有符号绘制的时候若是要绘制需要,那需要计算间隔,统计总长度,计算角度等一系列的算法。这里想表达的就是要把程序中那些使用频繁的算法写好,写精。


        5.适度的缓存。效率总是犹如一个天平,若时间是天平的一端的砝码,那么空间(内存)就是天平的另一端的砝码,时间多了那么空间自然消耗的少了,时间消耗的少了那么空间自然就消耗的多了,这就是我们程序中时空转换的一种思想,关键是我们如何去找到一个平衡点来达到最佳,因此缓存要适度。例如手持程序,限于其硬件原因,若是做了太多的缓存,内存不够用了程序会挂掉,若是完全不做缓存,效率有很低。对于GIS平台做缓存也是有一些技巧的,如地图数据本身比较大全部缓存肯定是不可以的,所以我们可以缓存其ID,当需要的时候就可以快速的定位到数据,如在地图上绘制GPS轨迹的时候,我们可以缓存当前除了GPS轨迹之外的一整张图片,每次更新地图的时候只需要把地图贴上再绘制GPS轨迹就好了,这样就免去了读取数据绘制数据所消耗的大量的时间,再例如若是PC程序我们把最近几次操作的的图片缓存下来回到上一视图或者下一视图的时候就只需要贴图即可,若是放大或者缩小的时候比例尺与缓存的图片比例尺相同或者几乎相同的时候我们就可以直接贴图(这里几乎相同只适用于使用工具缩放,没有明确的数据指定比例尺缩放),等等缓存方式都可以加快我们程序的速度,但是需要注意的是要适度,别因为做了过多的缓存导致系统内存不够用,那就悲剧了~


        6.良好的刷新机制。这一点其实和上一点还是有些相似的地方,地图绘制无非就是刷新地图重新绘制罢了,但是这个重新绘制也是有值得注意的地方,那些图层需要全部刷新,那些图层需要部分刷新,是完全重新读取数据绘制数据刷新还是直接贴图刷新,刷新的时候那些层先刷那些层后刷,这些都需要仔细斟酌,做的不好不但会影响效率,还有可能导致数据绘制异常。


        写在最后,说说我对GIS平台展示给我的一个认识,GIS平台展示给我的不是一些地物也不是一些要素,更不是一些分析结果,因为我是程序员,GIS平台展示给我的不过是一张图片。既然他是一张图片为什么绘图的时候我们不使用这种思想呢,我们绘制地图的时候先把地图数据都绘制到一张图片上,然后再把图片贴到屏幕上,展示给用户。而GIS绘图不过就是绘制点线面而已,说白了其实就是给一张BMP图片上绘制点而已。我们只要把我们得到的GIS数据转换成一些坐标写到图片中对应的位置即可。有了这样的思想GIS平台也就不过如此了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值