一种基于WPF和GDI+分层绘制地图的方法转让专利

申请号 : CN201410423803.8

文献号 : CN104156480A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 胡晓楠李欣荣李宽荣高勇

申请人 : 天津市普迅电力信息技术有限公司

摘要 :

本发明涉及一种基于WPF和GDI+分层绘制地图的方法,包括步骤有:(1)当地图启动刷新的时候,首先组件加锁,提醒调用组件不可用;(2)将绘制地图分为最上面的WPF绘制层、第二层的GDI+矢量图层绘制层、第三层的实时栅格服务层及最下面的瓦片地理背景服务层,分别绘制(3)在第二层GDI+矢量图层的绘制及第三层实时栅格服务层的绘制刷新完毕之后解锁,即将地图MapLocked的属性设置为False,分层绘制的地图刷新完毕。本发明采用WPF和GDI+混合的渲染技术和多线程技术实现地图展示,可以展现动画操作,利用WPF自带的特效效果提高用户体验,性能明显提高。

权利要求 :

1.一种基于WPF和GDI+分层绘制地图的方法,其特征在于包括步骤如下:

(1)当地图启动刷新的时候,首先组件加锁,提醒调用组件不可用,添加MapLocked的属性,开始刷新的时候设置MapLoaded为True;

(2)将绘制地图分为最上面的WPF绘制层、第二层的GDI+矢量图层绘制层、第三层的实时栅格服务层及最下面的瓦片地理背景服务层,分别绘制;

①最上面WPF绘制层的绘制,通过主线程绘制WPF绘制层上面的二维矢量图形,使用WPF自带的System.Windows.Shapes.Path对象对绘制痕迹反馈和地图元素进行绘制,其具体操作过程为:将地图中的绘制痕迹对象集合和地图中地图元素对象集合进行地理坐标到屏幕坐标的转换,再根据已经坐标转换后的对象集合生成实体的System.Windows.Shapes.Path对象集合放到图层Canvas容器中,最终完成该次绘制操作;

②第二层GDI+矢量图层的绘制,该图层的绘制采用多线程,及GDI+绘制图片加载到该层中的方式,绘制过程分成两个步骤进行,第一步是对矢量数据的形状进行绘制,第二步是对于标注的绘制,最终绘制在一个图片上,放到Canvas图层上;

③第三层实时栅格服务层的绘制,该图层的绘制采用多线程,及异步获取,且能支持多个栅格地图服务的方式,当地图完成视野变化的时候,异步从网络下载属于该视野的矢量栅格图片,放到Canvas图层上;

④最下面瓦片地理背景服务层的绘制,该层在从网络获取地图的时候,采用线程池异步下载获取当前可见范围内所需的瓦片图片,在地图可见范围变化时,利用WPF帧动画实时异步刷新该图层获取瓦片,同时缓存一定数据量的瓦片图片;

(3)在第二层GDI+矢量图层的绘制及第三层实时栅格服务层的绘制刷新完毕之后解锁,即将地图MapLocked的属性设置为False,分层绘制的地图刷新完毕;

(4)获得目标视图范围,以该范围作为每个图层的参数,各层在自己的线程中独立渲染,互相不干扰,每个层渲染完毕,即时结束。

2.根据权利要求1所述的基于WPF和GDI+分层绘制地图的方法,其特征在于:所述步骤(2)的②采用多线程绘制该图层,既开启子线程,具体的子线程是利用微软多线程工具System.ComponentModel.BackgroundWorker,在其DoWork方法中添加矢量绘制的程序代码,同时,在其RunWorkerCompleted事件下,将渲染后的矢量图片放置到该图层中,并且告诉组件该图层绘制已经完毕。

3.根据权利要求1所述的基于WPF和GDI+分层绘制地图的方法,其特征在于:所述步骤(2)的③步中采用多线程,及异步获取,具体是采用微软多线程工具System.ComponentModel.BackgroundWorker,在其DoWork方法中添加通过网络获取某服务栅格数据,同时,在其RunWorkerCompleted事件下将从网络上获得的矢量栅格图片放置到该图层中,并且告诉组件该图层绘制已经完毕。

