DEM數(shù)據(jù)文件的讀取和保存_第1頁(yè)
DEM數(shù)據(jù)文件的讀取和保存_第2頁(yè)
DEM數(shù)據(jù)文件的讀取和保存_第3頁(yè)
DEM數(shù)據(jù)文件的讀取和保存_第4頁(yè)
DEM數(shù)據(jù)文件的讀取和保存_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、dem數(shù)據(jù)文件的讀取和保存引言在上一篇文章中建立了opengl應(yīng)用程序框架,為場(chǎng)景的繪制提供了環(huán)境支持。要繪制某一區(qū)域場(chǎng)地的場(chǎng)景自然需要通過(guò)對(duì)該區(qū)域各點(diǎn)坐標(biāo)數(shù)據(jù)的建模來(lái)實(shí)現(xiàn)。由于這些點(diǎn)的坐標(biāo)取值描述了該區(qū)域的基本地貌特征,因此建模后的場(chǎng)景能夠無(wú)失真的再現(xiàn)該區(qū)域從而達(dá)到仿真的目的。但是在實(shí)際操作時(shí)不可能取該區(qū)域的全部點(diǎn)進(jìn)行建模,無(wú)論是數(shù)據(jù)量還是運(yùn)算速度都是不允許的。一般的做法是進(jìn)行網(wǎng)格抽取,可以在該區(qū)域縱橫方向各每隔1米、10米、100米或是1千米取一個(gè)點(diǎn),以這些點(diǎn)的坐標(biāo)值來(lái)模擬真實(shí)場(chǎng)景,網(wǎng)絡(luò)抽取間隔應(yīng)以抽取后的網(wǎng)格足夠描述原區(qū)域地貌特征為準(zhǔn)。由于網(wǎng)格間隔固定,因此網(wǎng)格的平面坐標(biāo)能夠很容易的推算

2、出來(lái)而無(wú)須記錄,真正有價(jià)值的是各點(diǎn)的高程數(shù)據(jù),這種由高程數(shù)據(jù)組成的均勻間隔網(wǎng)格模型在gis中通稱為數(shù)字高程模型(dem)。本文將就dem數(shù)據(jù)的讀取和生成進(jìn)行重點(diǎn)介紹。dem數(shù)據(jù)結(jié)構(gòu)的定義dem數(shù)據(jù)并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)格式,常用的標(biāo)準(zhǔn)有美國(guó)地理dem數(shù)據(jù)標(biāo)準(zhǔn)和日本dem數(shù)據(jù)標(biāo)準(zhǔn)等多種,這類dem數(shù)據(jù)定義的信息較多,而這里只使用了高程數(shù)據(jù),如果使用上述格式標(biāo)準(zhǔn)則信息利用率太低。因此,這里將建立自己的dem數(shù)據(jù)格式,并以此來(lái)存儲(chǔ)某一區(qū)域的地景特征數(shù)據(jù)。如果要滿足在引言中提到的dem數(shù)據(jù)定義標(biāo)準(zhǔn),至少需要定義網(wǎng)格的長(zhǎng)、寬節(jié)點(diǎn)數(shù)、網(wǎng)格間隔以及各節(jié)點(diǎn)的高程數(shù)據(jù)。其中,各節(jié)點(diǎn)的高程數(shù)據(jù)以整型點(diǎn)陣數(shù)據(jù)方式存儲(chǔ)記錄

3、,其余各參數(shù)可以作為文件頭進(jìn)行定義。由此可以定義數(shù)據(jù)結(jié)構(gòu)demfileheader來(lái)描述dem文件頭,該文件頭除了定義上述幾個(gè)必須字段外,還定義了一些保留字段以備將來(lái)擴(kuò)展使用:typedef struct tagdemfileheader / 定義dem數(shù)據(jù)的頭文件格式int map6; / 保留int idemy; / dem格網(wǎng)y方向上的點(diǎn)數(shù)int idemx; / dem格網(wǎng)x方向上的點(diǎn)數(shù)float sx; / x方向縮放系數(shù)float sy; / y方向縮放系數(shù)float interval; / dem格網(wǎng)點(diǎn)的采樣間隔 demfileheader;dem數(shù)據(jù)文件的生成dem數(shù)據(jù)文件的生

4、成主要包括兩部分:文件頭的生成和網(wǎng)格數(shù)據(jù)的生成。如果數(shù)據(jù)量不大,可以用手工填表的方式將采集到的網(wǎng)格化高程數(shù)據(jù)寫入到dem數(shù)據(jù)文件。但在實(shí)際使用時(shí),數(shù)據(jù)量往往是比較巨大的。應(yīng)當(dāng)采取某種自動(dòng)化處理措施使其實(shí)用化。這里采取從位圖導(dǎo)入高程數(shù)據(jù)的方式,通過(guò)前期處理將通過(guò)衛(wèi)星遙感手段得到的某一地區(qū)的高程數(shù)據(jù)作為圖象顏色值而以位圖的形式給出,這樣一來(lái),只需要讀取該位圖信息,圖象的寬度和高度就是dem文件的x方向和y方向的網(wǎng)格節(jié)點(diǎn)數(shù),圖象顏色值為高程數(shù)據(jù),用戶只需手工輸入根據(jù)比例換算而來(lái)的網(wǎng)格間隔即可。下面這段代碼是實(shí)現(xiàn)這部分功能的主要代碼:demheader.idemx = set.m_nxpoint; /

