在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>電子百科>通信技術(shù)>衛(wèi)星通信>

GIS地圖開發(fā)

2018年01月15日 18:33 電子發(fā)燒友網(wǎng) 作者: 用戶評論(0
關(guān)鍵字:GIS(42039)

一、 地圖是怎么做出來的

首先說一下地圖是怎么出來的,可能你感覺是廢話,但實(shí)際上很多人并不知道如何下手。我覺得這里需要先給你個思路準(zhǔn)備:地圖就是使用繪圖語句畫出來的!

從底層繪制地圖,能使用的就是繪圖函數(shù),在.NET里,就是用Graphics類的方法,在窗口中繪制點(diǎn)、線、面、標(biāo)準(zhǔn)、柵格等,組合起來,就是一張地圖(瓦片圖方式除外)。

關(guān)于.NET的繪圖,本文不進(jìn)行講解,如果你還還不熟悉,建議你先看看這方面資料

二、 坐標(biāo)轉(zhuǎn)換-地圖繪制的關(guān)鍵

.NET提供了大量繪圖方法,基本上都是以Graphics類的函數(shù)形式提供,包括各類幾何形狀、圖像、文字的繪制,靈活運(yùn)用這些方法,就可以畫出精美的圖出來。假設(shè)你已熟悉.NET的繪圖,這樣就只有有一個問題要解決:圖我會畫了,但拿到地圖元素一般為地理坐標(biāo)(經(jīng)緯度),應(yīng)該畫在地圖上什么位置?這就需要涉及到坐標(biāo)轉(zhuǎn)換問題。

先不考慮怎么實(shí)現(xiàn),首先需要這么一個函數(shù):

/// 《summary》

/// 經(jīng)緯度轉(zhuǎn)換為屏幕坐標(biāo)

/// 《/summary》

/// 《param name=“xy”》經(jīng)緯度《/param》

/// 《returns》屏幕坐標(biāo)《/returns》

public Point WorldToScreen(PointF xy)

再一個,有時,還需要根據(jù)屏幕上點(diǎn)位置反算出它的經(jīng)緯度,如在需要顯示鼠標(biāo)指針處的經(jīng)緯度,所以還需要這么一個函數(shù):

/// 《summary》

/// 屏幕坐標(biāo)轉(zhuǎn)換為經(jīng)緯度

/// 《/summary》

/// 《param name=“xy”》屏幕坐標(biāo)《/param》

/// 《returns》經(jīng)緯度《/returns》

public PointF ScreenToWorld(Point xy)

有了這兩個函數(shù),就可以將以經(jīng)緯度表示的地理坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo),然后再屏幕繪圖了。

為了完成坐標(biāo)轉(zhuǎn)換,需要使用幾個地圖參數(shù)的變量:地圖縮放倍數(shù)、地圖中心點(diǎn)經(jīng)緯度、地圖大小,關(guān)于地圖參數(shù),可參考這篇文章:

http://hi.baidu.com/geochenyj/blog/item/6b5c5c1294057557f819b835.html

另外,還需要對地圖進(jìn)行縮放、平移,這些操作實(shí)質(zhì)上也是對地圖參數(shù)的操作,如放大就是對地圖縮放倍數(shù)操作,平移就是對地圖中心點(diǎn)進(jìn)行操作,我們將這些操作也寫Coordinator類的方法。投影變換也作為坐標(biāo)轉(zhuǎn)換的一部分,Coordinator類還增加了投影方面方法,這個后面再講。

將上面兩個坐標(biāo)轉(zhuǎn)換函數(shù)和三個地圖參數(shù)封裝為一個類Coordinator。,的類如下所示:

?GIS地圖開發(fā)

三、 繪圖

有了坐標(biāo)轉(zhuǎn)換類Coordinator,就可以用經(jīng)緯度數(shù)據(jù)來繪圖了,如拿到某省的行政邊界經(jīng)緯度坐標(biāo)數(shù)據(jù),就可以將經(jīng)緯度數(shù)據(jù)轉(zhuǎn)換為屏幕坐標(biāo),然后用Graphics的方法來畫出來了,Graphics對象又從哪里來呢?可以從一個Image對象創(chuàng)建,也可以從一個控件的Paint事件中取得,總之,有了坐標(biāo),發(fā)揮你的想象力,自己畫吧。