4.根据权利要求1所述的基于WPF和GDI+分层绘制地图的方法,其特征在于:所述步骤(2)的④中线程池异步下载获取当前可见范围内所需的瓦片图片,具体采用微软提供的线程池类库System.Threading.ThreadPool的方法。

说明书 :

一种基于WPF和GDI+分层绘制地图的方法

技术领域

[0001] 本发明属于计算机地理信息技术领域,尤其是一种基于WPF和GDI+分层绘制地图的方法。

背景技术

[0002] 地理信息系统(Geographic Information System),是以地理空间数据库为基础,在计算机软硬件的支持下,运用系统工程和信息科学的理论,科学管理和综合分析具有空间内涵的地理数据,以提供管理、决策等所需信息的技术系统。它自20世纪60年代萌芽以来,至今已发展得相当成熟。作为传统学科与现代技术相结合的产物,地理信息系统正逐渐发展成为一门处理空间数据的现代综合学科。其研究的重点已从原始的算法和数据结构,转移到更加复杂的数据库管理和围绕GIS技术使用的问题上,并开始涉及地理信息科学的建立及地理信息的社会化服务。它的含义已从最初的系统(SYSTEM)扩展为科学(SCIENCE)和服务(SERVICE)。地理信息科学的出现使人们对地理信息的关注从技术层面逐渐转移到理论层面,地理信息服务的出现也使人们对地理信息的关注从理论和技术层面转到社会化和应用层面。
[0003] 随着20世纪计算机技术的兴起并迅速结合到各行各业的实际应用中,催生了许多新的应用技术,数字制图就是其中之一。数字制图使地图学产生了深刻的技术革命,随着全球定位系统、数字摄影测量、遥感等技术的发展,使得人们能够在第一时间获取关于地球表面各种空间信息,解决了地图制图的数据源问题;同时计算机图形学、地图数据库、多媒体等技术的发展,促使数字地图制图技术快速发展,也使得传统的制图技术有了重大的变革;各种通用和专业制图软件的发展也减轻了制图者的工作量。
[0004] 地图的发展也经历了从静态地图发展到动态地图,从模拟地图发展到数字地图,从客户端地图组件发展到互联网地图服务这几个重要阶段。
[0005] 二维地图展示组件也随着时代的不同产生的变化,由早期的纯GDI+人工绘制图片,到利用空间数据库自动绘制地图,现在已经实现本地数据矢量化GDI+绘制叠加通用地理背景瓦片服务的方式出图。同时也出现了基于浏览器的地图浏览组件,基于移动端地图浏览组件。
[0006] 目前二维地图展示组件的缺陷和不足有:1)出图效率低,组件性能差:
[0007] 主流的GIS系统很多采用单线程绘制地图,在早期地图绘制的时候,由于数据量比较大还叠加了地理背景的矢量数据,导致每进行一次平移或者缩放操作,都是一顿一顿的效果。即便后来利用了瓦片地理背景代替矢量地理背景,每次也都会出现瓦片图片需要都下载再成图,不像主流Web组件一样,采用多线程每个图片下载到了就及时显示瓦片。因此整体操作的时候效果差。2)用户体验极差,桌面端效果与Web富客户端无法比拟:当今IT技术飞速发展,对系统应用的评价已经由早期的系统可用、系统能用发展到了现在的系统好用、系统人性化、系统美观的层面上。随着富客户端、移动终端的发展使用户的要求越来越高,用户体验成为了对系统评价的重要指标。而传统的桌面GIS组件明显无法满足当前客户的要求,甚至连Web端的地图组件都差距甚远。3)组件臃肿,部署复杂目前主流的GIS厂商组件产品只是一个组件安装包动辄几百兆,用户安装十分不便,同时,实际上真正用到里面的功能并不多,这就需要一个能够提供轻量级应用的GIS组件。4)无法满足新技术趋势,随着操作系统的不断变化,和新的技术的产生,传统的Winform组件已经无法跟上以后的变化,触摸技术,动画技术,跨平台技术,扁平化界面设计等等这些新的技术和理念都需要有新的平台去支撑。

