簡單分布式空間數(shù)據(jù)庫引擎的實現(xiàn)分析研究 計算機科學(xué)與技術(shù)專業(yè)_第1頁
簡單分布式空間數(shù)據(jù)庫引擎的實現(xiàn)分析研究 計算機科學(xué)與技術(shù)專業(yè)_第2頁
簡單分布式空間數(shù)據(jù)庫引擎的實現(xiàn)分析研究 計算機科學(xué)與技術(shù)專業(yè)_第3頁
簡單分布式空間數(shù)據(jù)庫引擎的實現(xiàn)分析研究 計算機科學(xué)與技術(shù)專業(yè)_第4頁
簡單分布式空間數(shù)據(jù)庫引擎的實現(xiàn)分析研究 計算機科學(xué)與技術(shù)專業(yè)_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

簡單分布式空間數(shù)據(jù)庫引擎的實現(xiàn)目前已有的空間數(shù)據(jù)庫引擎復(fù)雜的系統(tǒng)結(jié)構(gòu)和高昂的價格,完全無法滿足小型數(shù)據(jù)的處理,因此為了適應(yīng)中小型軟件的研發(fā),我們設(shè)計了主要用于柵格數(shù)據(jù)和矢量數(shù)據(jù)的簡單分布式空間數(shù)據(jù)庫引擎(SimpleDistributedSpatialDatabaseEngine,SD_SDE),它不僅縮小了數(shù)據(jù)處理的空間,還簡化了系統(tǒng)的結(jié)構(gòu),從空間數(shù)據(jù)分散的特性出發(fā),在保證數(shù)據(jù)安全性的同時大大提升了數(shù)據(jù)處理的效率,常用于多層次的GIS。首先,我們將具體介紹簡單分布式空間數(shù)據(jù)庫引擎的主要功能:數(shù)據(jù)的存儲和提取通信接口空間數(shù)據(jù)信息的查詢分布式管理數(shù)據(jù)存取實現(xiàn)數(shù)據(jù)的存取作為該系統(tǒng)的最主要的功能,包括模型和結(jié)構(gòu)的存取兩個方面。作為支持數(shù)據(jù)庫引擎的重要支柱,我們將以第三章3.2節(jié)中所設(shè)計的空間數(shù)據(jù)模型為例,在數(shù)據(jù)庫的選擇上使用SQLServer2000和Oracle,對數(shù)據(jù)的存取操作進行具體的論述。數(shù)據(jù)在存儲時主要是通過表格的形式對信息進行記錄。SD_SDE存儲結(jié)構(gòu)柵格數(shù)據(jù)存儲結(jié)構(gòu)如何對SD_SDE的柵格數(shù)據(jù)進行存儲,首先我們需要了解柵格數(shù)據(jù)的存儲結(jié)構(gòu)。由于存儲的方式是表格的形式,因此存儲結(jié)構(gòu)中一般有七張表格,分別是:柵格影像集表(rasterset)管理表(raster_admin)柵格影像數(shù)據(jù)塊表(rasterblock)柵格影像圖層表(rasterband)金字塔表(raster_pyramid)壓縮表(rasterencode)柵格元數(shù)據(jù)表(rastermetadata)當(dāng)需要將圖像數(shù)據(jù)進行存儲時,一般流程是先在柵格影像集表中新增一個影響數(shù)據(jù)的記錄,然后在其他六個表中也增加記錄。下面我們對存儲結(jié)構(gòu)中的七個表進行具體的解釋說明:(1)柵格影像集表:當(dāng)有新的影像數(shù)據(jù)被存儲,柵格影像集表會對該數(shù)據(jù)編號,即ID(raster_id),ID中不僅有數(shù)據(jù)存儲時間、擁有者等數(shù)據(jù)的各種信息,還能夠作為橋梁,將其他表中的記錄連接起來。用戶擁有對數(shù)據(jù)信息中的金字塔最高層級值和數(shù)據(jù)塊的大小值自定義的權(quán)限。(2)管理表:數(shù)據(jù)通過ID與管理表實現(xiàn)信息的連接共享,因此當(dāng)用戶對數(shù)據(jù)庫進行檢索是,管理表會提供所有影像數(shù)據(jù)的各種詳細的信息。(3)柵格影像數(shù)據(jù)塊表:通過影像塊來對數(shù)據(jù)進行存儲,每個影像塊都記錄了影響塊的方位、大小等信息。(4)柵格影像圖層表:根據(jù)波段對影像數(shù)據(jù)進行分層,然后將每個圖層的具體信息記錄在表上。圖層往往由圖層塊組成,每個圖層塊都記錄了影響的數(shù)據(jù)信息,為了方便記錄,規(guī)定0表示影像塊數(shù)據(jù),1表示圖層塊數(shù)據(jù)。(5)金字塔表:可以根據(jù)用戶查詢的條件有針對性的提取數(shù)據(jù),不僅減少了工作量還能夠提高系統(tǒng)的運行速度。金字塔表中記錄的主要是金字塔每塊的坐標(biāo)、層級等信息,數(shù)據(jù)主要存儲在金字塔塊中。(6)壓縮表:主要用于記錄數(shù)據(jù)的大小方位等信息,通過對大量的數(shù)據(jù)進行壓縮,節(jié)約了空間,大大提高了數(shù)據(jù)的傳輸速度,當(dāng)用戶需要提取數(shù)據(jù)信息時,壓縮表會自動解壓還原數(shù)據(jù)。(7)柵格元數(shù)據(jù)表:主要用于記錄影像的尺寸分辨率等基本信息。如圖是柵格影像集表raster_set字段名類型描述raster_idint柵格影像idnamechar柵格影像名稱datedatatime入庫時間ownerchar所有者pyramidint金字塔最高級別blockheightdouble影像數(shù)據(jù)塊的高度blockwidthdouble影像數(shù)據(jù)塊的寬度descriptionvarchar備注表4-2管理表raster_admin字段名類型描述admin_idint標(biāo)示IDraster_idint柵格影像idnamechar柵格影像名稱descriptionvarchar備注表4-3柵格影像數(shù)據(jù)塊表raster_block字段名類型描述block_idint影像數(shù)據(jù)塊號xlcornerdouble影像數(shù)據(jù)塊左下角坐標(biāo)xylcornerdouble影像數(shù)據(jù)塊左下角坐標(biāo)yblockrowint影像數(shù)據(jù)塊所在行號blockcolint影像數(shù)據(jù)塊所在列號blockdataimage影像數(shù)據(jù)塊存儲數(shù)據(jù)raster_idint柵格影像id表4-4柵格影像圖層表raster_band字段名類型描述level_idint影像圖層idraster_idint柵格影像idcellsizedouble柵格影像分辨率level_widthdouble圖層寬度level_heightdouble圖層高度descriptionvarchar分辨率備注表4-5金字塔表raster_pyramid字段名類型描述pyramid_idint金字塔數(shù)據(jù)塊塊號pxlcornerdouble左下角坐標(biāo)xpylcornerdouble左下角坐標(biāo)ypbrowint金字塔數(shù)據(jù)塊所在行號pbcolint金字塔數(shù)據(jù)塊所在列號plevelint圖層金字塔等級pblockdataimage金字塔數(shù)據(jù)塊存儲數(shù)據(jù)raster_idint柵格影像id表4-6壓縮表raster_encode字段名類型描述pyramid_idint數(shù)據(jù)塊塊號pxlcornerdouble左下角坐標(biāo)xpylcornerdouble左下角坐標(biāo)ypbrowint數(shù)據(jù)塊所在行號pbcolint數(shù)據(jù)塊所在列號cellsizedouble分辨率pblockdataimage數(shù)據(jù)塊存儲數(shù)據(jù)raster_idint柵格影像id表4-7柵格元數(shù)據(jù)表raster_metadata字段名類型描述meta_idint標(biāo)示IDraster_idint柵格影像idimagewidthdouble柵格影像寬度imageheightdouble柵格影像高度imagetypeint柵格影像數(shù)據(jù)格式(如0代表遙感影像等)cellsizedouble柵格影像分辨率fillsizedouble文件大小descriptionvarchar備注下面描述的是各存儲表之間的關(guān)系,如圖4-1所示:圖4-1柵格數(shù)據(jù)存儲表結(jié)構(gòu)體系矢量數(shù)據(jù)存儲結(jié)構(gòu)矢量數(shù)據(jù)的存儲與柵格數(shù)據(jù)的存儲基本相似,不同之處在于,矢量數(shù)據(jù)主要的儲存對象主要有兩種:幾何數(shù)據(jù):在于數(shù)據(jù)的模型進行分析研究后,對空間的數(shù)據(jù)進行劃分,最后儲存在表中的形式是大字段。屬性數(shù)據(jù):不需要轉(zhuǎn)換或壓縮,直接存儲。矢量數(shù)據(jù)結(jié)構(gòu)中存儲的表主要有四種:矢量數(shù)據(jù)集表(vector_set)管理表(vector_admin)要素表(vector_part)屬性表(vector_attribute)這四種數(shù)據(jù)表的相互配合,共同管理數(shù)據(jù)的存儲。下面具體介紹四個數(shù)據(jù)表的主要結(jié)構(gòu):表4-8矢量數(shù)據(jù)集表vector_set字段類型描述vector_idint矢量數(shù)據(jù)的標(biāo)示號vector_namechar矢量數(shù)據(jù)名稱vector_timedouble矢量數(shù)據(jù)入庫時間vector_ownerdouble矢量數(shù)據(jù)所有者descriptionvarchar其它備注信息表4-9管理表vector_admin字段名類型描述admin_idint字段標(biāo)示vector_namechar矢量數(shù)據(jù)名稱vector_idint矢量數(shù)據(jù)的標(biāo)示號descriptionvarchar其它備注信息表4-10要素表vector_part字段名類型描述part_idint字段標(biāo)示號part_typeint要素類型(0為點狀,1為現(xiàn)狀,2為面狀)Xmindouble要素X坐標(biāo)最小值Xmaxdouble要素X坐標(biāo)最大值Ymindouble要素Y坐標(biāo)最小值Ymaxdouble要素Y坐標(biāo)最大值part_dataimage要素的幾何信息vector_idint矢量數(shù)據(jù)的標(biāo)示號descriptionvarchar其它備注信息表4-7屬性表vector_attribute字段名類型描述attribute_idint字段標(biāo)示vector_sizeint矢量數(shù)據(jù)大小vector_idint矢量數(shù)據(jù)的標(biāo)示號descriptionvarchar其它備注信息矢量數(shù)據(jù)存儲結(jié)構(gòu)中各存儲表之間的關(guān)系如圖4-2所示:圖4-2矢量數(shù)據(jù)存儲表結(jié)構(gòu)體系SD_SDE存取接口當(dāng)用戶對不同的數(shù)據(jù)庫進行訪問時,都可以通過SD_SDE接口。本文以SQLServer2000和Oracle為例,用戶可以通過統(tǒng)一的接口直接進入進行數(shù)據(jù)訪問。SD_SDE常用的管理數(shù)據(jù)庫的工具為ADO(ActiveXDataObject)、SQL(StructuredQueryLanguage)等,實現(xiàn)數(shù)據(jù)庫的創(chuàng)建、連接等操作。例子中提供的接口是DLL中的ADO,在工程的stdafx.h文件中添加下面的編程語句:#pragmawarning(disable:4146)#import"C:\ProgramFiles\CommonFiles\System\ADO\msado15.d11"named_guidsrename("EOF","adoEOF"),rename("BOF","adoBOF")#pragmawarning(default:4146)SD_SDE還設(shè)定了一個處理用戶請求的統(tǒng)一接口ADOconn,常用的執(zhí)行語言是SQL語句。各種函數(shù)具有不同的作用:AfxOleInit()常用與以ADO作為對象的函數(shù)中,位置不同作用也就不同。用在前面可以用于函數(shù)初始化,用在最后作為結(jié)束,即中斷與數(shù)據(jù)庫的連接。(2)ExitConnect()表示釋放m_pConnection,(3)函數(shù)的環(huán)境是CoUninitialize()(4)CoInitialize(NULL)用于前端表示函數(shù)的初始化。,在本文中我們采用CoInitialize(NULL)進行初始化。圖4-3ADOconn類關(guān)系描述正如圖4-3中數(shù)據(jù)庫操作類的關(guān)系所示,在實現(xiàn)SD_SDE系統(tǒng)中主要的存取接口函數(shù)說明如下:(1)接口函數(shù)OnInitADOconn用來連接數(shù)據(jù)庫,并初始化ADO環(huán)境的。函數(shù)參數(shù)為用戶定義的數(shù)據(jù)庫用戶名,用戶密碼及數(shù)據(jù)庫類型(0為SQLServer數(shù)據(jù)庫,1為Oracle數(shù)據(jù)庫)。此函數(shù)提供了統(tǒng)一的數(shù)據(jù)庫連接接口,函數(shù)首先判斷用戶所要連接的數(shù)據(jù)庫類型,再調(diào)用ADO類的Open對數(shù)據(jù)庫進行透明連接。(2)接口函數(shù)GetRecordSet接口用于執(zhí)行有返回記錄集的SQL語句,返回類型是記錄集智能指針_RecordsetPtr。該函數(shù)首先創(chuàng)建記錄集對象,在ADO中函數(shù)產(chǎn)生記錄集對象,最后還要釋放記錄集指針。(3)接口函數(shù)ExecuteSQL用于沒有返回的SQL語句,例如create、delete、update等SQL語句。該函數(shù)主要的語句是調(diào)用Connection對象的Execute方法,用Execute函數(shù)執(zhí)行SQL語句。(4)接口函數(shù)OpenrasterFile讀取一幅遙感影像數(shù)據(jù)文件,記入內(nèi)存,返回該文件在內(nèi)存中的句柄,參數(shù)為影像文件名。此函數(shù)完成了從外存中的文件數(shù)據(jù)轉(zhuǎn)移到內(nèi)存中的功能。(5)函數(shù)Createtile負責(zé)把內(nèi)存中的影像文件按256X256分成影像數(shù)據(jù)塊,并把影像數(shù)據(jù)塊的左下角坐標(biāo)及影像數(shù)據(jù)塊的行列號賦值給變量xlcorner,ylcorner,xlc,ylr,在此函數(shù)中要調(diào)用inserttile函數(shù),負責(zé)把數(shù)據(jù)塊存入數(shù)據(jù)庫中。函數(shù)Createtile首先計算影像數(shù)據(jù)中塊的個數(shù)同時涉及不足的分塊問題,計算出橫向影像塊個數(shù)Xtilenum和縱向影像塊個數(shù)Ytilenum。在此函數(shù)中還涉及到tiles類數(shù)組,tiles類用于分塊的數(shù)據(jù)存儲,將影像文件中的數(shù)據(jù)拷入進相應(yīng)的分塊中。函數(shù)Createtile中調(diào)用了tiledatacopy函數(shù)獲得并生成一個分塊tile的象素值,其函數(shù)原型為:voidtilecdatacopy(HANDLEhFile,DWORDlodwidthpixnum,DWORDk,DWORDn,DWORDcurrownum,DWORD&currowpos,floatlbc,float1br,DWORDminr,DWORDmaxr,DWORDminc,DWORDmaxc);在tiledatacopy函數(shù)中,參數(shù)maxr,minr是表示該分塊需要從該影像文件中拷貝數(shù)據(jù)的列數(shù)范圍。tiledatacopy先將影像文件中的像素值數(shù)據(jù)分別拷入對應(yīng)的tile指針中。(6)接口函數(shù)Inserttile把tilefile所指的影像數(shù)據(jù)塊數(shù)據(jù)存入到數(shù)據(jù)表中,此函數(shù)中tilefile暫時不釋放,還用于壓縮函數(shù),用于構(gòu)建壓縮表。原型如下:voidInserttile(LPBYTEtilefile,floatxlcorner,floatylconer,intxlc,intylr);(7)函數(shù)Readtile_endcode中的傳遞參數(shù)為所需要影像數(shù)據(jù)塊的行列號,函數(shù)中調(diào)用數(shù)據(jù)庫訪問類中的SQL語句執(zhí)行函數(shù)GetRecordSet函數(shù)返回記錄集數(shù)據(jù),該函數(shù)把GetRecordSet函數(shù)返回的記錄集數(shù)據(jù)轉(zhuǎn)化為handle標(biāo)示的內(nèi)存數(shù)據(jù)提供給其它函數(shù)調(diào)用。首先得到數(shù)據(jù)的大小1DataSize,并把把圖像字段中的數(shù)據(jù)存入進varBLOB中,為全局變量分配必要的存儲空間,為了得到指針值,在此函數(shù)外釋放空間,復(fù)制數(shù)據(jù)到緩沖區(qū)m_pBuffer中。SD_SDE數(shù)據(jù)壓縮和金字塔模型影像數(shù)據(jù)存入數(shù)據(jù)庫時,SD_SDE還另把一份壓縮后的數(shù)據(jù)存入數(shù)據(jù)庫,壓縮數(shù)據(jù)可用在網(wǎng)絡(luò)傳輸中,提高傳輸?shù)乃俣?。本文采用JPEG2000壓縮算法,SD_SDE借助于CxImage類的成員函數(shù)Encode進行壓縮,該接口函數(shù)的原型為:Encode(buffer,size,image_type);該函數(shù)把image對象中的圖像以type類型數(shù)據(jù)壓縮并放到buffer緩沖區(qū)中。其中image_type設(shè)置為CXIMAGE_FORMAT_JP2,代表為JPEG2000格式。通過套接字接收道德數(shù)據(jù)進行解壓縮,調(diào)用的成員函數(shù)為Decode,該函數(shù)原型如下:Decode(buffer,size,image_type),參數(shù)意義和Encode相同。在SD_SDE中多分辨率金字塔模型實現(xiàn)的接口函數(shù)原型如下:voidtilepyramid(tiles&curtile,tiles&lastile,DWORD&curwidthpixnum,DWORD&lastwidthpixnum);其中第一個參數(shù)curdle表示第i級金字塔數(shù)據(jù),第二個參數(shù)lasttile表示第i-1級金字塔數(shù)據(jù),curwidthpixnum為當(dāng)前第i級金字塔的橫向像素寬度,lastwidthpixnum為第i-1級金字塔橫向像素寬度。函數(shù)主要實現(xiàn)算法如下:for(DWORDk=O;k<curtile.tileheight;k=k+1)//遍歷當(dāng)前第i級金字塔的所有行{for(DWORDm=O;m<curtile.tilewidth*3;m=m+3)//遍歷當(dāng)前第i級金字塔的所有列{rcolor=O;gcolor;bcolor=0;//把像素RGB值變量進行初始化賦值for(intn=O;n<levelsubnum*levelsubnum;n++){//遍歷用來重采樣的levelsubnum*levelsubnum個像素,本文SD_SDE中采用四分之一重采樣;rcolor=rcolor+lasttile.tilebit[(k*levelsubnum+n/levelsubnum)*lastwidthpixnum+m*levelsubnum+n*3];gcolor=gcolor+lasttile.tilebit[(k*levelsubnum+n/levelsubnum)*lastwidthpixnum+m*levelsubnum+n*3+1];bcolor=bcolor+lasttile.tilebit[(k*levelsubnum+n/levelsubnum)*lastwidthpixnum+m*levelsubnum+n*3+2];}//對求和后的rcolor,gcolor,bcolor進行求平均計算,并保存為當(dāng)前第i級金字塔的數(shù)據(jù)curdle.tilebit[k*curwidthpixnum+m]=(BYTE)(rcolor/(levelsubnum*levelsubnum));curdle.tilebit[k*curwidthpixnum+m+1]=(BYTE)(gcolor/(levelsubnum*levelsubnum));curdle.tilebit[k*curwidthpixnum+m+2]=(BYTE)(bcolor/(levelsubnum*levelsubnum));}}通信接口實現(xiàn)該系統(tǒng)能夠為服務(wù)器提供多種功能的服務(wù),最主要的是Socket通信服務(wù),即用戶與服務(wù)器之間的數(shù)據(jù)傳輸,包括數(shù)據(jù)包的傳輸?shù)取T诜?wù)器的連接方面,通過使用多線連接技術(shù),可以同時處理多個用戶的請求,傳輸數(shù)據(jù)。SD_SDE通信體系結(jié)構(gòu)SD_SDE體系的應(yīng)用服務(wù)端程序包含兩個進程:監(jiān)聽和服務(wù)。該體系使用了客戶端-服務(wù)器模式和多線程技術(shù),較為高端。其中監(jiān)聽進程主要是對來自客戶端和其他分布式服務(wù)節(jié)點的請求進行監(jiān)聽,并將監(jiān)聽到的各種請求傳送給服務(wù)進程。服務(wù)進程是監(jiān)聽進程的下游進程,它主要處理監(jiān)聽進程發(fā)送過來的請求,進程會自動分析請求的類型,按照客戶端請求和分布式參與節(jié)點請求的不同來分別處理。當(dāng)分析得出請求來自于客戶端時,進程會自動識別出用戶是否獲得授權(quán),當(dāng)識別完畢,進程將會將有效信息加以轉(zhuǎn)變,成為與關(guān)系型數(shù)據(jù)庫管理系統(tǒng)相符的語句,然后將這些處理過的請求傳送給下一環(huán)節(jié)——關(guān)系型數(shù)據(jù)庫管理系統(tǒng),進行二次轉(zhuǎn)變,將這些信息傳回客戶端程序,此時客戶端程序已經(jīng)可以處理之。倘或請求來自分布式參與階段,服務(wù)進程也有一個專門的線程來分析處理該類型請求,下圖4-4即是SD-SDE通信體系結(jié)構(gòu)圖:圖4-4通信體系結(jié)構(gòu)本文使用套接字Socket、RPC(RemoteProcedureCallProtocol,遠程過程調(diào)用協(xié)議)遠程過程調(diào)用思想來處理參與節(jié)點的通信。其主要程序為,參與節(jié)點獲得主服務(wù)器傳送的消息后,參與節(jié)點上的函數(shù)借口處理信息遂被主服務(wù)器調(diào)用,在該信息被有效處理后,參與節(jié)點將處理完的信息反向傳送給主服務(wù)器,該動作中使用應(yīng)答消息功能。想要獲得一致性的消息架構(gòu),其分布式空間數(shù)據(jù)庫引擎設(shè)置消息的結(jié)構(gòu)當(dāng)如下所示:structmessage_type{BYTEmessage_direction:l,//求情為0,應(yīng)答為1message一type:7,//消息類型BYTEsubmessage_type;//子消息的類型shortlength;//消息的長度;};結(jié)構(gòu)公示中的變量含義請參閱變量右邊解釋,所有變量都是在消息的傳送中確實使用的消息變量。下面展示圖4-5為SD_SDE的監(jiān)聽進程和服務(wù)進程服務(wù)流程:圖4-5進程服務(wù)流程圖SD_SDE通信接口類在SD_SDE數(shù)據(jù)通信體系中,想要實現(xiàn)客戶端與服務(wù)端、主服務(wù)節(jié)點和參與節(jié)點兩個關(guān)系之間的分布式通信,將消息機制及Scoket技術(shù)有效運用于服務(wù)進程中是最佳選擇。使用work線程方式處理能夠使得服務(wù)進程可暫緩當(dāng)前操作,轉(zhuǎn)而處理其他信息,為操作留下緩沖時間,仿版接下來的異步傳輸。各線程間的通信技術(shù)需要共享全局變量、消息等機制為其服務(wù)來實現(xiàn),此類機制能夠很快捷方便地搭建線程之間的聯(lián)系。在通信體系中,類是組成體系的主要部分,在客戶端和服務(wù)端之間設(shè)置的類與Socket相互聯(lián)系作用,共同搭建通信體系結(jié)構(gòu)。下圖4-6為通信體系中服務(wù)通信類在服務(wù)端和客戶端之間搭建的關(guān)系圖。從圖中我們可看見,基礎(chǔ)服務(wù)類CBaseServer主導(dǎo)操作,通過函數(shù)來處理數(shù)據(jù)和其他基礎(chǔ)命令。其下屬為CServiceprocess,該部分主要掌管客戶端彼此之間的操作。而負責(zé)消息結(jié)構(gòu)的則是CMessage,它屬于消息基類。CNode則是處理SocketAPI和CMessage類與CServiceprocess間交互的節(jié)點類。CBaseSocket類和CListenprocess都是封裝了基礎(chǔ)的SocketAPI函數(shù)操作,它們之間的關(guān)系是承上啟下。CClient類中包含客戶的用戶名和密碼等信息,屬于客戶類,該類主要通過CListenprocess類與CServiceprocess之間的交互實現(xiàn)其功能,驗證密碼即是一項主要功能。圖4-6通信體系類圖SD_SDE異步傳輸及緩沖區(qū)設(shè)計在本文中提到的異步傳輸方式建立在socket的傳輸平臺上,具體說來有兩個辦法實現(xiàn)這種網(wǎng)絡(luò)傳送,首先,可以建立一套多方式多路線的技術(shù)平臺,在這種境況下,即使數(shù)據(jù)傳送的通道發(fā)生堵塞,也不會阻礙其他主要的通道。在這種方式中用戶永遠處在主動地位。其次,在socket基礎(chǔ)上可以采用非堵塞的網(wǎng)絡(luò)傳輸技術(shù)。具體關(guān)于異步傳輸?shù)南嚓P(guān)設(shè)計方法可以參照第三章第六節(jié)的設(shè)計,流程圖如3-9所示。SD_SDE中異步緩沖區(qū)的結(jié)構(gòu)設(shè)置為:structcache_struct{FILE*pfile;//所對應(yīng)的文件char*phead_cache;//指向緩沖區(qū)首部intposinfile;//緩沖區(qū)頭部在相應(yīng)文件中的位置intposmove;//緩沖區(qū)的偏移量intfpos;//緩沖區(qū)中的第一次修改位置intlpos;//緩沖區(qū)中的最后修改位置intdatalen;//緩沖區(qū)中的數(shù)據(jù)長度intavail_data;//是否有數(shù)據(jù)可供讀寫,0為沒有,1為有數(shù)據(jù)inttake_data;//緩沖區(qū)中的數(shù)據(jù)是否已經(jīng)被取走,0為沒有,1為已取走inttake_datay2;//緩沖區(qū)中數(shù)據(jù)是否已被數(shù)據(jù)庫副本取走,0為未被副本主數(shù)據(jù)庫副本取走,1為已被主數(shù)據(jù)庫副本取走intsumdata;//緩沖區(qū)中可供讀寫的數(shù)據(jù)總量intsequence_data;//緩沖區(qū)的序號,主要是保證讀入或?qū)懭氲捻樞騷;空間索引實現(xiàn)空間索引在本文中主要根據(jù)數(shù)據(jù)的類型不同而劃分,柵格類型的數(shù)據(jù)使用改進型的網(wǎng)格式檢索,而矢量數(shù)據(jù)則以混合式檢索為主。索引數(shù)據(jù)表設(shè)計與實現(xiàn)柵格數(shù)據(jù)索引表設(shè)計正如前文所說,對于柵格類型的數(shù)據(jù)采用網(wǎng)格式檢索方式,在改進的這套方法中,數(shù)據(jù)所表達的地理信息,地物特征均以表格的形式存儲。改進后的網(wǎng)格式檢索將內(nèi)容分為三個層次,每一層又進一步分為網(wǎng)格信息,地物信息兩類。網(wǎng)格的矩陣形式與地物信息的矩陣形式在位置上一一對應(yīng)。第一層中的地物信息的網(wǎng)格分布被記錄在第二層,每個矩陣也與第一層一一對應(yīng),同理,第三層只記錄網(wǎng)格信息。根據(jù)下圖可更好的理解。第一層網(wǎng)格信息表如表4-12所示,第二、三層網(wǎng)格信息表如表4-14所示,三層索引結(jié)構(gòu)的地物信息表相同,如表4-13所示。表4-12網(wǎng)格索引第一層中網(wǎng)格信息表表4-13網(wǎng)格索引第一層中地物信息表表4-14網(wǎng)格索引第二層網(wǎng)格信息表矢量數(shù)據(jù)索引表設(shè)計在對矢量數(shù)據(jù)進行處理的時候,計算機先進行網(wǎng)格索引然后根據(jù)結(jié)果對數(shù)據(jù)進行劃分,生成如4-15所示的數(shù)據(jù)表。表中記錄了若干個子索引區(qū),接著對每個子索引區(qū)進行R樹索引,具體的結(jié)構(gòu)如表4-16和表4-17所示。表4-15混合索引中網(wǎng)格信息表表4-16混合索引中管理表表4-17混合索引中R-tree信息表索引接口類一下介紹如何在索引接口中進行分類。首先設(shè)置一個基本索引即Base_index和點線面三個子索引Point_index,Line_index,和Area_index,三者分別承接基本索引Base_index。在基本索引下家里三種操作函數(shù),分別表示插入,刪除,修改。數(shù)值類型均為整數(shù)型,我們規(guī)定屬性包括地物名稱和類型兩類。其中數(shù)字0表示點類,1表示線類,2表示面類。具體如下圖所示。圖4-7索引分析類圖索引數(shù)據(jù)緩沖我們知道網(wǎng)格索引是將信息分成a*b的塊狀。因此,a,b的數(shù)值大小決定了分塊的數(shù)目,當(dāng)a.b很大時,索引表的數(shù)量會集聚增加。因此,要確定恰當(dāng)?shù)腶,b值。但是在實際操作上,這是極其困難的。特別是在柵格遙感圖像的網(wǎng)格內(nèi)還要分出三層,這占據(jù)了更多的存儲空間,大大降低了檢索的效率。因此為了解決這個問題,我們考慮建立一套異步緩沖機制。根據(jù)第三章第六節(jié)提供的信息,我們對異步緩沖加以改進,以期能夠適應(yīng)大數(shù)值的索引表。具體操作為,當(dāng)檢索到某一段信息時,系統(tǒng)將該段信息的前后相關(guān)的記錄提前讀入內(nèi)存,下次訪問時即可大大提高讀取速度。索引數(shù)據(jù)結(jié)構(gòu)改進型網(wǎng)格索引中網(wǎng)格的結(jié)構(gòu)實現(xiàn)如下:structbuck_index{intblock_id;//網(wǎng)格的標(biāo)示IDintbuck_id;//網(wǎng)格號intxlc;//網(wǎng)格所在行號intylr;//網(wǎng)格所在列號boolsth;//網(wǎng)格內(nèi)是否有地物,0表示沒有地物,1表示有地物char*sthname;//地物名字intsthid;//地物標(biāo)示intlevel;//層次};structGridHead{longGridNum;//網(wǎng)格編號introw;//網(wǎng)格的行號intcolumn;//網(wǎng)格的列號intScaleNum;//網(wǎng)格所記錄的比例尺boolFlag;//是否被檢索intlastlevel;//上級網(wǎng)格編號intnextlevel;//下級網(wǎng)格編號,左下角第一個網(wǎng)格};對于矢量數(shù)據(jù)的混合索引中R-tree的結(jié)構(gòu)如下:structIndex_Rtree{intinxKey;//索引編號intFlag;//是否被檢索MBRMbri;//目錄矩形MBRMbr;//最小包圍矩形longAddress;//空間要素的文件地址};structMBR_Rtree{CpointLpoint;//左上角坐標(biāo)CpointRpoint;//右下角坐標(biāo)};分布式管理實現(xiàn)任務(wù)調(diào)度和節(jié)點的負載均衡是在分布式管理中占據(jù)比例最大的一部分內(nèi)容。下文將予以系統(tǒng)介紹。任務(wù)調(diào)度當(dāng)有多個用戶同時訪問時,任務(wù)調(diào)度便開始調(diào)用程序。多用戶同時控制的計算方法有幾種,但是最常用的有兩種。一:建立在封閉的基礎(chǔ)上的并發(fā)控制的計算方法。二:建立在時間點上的計算方法。從應(yīng)用情況來看,還是前者的應(yīng)用范圍更加廣泛。因而本文也采納了這種封鎖的算法。這種算法的特點是所有用戶都進行讀操作的情況下系統(tǒng)不加鎖運行。但當(dāng)某一個用戶正進行讀操作,而另一個用戶準(zhǔn)備進行寫操作的時候,并發(fā)控制收到觸發(fā),對寫操作進行一定程度的上鎖。該系統(tǒng)在進行計算時,最初設(shè)置的標(biāo)志,冗余和計數(shù)變量的初始值均為0.當(dāng)沒有人訪問的時候變量為0,有人在進行讀操作的時候變量為1,同理,寫操作對應(yīng)的變量為2。也就是說,在變量為0的時候,沒有其他用戶訪問,因此該用戶可以進行讀寫的操作。但有用戶操作的時候,此時標(biāo)志變量為1.新的用戶只能進行讀操作,該用戶讀取完畢關(guān)閉了界面之后,系統(tǒng)內(nèi)自帶的計數(shù)器做相應(yīng)的計算,并將變量值減去1。直到原來數(shù)據(jù)變量變?yōu)?的時候才能繼續(xù)進行其他節(jié)點的數(shù)據(jù)讀取。在變量為2的時候,用戶不可進行讀寫操作。在用戶進行寫操作的過程中則程序?qū)⒆詣臃怄i。但這只是暫時的。節(jié)點封鎖變量結(jié)構(gòu)為:structDB_mark{intmark;//標(biāo)志變量intremark;//冗余標(biāo)志變量intcount;//計數(shù)標(biāo)志變量};負載均衡實現(xiàn)在對地理物象進行空間數(shù)據(jù)的圖形處理過程中,計算機的CPU和內(nèi)存決定了處理的速度。二者的利用情況直接影響機器的運行速度。所以在節(jié)點信息的采集過程中加入這兩個變量就能很好的表示。各個關(guān)于節(jié)點的參數(shù)和變量都需要被重新設(shè)定。包括主服務(wù)器的節(jié)點以及各個參與的節(jié)點,并且周期性的有規(guī)律的向主服務(wù)器發(fā)送自身的數(shù)據(jù)報告。主服務(wù)器將記錄下發(fā)送來的CPU及內(nèi)存的利用率。然后生成負載均衡參數(shù)表。如下表所示。表4-18負載均衡參數(shù)表參與服務(wù)節(jié)點中傳遞參數(shù)結(jié)構(gòu)體為:structloadparameter{doubleMeparameter;//內(nèi)存利用率doubleCPUparameter;//CPU利用率};本章小結(jié)本章節(jié)從空間數(shù)據(jù)庫的搜索引擎的數(shù)據(jù)存儲調(diào)用,信息連接端口,檢索分析和算法以及分布式管理等方面進行介紹。仔細討論其實現(xiàn)方法和根本原理。綜合看來,本章的重點知識點有4點。首先,矢量和柵格數(shù)據(jù)在存儲調(diào)用的過程中實現(xiàn)了表格結(jié)構(gòu)的儲存,實現(xiàn)了對數(shù)據(jù)的輸入輸出功能。其次,文章介紹了socket和r樹結(jié)構(gòu)的調(diào)用方法,對通信結(jié)構(gòu)中較為重要的結(jié)構(gòu)體做了詳細的介紹。然后本章描述了兩種索引方式的結(jié)構(gòu)和算法,在空間檢索中對主要的類別和函數(shù)進行簡單介紹。最后,在多用戶的并發(fā)處理控制的功能中介紹了分布式管理和負載均衡。嚴(yán)格說來這只是對空間數(shù)據(jù)庫的最基本功能的實現(xiàn)。還有很多地方需要改進。盡管如此,但是他依然具備空間數(shù)據(jù)庫的檢索的功能。對于學(xué)習(xí)者來說是一次有意義的實踐和探討。第5章分布式數(shù)據(jù)庫系統(tǒng)原型的設(shè)計與實現(xiàn)分布式空間數(shù)據(jù)庫的引擎主要職能是處理前臺的地理信息系統(tǒng)提供的數(shù)據(jù),具體方法是將數(shù)據(jù)轉(zhuǎn)化成不同的關(guān)系類型,迎合計算機的處理形式進行存儲。同時將可能出現(xiàn)的申請訪問等要求編寫成計算機可識別處理的語言,將數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫后存儲好后,一旦用戶需要調(diào)用,數(shù)據(jù)庫能夠自動將信息提供給用戶??梢哉f地理信息系統(tǒng)是進行的是前臺的操作。通過分布式的空間數(shù)據(jù)庫引擎以及動態(tài)鏈接庫的共同傳導(dǎo)將信息呈現(xiàn)給用戶,因此可將其看做的后臺的操作。除此之外,還需明確的一點是分布式空間數(shù)據(jù)庫的搜索引擎是建立在visualC++的平臺上的。5.1 分布式管理實現(xiàn)學(xué)習(xí)了前面幾個章節(jié)之后,我們對分布式數(shù)據(jù)庫功能和作用有了比較細致的認識。對于數(shù)據(jù)庫的幾個模塊以及相應(yīng)的關(guān)鍵技術(shù)也有了清晰的認識,也都通過實際操作得以實現(xiàn)。如果將此分布式的數(shù)據(jù)庫的搜索檢索供能同地理信息系統(tǒng)相結(jié)合,即將GIS中捆綁一個分布式空間數(shù)據(jù)庫SD-SDE。那么他的界面應(yīng)如下圖所示。圖5.1系統(tǒng)整體界面5.2 分布式空間數(shù)據(jù)庫引擎原型系統(tǒng)運行環(huán)境操作系統(tǒng):Windows7操作系統(tǒng)硬件環(huán)境:臺式電腦AMDAthlon(tm)DualCoreProcessor2.71GHz,2GB內(nèi)存關(guān)系型數(shù)據(jù)庫:SQLServer20005.3 數(shù)據(jù)源管理模塊對于數(shù)據(jù)源的操作和處理應(yīng)該包括兩個模塊。第一是關(guān)于數(shù)據(jù)庫訪問登錄的管理,第二是對于各種不同類型工作區(qū)的定義和劃分。在第三第四章介紹的分布式空間數(shù)據(jù)庫和異構(gòu)數(shù)據(jù)庫的登錄管理開放,用戶可以很直接便捷的了解和讀取編寫。5.3.1 數(shù)據(jù)庫登陸管理數(shù)據(jù)庫登錄管理這一部分應(yīng)該具備以下幾種模塊以行使其相應(yīng)的職能,比如,登錄服務(wù)器模塊,斷開連接服務(wù)器模塊等。在登錄模塊中主要注意力幾種在異構(gòu)數(shù)據(jù)庫上,對于分布式的數(shù)據(jù)庫,要對原有的查詢語句的接口進行檢測,做好信息封閉保密。用戶只要輸入數(shù)據(jù)庫的名稱就可以直接登錄到目標(biāo)數(shù)據(jù)庫。圖5-2數(shù)據(jù)庫登陸5.3.2 定義工作空間為了能夠?qū)樌麑崿F(xiàn)空間數(shù)據(jù)的存儲,作為之前的一個步驟----定義工作空間有重要的作用。而工作空間也是以數(shù)據(jù)模型和數(shù)據(jù)劃分為依據(jù)進行設(shè)計和定義的。用戶在使用該系統(tǒng)時,第一步是定義自己所需的空間類型,有矢量和柵格兩種工作空間可以選擇。用戶應(yīng)該選擇適合自己的工作空間,才可達到使用的效果。如果用戶采用了柵格工作空間,那么他可以選擇金字塔的層數(shù)和影響分塊多少,或者也可以采用系統(tǒng)默認值。一般情況下多以256*256的塊數(shù)和7層金字塔模型。或者如下圖所示進行修改。圖5-3工作空間定義5.4 數(shù)據(jù)管理模塊使用空間數(shù)據(jù)庫的引擎的一部分原因就是儲存數(shù)據(jù)。該引擎把地理事物的空間數(shù)據(jù)按照結(jié)構(gòu)化標(biāo)準(zhǔn)化的表格形式存入關(guān)系型數(shù)據(jù)庫,再利用這種類型數(shù)據(jù)庫的操作系統(tǒng)來管理這些數(shù)據(jù)。方便用戶讀取利用。圖5-4是分布式空間數(shù)據(jù)庫引擎所實現(xiàn)的表結(jié)構(gòu)。圖5-4空間數(shù)據(jù)庫引擎的數(shù)據(jù)表矢量圖像管理該文采用的SHP文件,一次性將SHP文件及對應(yīng)屬性文件內(nèi)容引入,其矢量圖像是系統(tǒng)從外存中引入的文件。引入的文件將根據(jù)其圖像顯示數(shù)據(jù)及屬性依次納入數(shù)據(jù)庫表里。該文使用美國的州層數(shù)據(jù)和城市數(shù)據(jù),引入矢量數(shù)據(jù)如下圖所示。圖5-5引入矢量圖像示意圖5.4.2 柵格圖像管理GIS軟件以關(guān)系型數(shù)據(jù)庫SQLServer2000為媒介,將柵格圖像導(dǎo)入,然后,GIS軟件以SD-SDE給予的接口函數(shù)為通道,將柵格圖像引入數(shù)據(jù)庫,其大小排版可根據(jù)用戶意愿自定義或系統(tǒng)定義的256×256,儲存方法便是根據(jù)前面第四章數(shù)據(jù)表結(jié)構(gòu)進行操作,從而完成柵格空間數(shù)據(jù)的層次化管理。該文以301兆TIF格式的平樂古鎮(zhèn)影像圖為例,如下圖所示。圖5-6柵格圖像的載入5.5 數(shù)據(jù)操作模塊5.5.1 矢量圖像顯示矢量數(shù)據(jù)的圖像和屬性信息通過分布式空間數(shù)據(jù)庫引擎從關(guān)系型數(shù)據(jù)庫中顯示,它不單是圖像數(shù)據(jù)的展示,而是

溫馨提示

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

評論

0/150

提交評論