在氣象數(shù)據(jù)分析中,除了要繪制點(diǎn)、線、面、文字、柵格外,還需要繪制一些特殊符號,如風(fēng)、天氣現(xiàn)象、云等。這些符號,可以用圖片、天氣字庫、符號庫來實(shí)現(xiàn),圖片方式實(shí)現(xiàn)簡單,色彩豐富,但縮放效果不好;字庫方式,需要安裝字庫,程序部署比較麻煩;符號庫方式代碼編寫較麻煩。FreeMicaps的天氣現(xiàn)象符號采用符號庫方式,祥見: http://blog.csdn.net/HZGJF/archive/2009/05/27/4220508.aspx

風(fēng)符號和云量符號采用計(jì)算坐標(biāo)繪制方式。

為了使用方便,F(xiàn)reeMicaps把符號繪制功能封裝到三個符號類中,以靜態(tài)方法提供。

?GIS地圖開發(fā)

.NET的繪圖是對GDI+的封裝,包括了對點(diǎn)、線、面等各種圖形元素的封裝,圖形圖像的繪制、坐標(biāo)旋轉(zhuǎn),各種反走樣和平滑等功能,功能十分強(qiáng)大(當(dāng)然,效率不太高),利用它可以繪出漂亮的圖形。

根據(jù)OGC標(biāo)準(zhǔn),GIS系統(tǒng)首先需要對地圖元素進(jìn)行抽象和封裝,但FreeMicaps中,經(jīng)再三考慮,放棄了這種方式,一個是因?yàn)楣ぷ髁勘容^大,另一個是因?yàn)槲也桓冶WC能很好地進(jìn)行封裝,可能給插件開發(fā)帶來麻煩,不如把繪圖權(quán)完全交給圖層,大家自由發(fā)揮。

四、 圖層

為了使繪圖過程便于管理,可將繪圖過程分為組,如可以將一張地圖的繪制分為:繪制世界地圖、繪制中國地圖、繪制河流、填地名幾個過程,每次繪圖好像就是在一張玻璃上繪制,疊加起來就形成了一張地圖圖,這里把每次繪圖過程形象地稱為一個圖層。地圖分層后,圖層可以增刪,每個圖層可以單獨(dú)進(jìn)行隱藏、設(shè)置屬性等,更重要的是可以將利用面向?qū)ο蠹夹g(shù)把每個圖層當(dāng)做一個對象進(jìn)行管理。詳細(xì)介紹見:http://blog.csdn.net/HZGJF/archive/2008/10/03/3014558.aspx

對圖層進(jìn)行抽象,它應(yīng)該有一個圖層繪制方法(Render),一個圖層標(biāo)題(LayerName),一個用于表示數(shù)據(jù)源的字符串(DataSource),一個用于表示繪圖樣式的設(shè)置的LayerStyle,加上一些輔助方法屬性,最終形成如下抽象圖層類(CustomLayer),各種圖層均從它繼承:

?GIS地圖開發(fā)

FreeMicaps中,每種數(shù)據(jù)對應(yīng)一種圖層類,為了使圖層類編寫方便,使用了設(shè)計(jì)模式中的模板方法,定義繪制流程,主程序在調(diào)用圖層的Render()方法時,會自動判斷是否已經(jīng)讀入數(shù)據(jù),根據(jù)需要讀數(shù)據(jù)繪圖。

對于一種類型數(shù)據(jù),需要從CustomLayer繼承新建一個圖層類。各種類型數(shù)據(jù)圖層的工作方式完全一樣,僅在數(shù)據(jù)讀取和繪制方面不同,所以,寫新圖層類時,僅需實(shí)現(xiàn)DoLoad()和DoRender()兩個抽象方法,完成讀取數(shù)據(jù)和繪制圖層代碼即可。FreeMicaps里使用了字符串作為數(shù)據(jù)源標(biāo)識,通用GIS系統(tǒng)對數(shù)據(jù)源進(jìn)行了抽象,我也嘗試這么做,但代碼過于復(fù)雜,增加圖層開發(fā)難度,最終增大插件開發(fā)難度,所以放棄了。