发明内容

[0008] 本发明的目的是为了克服现有技术的不足,提供一种基于WPF和GDI+分层绘制地图的方法。
[0009] 本发明解决其技术问题是采取以下技术方案实现的:
[0010] 一种基于WPF和GDI+分层绘制地图的方法,包括步骤如下:
[0011] (1)当地图启动刷新的时候,首先组件加锁,提醒调用组件不可用,添加MapLocked的属性,开始刷新的时候设置MapLoaded为True;
[0012] (2)将绘制地图分为最上面的WPF绘制层、第二层的GDI+矢量图层绘制层、第三层的实时栅格服务层及最下面的瓦片地理背景服务层,分别绘制;
[0013] ①最上面WPF绘制层的绘制,通过主线程绘制WPF绘制层上面的二维矢量图形,使用WPF自带的System.Windows.Shapes.Path对象对绘制痕迹反馈(Feedback)和地图元素(Element)进行绘制,其具体操作过程为:将地图中的绘制痕迹对象集合和地图中地图元素对象集合进行地理坐标到屏幕坐标的转换,再根据已经坐标转换后的对象集合生成实体的System.Windows.Shapes.Path对象集合放到图层Canvas容器中,最终完成该次绘制操作;
[0014] ②第二层GDI+矢量图层的绘制,该图层的绘制采用多线程,及GDI+绘制图片加载到该层中的方式,绘制过程分成两个步骤进行,第一步是对矢量数据的形状进行绘制,第二步是对于标注的绘制,最终绘制在一个图片上,放到Canvas图层上;
[0015] ③第三层实时栅格服务层的绘制,该图层的绘制采用多线程,及异步获取,且能支持多个栅格地图服务的方式,当地图完成视野变化的时候,异步从网络下载属于该视野的矢量栅格图片,放到Canvas图层上;
[0016] ④最下面瓦片地理背景服务层的绘制,该层在从网络获取地图的时候,采用线程池异步下载获取当前可见范围内所需的瓦片图片,在地图可见范围变化时,利用WPF帧动画实时异步刷新该图层获取瓦片,同时缓存一定数据量的瓦片图片;
[0017] (3)在第二层GDI+矢量图层的绘制及第三层实时栅格服务层的绘制刷新完毕之后解锁,即将地图MapLocked的属性设置为False,分层绘制的地图刷新完毕;
[0018] (4)获得目标视图范围,以该范围作为每个图层的参数,各层在自己的线程中独立渲染,互相不干扰,每个层渲染完毕,即时结束。
[0019] 而且,所述步骤(2)的②采用多线程绘制该图层,既开启子线程,具体的子线程是利用微软多线程工具System.ComponentModel.BackgroundWorker,在其DoWork方法中添加矢量绘制的程序代码,同时,在其RunWorkerCompleted事件下,将渲染后的矢量图片放置到该图层中,并且告诉组件该图层绘制已经完毕。
[0020] 而且,所述步骤(2)的③步中采用多线程,及异步获取,具体是采用微软多线程工具System.ComponentModel.BackgroundWorker,在其DoWork方法中添加通过网络获取某服务栅格数据,同时,在其RunWorkerCompleted事件下将从网络上获得的矢量栅格图片放置到该图层中,并且告诉组件该图层绘制已经完毕。
[0021] 而且,所述步骤(2)的④中线程池异步下载获取当前可见范围内所需的瓦片图片,具体采用采用微软提供的线程池类库System.Threading.ThreadPool的方法。
[0022] 本发明的优点和积极效果是:
[0023] 1、本发明采用WPF和GDI+混合的渲染技术和多线程技术实现地图展示,性能明显提高。
[0024] 2、本发明的地图组件核心为WPF组件,可以展现动画操作,利用WPF自带的特效效果提高用户体验。展现效果等同于Web浏览器地图组件展现效果,而且能够更好。
[0025] 3、本发明为基于C#的轻量级组件,组件大小不超过50M,安装及携带方便,可以即插即用。
[0026] 4、WPF的核心XAML技术是为了Windows操作系统的核心技术,等同于以前的COM技术,且内置触摸、动画、GPU渲染等功能,是未来Windows发展的趋势。

