一種基于wpf和gdi+分層繪制地圖的方法
【專利摘要】本發(fā)明涉及一種基于WPF和GDI+分層繪制地圖的方法,包括步驟有:(1)當?shù)貓D啟動刷新的時候,首先組件加鎖,提醒調(diào)用組件不可用;(2)將繪制地圖分為最上面的WPF繪制層、第二層的GDI+矢量圖層繪制層、第三層的實時柵格服務層及最下面的瓦片地理背景服務層,分別繪制(3)在第二層GDI+矢量圖層的繪制及第三層實時柵格服務層的繪制刷新完畢之后解鎖,即將地圖MapLocked的屬性設(shè)置為False,分層繪制的地圖刷新完畢。本發(fā)明采用WPF和GDI+混合的渲染技術(shù)和多線程技術(shù)實現(xiàn)地圖展示,可以展現(xiàn)動畫操作,利用WPF自帶的特效效果提高用戶體驗,性能明顯提高。
【專利說明】-種基于WPF和GDI +分層繪制地圖的方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于計算機地理信息【技術(shù)領(lǐng)域】,尤其是一種基于WPF和⑶1+分層繪制地圖 的方法。
【背景技術(shù)】
[0002] 地理信息系統(tǒng)(Geographic Information System),是以地理空間數(shù)據(jù)庫為基礎(chǔ), 在計算機軟硬件的支持下,運用系統(tǒng)工程和信息科學的理論,科學管理和綜合分析具有空 間內(nèi)涵的地理數(shù)據(jù),以提供管理、決策等所需信息的技術(shù)系統(tǒng)。它自20世紀60年代萌芽以 來,至今已發(fā)展得相當成熟。作為傳統(tǒng)學科與現(xiàn)代技術(shù)相結(jié)合的產(chǎn)物,地理信息系統(tǒng)正逐漸 發(fā)展成為一門處理空間數(shù)據(jù)的現(xiàn)代綜合學科。其研究的重點已從原始的算法和數(shù)據(jù)結(jié)構(gòu), 轉(zhuǎn)移到更加復雜的數(shù)據(jù)庫管理和圍繞GIS技術(shù)使用的問題上,并開始涉及地理信息科學的 建立及地理信息的社會化服務。它的含義已從最初的系統(tǒng)(SYSTEM)擴展為科學(SCIENCE) 和服務(SERVICE)。地理信息科學的出現(xiàn)使人們對地理信息的關(guān)注從技術(shù)層面逐漸轉(zhuǎn)移到 理論層面,地理信息服務的出現(xiàn)也使人們對地理信息的關(guān)注從理論和技術(shù)層面轉(zhuǎn)到社會化 和應用層面。
[0003] 隨著20世紀計算機技術(shù)的興起并迅速結(jié)合到各行各業(yè)的實際應用中,催生了許 多新的應用技術(shù),數(shù)字制圖就是其中之一。數(shù)字制圖使地圖學產(chǎn)生了深刻的技術(shù)革命,隨著 全球定位系統(tǒng)、數(shù)字攝影測量、遙感等技術(shù)的發(fā)展,使得人們能夠在第一時間獲取關(guān)于地球 表面各種空間信息,解決了地圖制圖的數(shù)據(jù)源問題;同時計算機圖形學、地圖數(shù)據(jù)庫、多媒 體等技術(shù)的發(fā)展,促使數(shù)字地圖制圖技術(shù)快速發(fā)展,也使得傳統(tǒng)的制圖技術(shù)有了重大的變 革;各種通用和專業(yè)制圖軟件的發(fā)展也減輕了制圖者的工作量。
[0004] 地圖的發(fā)展也經(jīng)歷了從靜態(tài)地圖發(fā)展到動態(tài)地圖,從模擬地圖發(fā)展到數(shù)字地圖, 從客戶端地圖組件發(fā)展到互聯(lián)網(wǎng)地圖服務這幾個重要階段。
[0005] 二維地圖展示組件也隨著時代的不同產(chǎn)生的變化,由早期的純⑶1+人工繪制圖 片,到利用空間數(shù)據(jù)庫自動繪制地圖,現(xiàn)在已經(jīng)實現(xiàn)本地數(shù)據(jù)矢量化GDI+繪制疊加通用地 理背景瓦片服務的方式出圖。同時也出現(xiàn)了基于瀏覽器的地圖瀏覽組件,基于移動端地圖 瀏覽組件。
[0006] 目前二維地圖展示組件的缺陷和不足有:1)出圖效率低,組件性能差:
[0007] 主流的GIS系統(tǒng)很多采用單線程繪制地圖,在早期地圖繪制的時候,由于數(shù)據(jù)量 比較大還疊加了地理背景的矢量數(shù)據(jù),導致每進行一次平移或者縮放操作,都是一頓一頓 的效果。即便后來利用了瓦片地理背景代替矢量地理背景,每次也都會出現(xiàn)瓦片圖片需要 都下載再成圖,不像主流Web組件一樣,采用多線程每個圖片下載到了就及時顯示瓦片。因 此整體操作的時候效果差。2)用戶體驗極差,桌面端效果與Web富客戶端無法比擬:當今 IT技術(shù)飛速發(fā)展,對系統(tǒng)應用的評價已經(jīng)由早期的系統(tǒng)可用、系統(tǒng)能用發(fā)展到了現(xiàn)在的系 統(tǒng)好用、系統(tǒng)人性化、系統(tǒng)美觀的層面上。隨著富客戶端、移動終端的發(fā)展使用戶的要求越 來越高,用戶體驗成為了對系統(tǒng)評價的重要指標。而傳統(tǒng)的桌面GIS組件明顯無法滿足當 前客戶的要求,甚至連Web端的地圖組件都差距甚遠。3)組件臃腫,部署復雜目前主流的 GIS廠商組件產(chǎn)品只是一個組件安裝包動輒幾百兆,用戶安裝十分不便,同時,實際上真正 用到里面的功能并不多,這就需要一個能夠提供輕量級應用的GIS組件。4)無法滿足新技 術(shù)趨勢,隨著操作系統(tǒng)的不斷變化,和新的技術(shù)的產(chǎn)生,傳統(tǒng)的Winform組件已經(jīng)無法跟上 以后的變化,觸摸技術(shù),動畫技術(shù),跨平臺技術(shù),扁平化界面設(shè)計等等這些新的技術(shù)和理念 都需要有新的平臺去支撐。
【發(fā)明內(nèi)容】
[0008] 本發(fā)明的目的是為了克服現(xiàn)有技術(shù)的不足,提供一種基于WPF和GDI+分層繪制地 圖的方法。
[0009] 本發(fā)明解決其技術(shù)問題是采取以下技術(shù)方案實現(xiàn)的:
[0010] 一種基于WPF和⑶1+分層繪制地圖的方法,包括步驟如下:
[0011] (1)當?shù)貓D啟動刷新的時候,首先組件加鎖,提醒調(diào)用組件不可用,添加 MapLocked的屬性,開始刷新的時候設(shè)置MapLoaded為True ;
[0012] (2)將繪制地圖分為最上面的WPF繪制層、第二層的⑶1+矢量圖層繪制層、第三層 的實時柵格服務層及最下面的瓦片地理背景服務層,分別繪制;
[0013] ①最上面WPF繪制層的繪制,通過主線程繪制WPF繪制層上面的二維矢量圖形,使 用WPF自帶的System. Windows. Shapes. Path對象對繪制痕跡反饋(Feedback)和地圖元素 (Element)進行繪制,其具體操作過程為:將地圖中的繪制痕跡對象集合和地圖中地圖元 素對象集合進行地理坐標到屏幕坐標的轉(zhuǎn)換,再根據(jù)已經(jīng)坐標轉(zhuǎn)換后的對象集合生成實體 的System. Windows. Shapes. Path對象集合放到圖層Canvas容器中,最終完成該次繪制操 作;
[0014] ②第二層GDI+矢量圖層的繪制,該圖層的繪制采用多線程,及GDI+繪制圖片加載 到該層中的方式,繪制過程分成兩個步驟進行,第一步是對矢量數(shù)據(jù)的形狀進行繪制,第二 步是對于標注的繪制,最終繪制在一個圖片上,放到Canvas圖層上;
[0015] ③第三層實時柵格服務層的繪制,該圖層的繪制采用多線程,及異步獲取,且能支 持多個柵格地圖服務的方式,當?shù)貓D完成視野變化的時候,異步從網(wǎng)絡下載屬于該視野的 矢量柵格圖片,放到Canvas圖層上;
[0016] ④最下面瓦片地理背景服務層的繪制,該層在從網(wǎng)絡獲取地圖的時候,采用線程 池異步下載獲取當前可見范圍內(nèi)所需的瓦片圖片,在地圖可見范圍變化時,利用WPF幀動 畫實時異步刷新該圖層獲取瓦片,同時緩存一定數(shù)據(jù)量的瓦片圖片;
[0017] (3)在第二層GDI+矢量圖層的繪制及第三層實時柵格服務層的繪制刷新完畢之 后解鎖,即將地圖MapLocked的屬性設(shè)置為False,分層繪制的地圖刷新完畢;
[0018] (4)獲得目標視圖范圍,以該范圍作為每個圖層的參數(shù),各層在自己的線程中獨 立渲染,互相不干擾,每個層渲染完畢,即時結(jié)束。
[0019] 而且,所述步驟(2)的②采用多線程繪制該圖層,既開啟子線程,具體的子線程是 利用微軟多線程工具System. ComponentModel. BackgroundWorker,在其DoWork方法中添 加矢量繪制的程序代碼,同時,在其RunWorkerCompleted事件下,將渲染后的矢量圖片放 置到該圖層中,并且告訴組件該圖層繪制已經(jīng)完畢。
[0020] 而且,所述步驟(2)的③步中采用多線程,及異步獲取,具體是采用微軟多線程工 具System. ComponentModel. BackgroundWorker,在其DoWork方法中添加通過網(wǎng)絡獲取某 服務柵格數(shù)據(jù),同時,在其RunWorkerCompleted事件下將從網(wǎng)絡上獲得的矢量柵格圖片放 置到該圖層中,并且告訴組件該圖層繪制已經(jīng)完畢。
[0021] 而且,所述步驟(2)的④中線程池異步下載獲取當前可見范圍內(nèi)所需的瓦片圖 片,具體采用采用微軟提供的線程池類庫System. Threading. ThreadPool的方法。
[0022] 本發(fā)明的優(yōu)點和積極效果是:
[0023] 1、本發(fā)明采用WPF和⑶1+混合的渲染技術(shù)和多線程技術(shù)實現(xiàn)地圖展示,性能明顯 提1?。
[0024] 2、本發(fā)明的地圖組件核心為WPF組件,可以展現(xiàn)動畫操作,利用WPF自帶的特效效 果提高用戶體驗。展現(xiàn)效果等同于Web瀏覽器地圖組件展現(xiàn)效果,而且能夠更好。
[0025] 3、本發(fā)明為基于C#的輕量級組件,組件大小不超過50M,安裝及攜帶方便,可以即 插即用。
[0026] 4、WPF的核心XAML技術(shù)是為了 Windows操作系統(tǒng)的核心技術(shù),等同于以前的COM 技術(shù),且內(nèi)置觸摸、動畫、GPU渲染等功能,是未來Windows發(fā)展的趨勢。
【專利附圖】
【附圖說明】
[0027] 圖1是本發(fā)明方法的分層繪制流程圖;
[0028] 圖2是本發(fā)明中地圖組件分層細化圖。
【具體實施方式】
[0029] 以下結(jié)合附圖對本發(fā)明實施做進一步詳述,以下實施例只是描述性的,不是限定 性的,不能以此限定本發(fā)明的保護范圍。
[0030] -種基于WPF和⑶1+分層繪制地圖的方法,如圖1所示,該方法包括步驟如下:
[0031] (1)當?shù)貓D啟動刷新的時候,首先組件加鎖,提醒調(diào)用組件不可用,添加 MapLocked的屬性,開始刷新的時候設(shè)置MapLoaded為True ;
[0032] (2)將繪制地圖分為最上面的WPF繪制層、第二層的⑶1+矢量圖層繪制層、第三層 的實時柵格服務層及最下面的瓦片地理背景服務層,分別繪制,如圖2所示;
[0033] ①最上面WPF繪制層的繪制,通過主線程繪制WPF繪制層上面的二維矢量圖形,使 用WPF自帶的System. Windows. Shapes. Path對象對繪制痕跡反饋(Feedback)和地圖元素 (Element)進行繪制,其具體操作過程為:將地圖中的繪制痕跡對象集合和地圖中地圖元 素對象集合進行地理坐標到屏幕坐標的轉(zhuǎn)換,再根據(jù)已經(jīng)坐標轉(zhuǎn)換后的對象集合生成實體 的System. Windows. Shapes. Path對象集合放到圖層Canvas容器中,最終完成該次繪制操 作;
[0034] ②第二層GDI+矢量圖層的繪制,該圖層的繪制采用多線程,及GDI+繪制圖片加 載到該層中的方式,保證整體界面流暢,不會使界面假死,繪制過程分成兩個步驟進行, 第一步是對矢量數(shù)據(jù)的形狀進行繪制,第二步是對于標注的繪制,最終繪制在一個圖片 (Bitmap)上,放到Canvas圖層上。
[0035] 其中,所述采用多線程繪制該圖層,既開啟子線程,在子線程中繪制該矢量圖層, 具體的子線程是利用微軟多線程工具System. ComponentModel. BackgroundWorker,在其 DoWork方法中添加矢量繪制的程序代碼,同時,在其RunWorkerCompleted事件下,將渲染 后的矢量圖片放置到該圖層中,并且告訴組件該圖層繪制已經(jīng)完畢;
[0036] ③第三層實時柵格服務層的繪制,該圖層的繪制采用多線程,及異步獲取,且能支 持多個柵格地圖服務的方式,當?shù)貓D完成視野變化的時候,異步從網(wǎng)絡下載屬于該視野的 矢量柵格圖片,放到Canvas圖層上;
[0037] 其中,米用微軟多線程工具 System. ComponentModel. BackgroundWorker,在其 DoWork方法中添加通過網(wǎng)絡獲取某服務柵格數(shù)據(jù),同時,在其RunWorkerCompleted事件下 將從網(wǎng)絡上獲得的矢量柵格圖片放置到該圖層中,并且告訴組件該圖層繪制已經(jīng)完畢。
[0038] ④最下面瓦片地理背景服務層的繪制,該層在從網(wǎng)絡獲取地圖的時候,采用線程 池異步下載獲取當前可見范圍內(nèi)所需的瓦片圖片,在地圖可見范圍變化時,利用WPF幀動 畫實時異步刷新該圖層獲取瓦片,同時緩存一定數(shù)據(jù)量的瓦片圖片。
[0039] 其中,所述線程池異步下載獲取當前可見范圍內(nèi)所需的瓦片圖片,具體采用采用 微軟提供的線程池類庫System. Threading. ThreadPool的方法;
[0040] (3)在第二層GDI+矢量圖層的繪制及第三層實時柵格服務層的繪制刷新完畢之 后解鎖,即將地圖MapLocked的屬性設(shè)置為False,分層繪制的地圖刷新完畢。
[0041] (4)四個層都依賴地圖的視野范圍(Viewport),每個層的刷新都需要視野范圍做 為參數(shù),當?shù)貓D需要刷新的時候,系統(tǒng)會獲得目標視圖范圍,這個范圍就是每個圖層所需 要的參數(shù),各層之間沒有相互的依賴關(guān)系,這樣可以使各層在自己的線程中獨立渲染,互 相不干擾,每個層渲染完畢,即時結(jié)束。
【權(quán)利要求】
1. 一種基于WPF和GDI+分層繪制地圖的方法,其特征在于包括步驟如下: (1) 當?shù)貓D啟動刷新的時候,首先組件加鎖,提醒調(diào)用組件不可用,添加 MapLocked的 屬性,開始刷新的時候設(shè)置MapLoaded為True ; (2) 將繪制地圖分為最上面的WPF繪制層、第二層的GDI+矢量圖層繪制層、第三層的實 時柵格服務層及最下面的瓦片地理背景服務層,分別繪制; ① 最上面WPF繪制層的繪制,通過主線程繪制WPF繪制層上面的二維矢量圖形,使用 WPF自帶的System. Windows. Shapes. Path對象對繪制痕跡反饋和地圖元素進行繪制,其具 體操作過程為:將地圖中的繪制痕跡對象集合和地圖中地圖元素對象集合進行地理坐標到 屏幕坐標的轉(zhuǎn)換,再根據(jù)已經(jīng)坐標轉(zhuǎn)換后的對象集合生成實體的System. Windows. Shapes. Path對象集合放到圖層Canvas容器中,最終完成該次繪制操作; ② 第二層GDI+矢量圖層的繪制,該圖層的繪制采用多線程,及GDI+繪制圖片加載到該 層中的方式,繪制過程分成兩個步驟進行,第一步是對矢量數(shù)據(jù)的形狀進行繪制,第二步是 對于標注的繪制,最終繪制在一個圖片上,放到Canvas圖層上; ③ 第三層實時柵格服務層的繪制,該圖層的繪制采用多線程,及異步獲取,且能支持多 個柵格地圖服務的方式,當?shù)貓D完成視野變化的時候,異步從網(wǎng)絡下載屬于該視野的矢量 柵格圖片,放到Canvas圖層上; ④ 最下面瓦片地理背景服務層的繪制,該層在從網(wǎng)絡獲取地圖的時候,采用線程池異 步下載獲取當前可見范圍內(nèi)所需的瓦片圖片,在地圖可見范圍變化時,利用WPF幀動畫實 時異步刷新該圖層獲取瓦片,同時緩存一定數(shù)據(jù)量的瓦片圖片; (3) 在第二層GDI+矢量圖層的繪制及第三層實時柵格服務層的繪制刷新完畢之后解 鎖,即將地圖MapLocked的屬性設(shè)置為False,分層繪制的地圖刷新完畢; (4) 獲得目標視圖范圍,以該范圍作為每個圖層的參數(shù),各層在自己的線程中獨立渲 染,互相不干擾,每個層渲染完畢,即時結(jié)束。
2. 根據(jù)權(quán)利要求1所述的基于WPF和GDI+分層繪制地圖的方法,其特征在于:所述步 驟(2)的②采用多線程繪制該圖層,既開啟子線程,具體的子線程是利用微軟多線程工具 System. ComponentModel. BackgroundWorker,在其DoWork方法中添加矢量繪制的程序代 碼,同時,在其RunWorkerCompleted事件下,將渲染后的矢量圖片放置到該圖層中,并且告 訴組件該圖層繪制已經(jīng)完畢。
3. 根據(jù)權(quán)利要求1所述的基于WPF和GDI+分層繪制地圖的方法,其特征在于:所 述步驟(2)的③步中采用多線程,及異步獲取,具體是采用微軟多線程工具System. ComponentModel. BackgroundWorker,在其DoWork方法中添加通過網(wǎng)絡獲取某服務柵格數(shù) 據(jù),同時,在其RunWorkerCompleted事件下將從網(wǎng)絡上獲得的矢量柵格圖片放置到該圖層 中,并且告訴組件該圖層繪制已經(jīng)完畢。
4. 根據(jù)權(quán)利要求1所述的基于WPF和GDI+分層繪制地圖的方法,其特征在于:所述步 驟(2)的④中線程池異步下載獲取當前可見范圍內(nèi)所需的瓦片圖片,具體采用微軟提供的 線程池類庫 System. Threading. ThreadPool 的方法。
【文檔編號】G06F17/30GK104156480SQ201410423803
【公開日】2014年11月19日 申請日期:2014年8月26日 優(yōu)先權(quán)日:2014年8月26日
【發(fā)明者】胡曉楠, 李欣榮, 李寬榮, 高勇 申請人:天津市普迅電力信息技術(shù)有限公司