前面說了,一張地圖有多個圖層,所以還需要將圖層放入一個列表,繪制地圖時遍歷圖層,調(diào)用每個圖層的Render()方法,畫出一張完整的地圖。對于圖層列表,大家馬上會想到使用List類,但圖層繪制是需要有順序的,如在衛(wèi)星云圖上面疊加地名,需要先畫衛(wèi)星云圖,再填地名,否則云圖會把地名蓋住,所以在圖層的樣式(LayerStyle)中放了一個ZOrder屬性,通過它來控制圖層順序。但由于List本身的排序方法是一種“非穩(wěn)固排序”,也就是說當(dāng)兩個圖層的ZOrder相等時,它們的順序是不確定的,為了避免這個問題,F(xiàn)reeMicaps從CollectionBase繼承了一個類LayerList,實(shí)現(xiàn)對圖層的管理,并實(shí)現(xiàn)了IXmlSerializable接口,完成圖層序列化功能。另外,還增加了添加圖層、刪除圖層事件。LayerList類如下:

FreeMicaps中,每種數(shù)據(jù)對應(yīng)一種圖層類,為了使圖層類編寫方便,使用了設(shè)計(jì)模式中的模板方法,定義繪制流程,主程序在調(diào)用圖層的Render()方法時,會自動判斷是否已經(jīng)讀入數(shù)據(jù),根據(jù)需要讀數(shù)據(jù)繪圖。

對于一種類型數(shù)據(jù),需要從CustomLayer繼承新建一個圖層類。各種類型數(shù)據(jù)圖層的工作方式完全一樣,僅在數(shù)據(jù)讀取和繪制方面不同,所以,寫新圖層類時,僅需實(shí)現(xiàn)DoLoad()和DoRender()兩個抽象方法,完成讀取數(shù)據(jù)和繪制圖層代碼即可。FreeMicaps里使用了字符串作為數(shù)據(jù)源標(biāo)識,通用GIS系統(tǒng)對數(shù)據(jù)源進(jìn)行了抽象,我也嘗試這么做,但代碼過于復(fù)雜,增加圖層開發(fā)難度,最終增大插件開發(fā)難度,所以放棄了。

前面說了,一張地圖有多個圖層,所以還需要將圖層放入一個列表,繪制地圖時遍歷圖層,調(diào)用每個圖層的Render()方法,畫出一張完整的地圖。對于圖層列表,大家馬上會想到使用List類,但圖層繪制是需要有順序的,如在衛(wèi)星云圖上面疊加地名,需要先畫衛(wèi)星云圖,再填地名,否則云圖會把地名蓋住,所以在圖層的樣式(LayerStyle)中放了一個ZOrder屬性,通過它來控制圖層順序。但由于List本身的排序方法是一種“非穩(wěn)固排序”,也就是說當(dāng)兩個圖層的ZOrder相等時,它們的順序是不確定的,為了避免這個問題,F(xiàn)reeMicaps從CollectionBase繼承了一個類LayerList,實(shí)現(xiàn)對圖層的管理,并實(shí)現(xiàn)了IXmlSerializable接口,完成圖層序列化功能。另外,還增加了添加圖層、刪除圖層事件。?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

( 發(fā)表人:彭菁 )

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?
      主站蜘蛛池模板: japanese色系国产在线高清| 国产午夜大片| 天堂网在线www最新版在线| 天天做人人爱夜夜爽2020| 天天噜噜噜| 日韩爽片| 精品伊人久久大香线蕉网站| 国产亚洲综合色就色| 成年人的毛片| 狠狠操夜夜爽| 国产色综合天天综合网| 4399一级成人毛片| 亚洲精品二区中文字幕| 伊人久久综合成人亚洲| 四虎影院的网址| 欧美色p| 国产成人mv在线观看入口视频| www我要色综合com| 热99re久久精品2久久久| 91精品福利视频| 欧美极品色影院| 天堂新版www中文| 精品三级在线| 午夜视频在线| va国产| 高清一区二区三区视频| 日毛片| 国产黄色高清视频| 手机看片日韩福利| 好骚综合在线| 亚洲黄色小视频| 美女黄18| 天天射天天做| xxxxxhd69日本护士| 亚洲伊人久久在| 美国色天使| 亚洲天天做日日做天天欢毛片| 国产成+人+综合+亚洲欧美丁香花| 亚洲精品成人网| 三级视频网站| 97久久综合九色综合|