附图说明

[0027] 图1是本发明方法的分层绘制流程图;
[0028] 图2是本发明中地图组件分层细化图。

具体实施方式

[0029] 以下结合附图对本发明实施做进一步详述,以下实施例只是描述性的,不是限定性的,不能以此限定本发明的保护范围。
[0030] 一种基于WPF和GDI+分层绘制地图的方法,如图1所示,该方法包括步骤如下:
[0031] (1)当地图启动刷新的时候,首先组件加锁,提醒调用组件不可用,添加MapLocked的属性,开始刷新的时候设置MapLoaded为True;
[0032] (2)将绘制地图分为最上面的WPF绘制层、第二层的GDI+矢量图层绘制层、第三层的实时栅格服务层及最下面的瓦片地理背景服务层,分别绘制,如图2所示;
[0033] ①最上面WPF绘制层的绘制,通过主线程绘制WPF绘制层上面的二维矢量图形,使用WPF自带的System.Windows.Shapes.Path对象对绘制痕迹反馈(Feedback)和地图元素(Element)进行绘制,其具体操作过程为:将地图中的绘制痕迹对象集合和地图中地图元素对象集合进行地理坐标到屏幕坐标的转换,再根据已经坐标转换后的对象集合生成实体的System.Windows.Shapes.Path对象集合放到图层Canvas容器中,最终完成该次绘制操作;
[0034] ②第二层GDI+矢量图层的绘制,该图层的绘制采用多线程,及GDI+绘制图片加载到该层中的方式,保证整体界面流畅,不会使界面假死,绘制过程分成两个步骤进行,第一步是对矢量数据的形状进行绘制,第二步是对于标注的绘制,最终绘制在一个图片(Bitmap)上,放到Canvas图层上。
[0035] 其中,所述采用多线程绘制该图层,既开启子线程,在子线程中绘制该矢量图层,具体的子线程是利用微软多线程工具System.ComponentModel.BackgroundWorker,在其DoWork方法中添加矢量绘制的程序代码,同时,在其RunWorkerCompleted事件下,将渲染后的矢量图片放置到该图层中,并且告诉组件该图层绘制已经完毕;
[0036] ③第三层实时栅格服务层的绘制,该图层的绘制采用多线程,及异步获取,且能支持多个栅格地图服务的方式,当地图完成视野变化的时候,异步从网络下载属于该视野的矢量栅格图片,放到Canvas图层上;
[0037] 其中,采用微软多线程工具System.ComponentModel.BackgroundWorker,在其DoWork方法中添加通过网络获取某服务栅格数据,同时,在其RunWorkerCompleted事件下将从网络上获得的矢量栅格图片放置到该图层中,并且告诉组件该图层绘制已经完毕。
[0038] ④最下面瓦片地理背景服务层的绘制,该层在从网络获取地图的时候,采用线程池异步下载获取当前可见范围内所需的瓦片图片,在地图可见范围变化时,利用WPF帧动画实时异步刷新该图层获取瓦片,同时缓存一定数据量的瓦片图片。
[0039] 其中,所述线程池异步下载获取当前可见范围内所需的瓦片图片,具体采用采用微软提供的线程池类库System.Threading.ThreadPool的方法;
[0040] (3)在第二层GDI+矢量图层的绘制及第三层实时栅格服务层的绘制刷新完毕之后解锁,即将地图MapLocked的属性设置为False,分层绘制的地图刷新完毕。
[0041] (4)四个层都依赖地图的视野范围(ViewPort),每个层的刷新都需要视野范围做为参数,当地图需要刷新的时候,系统会获得目标视图范围,这个范围就是每个图层所需要的参数,各层之间没有相互的依赖关系,这样可以使各层在自己的线程中独立渲染,互相不干扰,每个层渲染完毕,即时结束。