5、 填充文件頭 demheader.idemy = set.m_nypoint;demherval = set.m_ninterval;/ 選擇待生成的dem文件cfiledialog filedlg(false, *.dem, *.dem, ofn_hidereadonly | ofn_overwriteprompt, 地形數(shù)據(jù)文件(*.dem)|*.dem|, null);if (filedlg.domodal() = idok) / 申請(qǐng)dem數(shù)據(jù)緩沖區(qū)int* pdata = new intset.m_nwidthbytes * set.m_nypoint + 100;

6、if (set.m_buserandom = false) byte r, g, b; / 24位圖象將真彩數(shù)據(jù)轉(zhuǎn)換為灰度數(shù)據(jù)保存for (int i = 0; i set.m_nypoint; i+) for (int j = 0; j set.m_nxpoint; j+) b = set.m_pdatai * set.m_nwidthbytes + j * 3;g = set.m_pdatai * set.m_nwidthbytes + j * 3 + 1;r = set.m_pdatai * set.m_nwidthbytes + j * 3 + 2;pdatai * demheader

7、.idemx + j = (int)(9798.0f * r + 19235.0f * g + 3735.0f * b) / 32768.0f);elsefor (int i = 0; i set.m_nxpoint * set.m_nypoint; i+) / 用隨機(jī)數(shù)填充dem數(shù)據(jù)pdatai = (int)(rand() % set.m_nlimit);cfile file; / 保存dem數(shù)據(jù)到文件file.open(filedlg.getpathname(), cfile:modecreate | cfile:modereadwrite);if (pdata != null) fil

8、e.write(lpstr)&demheader, sizeof(demheader);file.writehuge(lpstr)pdata, demheader.idemx * demheader.idemy * sizeof(int);file.close();delete pdata;其中, set.m_nxpoint、set.m_nypoint和set.m_ninterval分別為從圖象獲取得到的網(wǎng)格節(jié)點(diǎn)數(shù)和用戶輸入的網(wǎng)格間隔。這幾個(gè)參數(shù)填充到demfileheader 結(jié)構(gòu)對(duì)象demheader中后將作為dem文件頭保存到新創(chuàng)建的dem數(shù)據(jù)。set.m_pdata指向的緩沖區(qū)保存有以

9、rgb顏色值方式給出的各節(jié)點(diǎn)高程數(shù)據(jù),經(jīng)過(guò)換算后保存到dem數(shù)據(jù)文件既然已經(jīng)清楚dem數(shù)據(jù)文件的存儲(chǔ)格式,數(shù)據(jù)的讀取就不是一件困難的事情了。下面先給出執(zhí)行函數(shù)readdem(cstring sdemfile)的實(shí)現(xiàn)過(guò)程:cfile file(sdemfile, cfile:moderead); / 打開文件 dword length = file.getlength(); / 得到文件長(zhǎng)度if (file.read(lpstr)&demheader, sizeof(demfileheader) != sizeof(demfileheader) / 讀入dem頭文件messagebox(文件頭信

10、息錯(cuò)誤!,提示信息);return false;m_ndemx = demheader.idemx; / 從文件頭中取數(shù)據(jù)m_ndemy = demheader.idemy;m_ninterval = (int)demherval; / 網(wǎng)絡(luò)間隔m_pdemx = new int(m_ndemx + 1) * (m_ndemy + 1); / x坐標(biāo)m_pdemy = new int(m_ndemx + 1) * (m_ndemy + 1); / y坐標(biāo)m_pdemh = new intlength - sizeof(demfileheader); / z坐標(biāo)m_nhsize

11、 = length - sizeof(demfileheader);m_nsumpointofdem = m_ndemx * m_ndemy; / 網(wǎng)格總點(diǎn)數(shù)int m_nsumfaceofdem = 2 * (m_ndemx - 1) * (m_ndemy - 1); / 網(wǎng)格總面數(shù)file.readhuge(m_pdemh, length - sizeof(demfileheader); / 讀取數(shù)據(jù)file.close(); / 關(guān)閉文件至此,已經(jīng)取出dem文件頭信息和高程點(diǎn)陣數(shù)據(jù)。這只是原始信息,為了能夠在后面將要進(jìn)行的場(chǎng)景繪制中以此來(lái)建模,還要標(biāo)定格網(wǎng)點(diǎn)的x、y坐標(biāo)并將坐標(biāo)原點(diǎn)移動(dòng)到

12、地形的中心:for (int i = 0; i m_ndemy; i+) for (int j = 0; j m_ndemx; j+) m_pdemxm_ndemx * i + j = m_ninterval * j - (m_ndemx / 2) * m_ninterval;m_pdemym_ndemx * i + j = m_ninterval * i - (m_ndemy / 2) * m_ninterval;至此,已經(jīng)從dem文件恢復(fù)出各節(jié)點(diǎn)的坐標(biāo)參數(shù)(x,y,z坐標(biāo)數(shù)據(jù)分別存放在m_pdemx、m_pdemy和m_pdemh指向的緩沖區(qū)中)。如果需要將當(dāng)前正在顯示的地景仿真數(shù)據(jù)保存,只需簡(jiǎn)單的將demfileheader 結(jié)構(gòu)對(duì)象demheader中的數(shù)據(jù)保存到dem文件頭、將整型數(shù)組m_pdemh中的數(shù)據(jù)保存到dem文件高程點(diǎn)陣即可:cfile file(m_sdemfile, cfile:modereadwrite); / 保存文件 file.write(lpstr)&demheader, sizeof(demheader);file.writehuge(lpstr)m_pdemh, demheader.idemx * d

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論