專利名稱::一種gis矢量數(shù)據(jù)水印嵌入與提取的數(shù)據(jù)格式自適應方法
技術(shù)領域:
:本發(fā)明屬于地理信息版權(quán)保護領域,具體涉及一種在對GIS矢量數(shù)據(jù)進行水印嵌入與提取時無須考慮數(shù)據(jù)格式與要素類型的解決方法,屬于矢量數(shù)據(jù)處理技術(shù)。
背景技術(shù):
:GIS矢量數(shù)據(jù)產(chǎn)品作為一種重要的地理信息載體,其數(shù)據(jù)安全及版權(quán)保護問題至關(guān)重要。目前對GIS矢量數(shù)據(jù)的版權(quán)保護主要是采用數(shù)字水印技術(shù)。國內(nèi)外關(guān)于如何在矢量數(shù)據(jù)中嵌入水印已經(jīng)有了比較成熟的研究,基礎算法理論方面已經(jīng)有了相當數(shù)量的文獻可供查閱,也出現(xiàn)了很多具體的實際應用,但由于矢量數(shù)據(jù)在數(shù)據(jù)格式上的多樣性與復雜性,諸多算法與應用僅能應用于特定的一種或幾種數(shù)據(jù)格式,針對GIS矢量數(shù)據(jù)格式的自適應能力較差。面對眾多的GIS軟件及其自主開發(fā)、不夠規(guī)范、不夠公開的數(shù)據(jù)模型,目前主要采取在某特定格式數(shù)據(jù)的數(shù)據(jù)接口或者自主底層開發(fā)數(shù)據(jù)讀寫接口的基礎上,進行GIS矢量數(shù)據(jù)數(shù)字水印嵌入與提取算法的編寫。但這兩種方式都有各自的缺點,前者支持格式單一,一般來說,采用哪一種軟件的數(shù)據(jù)接口就只能讀寫該軟件的數(shù)據(jù)類型,極大地限制了算法所能應用的數(shù)據(jù)類型;而后者在開發(fā)上十分繁瑣,需要有針對性的為各種數(shù)據(jù)格式定制讀寫方案,技術(shù)難度較大,工作量極為繁重,并且隨GIS的日益發(fā)展,需要處理的格式越來越^^o
發(fā)明內(nèi)容本發(fā)明的目的在于解決進行矢量數(shù)據(jù)水印信息嵌入與提取時的數(shù)據(jù)格式限制問題,提出一種能夠支持目前主流矢量數(shù)據(jù)格式的水印信息嵌入與提取方案,使得在對數(shù)據(jù)進行處理時采用統(tǒng)一的方法進行操作,而無須考慮具體的數(shù)據(jù)格式,在嵌入與提取水印時也無須考慮具體的要素類型。為達到上述目的,本發(fā)明采用如下思路一方面,讀寫矢量數(shù)據(jù)部分采用FMEObjects的基于語義的統(tǒng)一數(shù)據(jù)讀寫接口,用戶可將對各種格式GIS矢量數(shù)據(jù)的操作統(tǒng)一于FMEObjects的要素類型來進行,而不依賴于具體的格式,從而滿足了算法在數(shù)據(jù)格式上充分的自適應能力;另一方面,由于對矢量數(shù)據(jù)的處理實質(zhì)都是對其所包含的點坐標進行處理,因此,將所有讀取獲得的GIS矢量數(shù)據(jù)要素(簡稱矢量數(shù)據(jù)要素、數(shù)據(jù)要素或要素)按其原始ID順序分別轉(zhuǎn)換為點集,即不管要素類型是點、線或面,全部轉(zhuǎn)換成點的集合,所有這些點的集合便可以交給水印算法進行嵌入,嵌入完畢后,再將含水印點集按其原本的要素類型裝配回去,最后按照原本的ID順序?qū)⑦@些要素寫入對應的數(shù)據(jù)文件當中,這樣便使得在對數(shù)據(jù)進行水印嵌入與提取時,統(tǒng)一抽象為點集合的形式進行處理,而無需考慮具體的要素類型,從而可以令水印算法的編寫變得更加有針對性,編寫者更多的專注于算法本身,而無需耗費大量的精力進行多格式GIS矢量數(shù)據(jù)的讀寫處理。本發(fā)明的技術(shù)方案主要是基于FMEObjects開發(fā)包及點集抽象技術(shù)來統(tǒng)一實現(xiàn)對矢量數(shù)據(jù)V的統(tǒng)一讀取、點集組織、嵌入水印信息w及存儲為新的含水印數(shù)據(jù)vw。本發(fā)明GIS矢量數(shù)據(jù)水印嵌入與提取的數(shù)據(jù)格式自適應方法,其主要步驟如下環(huán)節(jié)一讀取數(shù)據(jù)要素,并轉(zhuǎn)換成點集合SPoints。具體過程為步驟1、根據(jù)用戶指定的數(shù)據(jù)格式及文件路徑信息snformat進行數(shù)據(jù)讀取,同時存儲用戶指定的保存格式及路徑信息des_format。src_format、des_format均為FMEOFormatlnfo類。將src_format傳遞給IFMEOReader接口并調(diào)用其ReadSchema方法以及Read方法來分別讀取數(shù)據(jù)的模式要素和幾何要素。此接口會根據(jù)用戶所傳遞的格式信息透明實現(xiàn)相應數(shù)據(jù)格式的自動匹配與工作,用戶和開發(fā)者均無需考慮其底層如何實現(xiàn)的;步驟2、按照原始文件V中的ID序號依次存儲所讀取的矢量數(shù)據(jù)要素f,得到要素集合m_features。本方法采用分批讀取策略,每次只讀取一批要素,待處理完畢再讀取下一批。每一批要素可視為V中的一個要素子集合F,如式(1)。F={fi,0^i^N-l}(1)其中N為當前分批數(shù)據(jù)中的要素個數(shù)。Read方法讀取出來的均為IFMEOFeature類型,為避免過多的強類型轉(zhuǎn)換,且能保留原始的要素順序,本方案利用.net中的泛型類容器List<IFME0Feature>來存儲每一個讀取出來的數(shù)據(jù)要素,要素在容器中的索引號即為其在這批數(shù)據(jù)中的相對位置,如式(2)。m—features={m_featuresi|m_featuresi=fi0^i^N-l}(2)其中N為當前分批數(shù)據(jù)中的要素個數(shù)。步驟3、將臨時存儲容!m_featUreS中的數(shù)據(jù)要素按不同的幾何類型歸類為Points,Lines和Polygons三類,依次得到其對應的點集合MPoints并進行后面步驟的處理,MPoints為泛型類數(shù)組List<IFME0Point>[]。1)幾何類型為Point的要素,全部歸類到Points集合中,Points同樣為泛型類容器。利用IFMEOFeature接口中的GetGeometry方法獲取Points集合中第i個要素的幾何體并直接轉(zhuǎn)換為IFMEOPoint對象Pi,存儲到MPoints唯一的數(shù)組元素中的第i個位置上,每一個位置對應了一個點要素,如式(3)。這樣就獲得了點類型要素的點集合。MPoints={MPoints0i|MPoints0i=p^O^i^N-l}(3)其中,N為容器中的要素個數(shù)。2)幾何類型為Line的要素,全部歸類到Lines集合中,Lines同樣為泛型類容器。利用IFMEOFeature接口中的GetGeometry方法獲取Lines集合中第i個要素的幾何體,并轉(zhuǎn)換為IFMEOLine類型,再使用IFMEOLine的GetPointAt方法獲取線要素中的第j個IFMEOPoint對象Pij,將其添加到MPoints中的第i個數(shù)組元素當中的第j個位置,每一個數(shù)組元素對應了一個線要素中的點集合,如式(4)。這樣就獲得了線類型要素的點集合。MPoints={MPointSj|MPointSj=p^O^i^N-l}Pi={PiJ,0彡j彡M-l}(4)其中,N為容器中的要素個數(shù),Pi為第i個要素的點集,M為Pi中的點的個數(shù)。3)幾何類型為Polygon的要素,全部歸類到Polygons集合中,Polygons同樣為泛型類容器。利用IFMEOFeature接口中的GetGeometry方法獲取Polygons集合中第i個要素的幾何體,并轉(zhuǎn)換為IFMEOPolygon類型,然后使用IFMEOPolygon中的GetBoundaryAsCurve方法獲取面的邊界對象IFMEOCurve,再使用IFMEOCurve的GetAsLine方法轉(zhuǎn)換為IFMEOLine,最后使用IFMEOLine的GetPointAt方法獲取當中的第j個IFMEOPoint對象PU,將其添加到MPoints中的第i個數(shù)組元素當中的第j個位置,每一個數(shù)組元素對應了一個面要素中的點集合,同式(4)這樣就獲得了面類型要素的點集合。步驟4、獲取具有唯一性的點集合SPoints,SPoints為泛型類數(shù)組。由于矢量數(shù)據(jù)中不可避免的會有很多重合的邊界,即會有很多重復的點,為保證之前重合的關(guān)系不會變化,因此對原本重合的點必須做相同的處理。本方法首先提取具有唯一性的點集。遍歷MPoints中的每一個點,利用.net中的Hashtable作為判斷依據(jù),以點的X坐標加上Y坐標組成的字符串作為鍵查詢,如果哈希表中存在此鍵,則說明已有重合的點加入了,不考慮此點;如果不存在,則將此點添加到SPoints中對應的數(shù)組元素里,并以該點的X坐標加上Y坐標組成的字符串作為鍵,以數(shù)組元素的索引號i加上元素內(nèi)部的索引號j組成的字符串作為值添加到哈希表中。至此環(huán)節(jié)一結(jié)束,獲得了已讀取要素m_featureS所對應的唯一性點集合SPoints,表示為下式SPoints={sp^O彡i彡N_l,}sPi={sPiJ,0(j(K-l}(5)sPi為第i個要素的唯一性點集,N為SPoints中的元素個數(shù),sPij為sPi中第j個位置上的點對象,K為sPi中的點個數(shù)。環(huán)節(jié)二嵌入水印信息w,獲得含水印點集WPoints。水印算法無論在具體實現(xiàn)上有多大不同,均是基于一致的水印嵌入模型(式(6))來實現(xiàn)的。WPoints=Em(SPoints,w)(6)Em表示將水印信息w嵌入點集SPoints中的嵌入算法。Em主要是將水印信息w循環(huán)嵌入到唯一性點集SPoints當中。因此,將環(huán)節(jié)一中獲得的唯一性點集SPoints交給水印算法處理,即可滿足GIS矢量數(shù)據(jù)水印嵌入算法的需要。算法的一般處理過程如下1)配置嵌入?yún)?shù)。獲取點集SPoints、水印信息序列w、嵌入位置、嵌入次數(shù)等參數(shù);2)生成水印信息嵌入序列w’。根據(jù)上述參數(shù)以及點集的嵌入容量綜合確定需要具體嵌入到每一個點sPij中的水印信息,從而得到一個跟SPoints組織方式相同的水印序列w’。如下式w'={w^O^i^N-1}Wi={Wij.,0彡j彡K-l}(7)其中Wi表示sPi要嵌入的水印信息集合,N為w'中的子集合個數(shù),WiJ為嵌入到sPiJ中的二進制水印信息,K為Wi中的元素個數(shù)。水印信息嵌入序列w'可能會是一個內(nèi)容不斷重復的序列,以達到循環(huán)嵌入的目的。這是由點集的嵌入容量以及嵌入次數(shù)所決定的。3)將水印信息嵌入序列對應地嵌入到點集當中每一個點的坐標屬性里,得到含水印點集WPoints,WPoints的結(jié)構(gòu)與SPoints相同,如式(8)。WPoints={wp^O^i^N-1,}wpi={wpij.,0彡i彡K-l}(8)wPi為第i個要素的含水印唯一性點集,N為WPoints中的元素個數(shù),wPij為wPi中第j個位置上的點對象,K為wPi中的點個數(shù)。至此環(huán)節(jié)二結(jié)束,獲得了已讀取要素m_featureS所對應的含水印唯一性點集合WPoints.另外,如果是水印提取,則此環(huán)節(jié)將從待檢測數(shù)據(jù)中提取出來的SPoints交給水印提取算法處理,返回提取結(jié)果。環(huán)節(jié)三將含水印的點集WPoints重新裝配給數(shù)據(jù)要素,并生成新的含水印文件vw,分為三個步驟步驟1、根據(jù)WPoints來對原始的完整點集合MPoints進行處理;遍歷MPoints中的每一個點,仍然根據(jù)環(huán)節(jié)一當中的哈希表來進行判斷,如果以點的X坐標加上Y坐標組成的字符串作為鍵查詢到的值為字符串,則將結(jié)果字符串解析,得到在WPoints中的索引號,然后將此索引位置上的點的幾何屬性賦給正在遍歷的點,并將哈希表中的值替換為該索引位置上的IFMEOPoint;如果查詢到的值為IFMEOPoint類型,則直接將此IFMEOPoint的幾何屬性賦給正在遍歷的點,得到含水印完整點集MPoints’;步驟2、將MPoints’重新裝配回數(shù)據(jù)要素,分為三種情況1)遍歷Points當中的每一個要素,要素的索引號即對應了MPoints’中唯一的數(shù)組元素中的索引位置,此位置上的IFMEOPoint就是對應點要素經(jīng)過處理后的結(jié)果;將此索引位置上的IFMEOPoint的幾何屬性賦給正在遍歷的點要素的IFMEOPoint對象,得到處理后的點要素集合Points’;2)遍歷Lines當中的每一個要素,要素的索引號即對應了MPoints’中的數(shù)組元素的索引號;此位置上的泛型類對象中存儲的就是對應線要素經(jīng)過處理后的點集;依次對此泛型類對象中存儲的點使用線要素中IFMEOLine對象的SetPointAt方法來重新設置線要素中的每一個IFMEOPoint,得到處理后的線要素集合Lines’;3)遍歷Polygons當中的每一個要素,要素的索引號即對應了MPoints’中的數(shù)組元素的索引號;此位置上的泛型類對象中存儲的就是對應面要素經(jīng)過處理后的點集;依次對此泛型類對象中存儲的點使用面要素中IFMEOLine對象的SetPointAt方法來重新設置面要素中的每一個IFMEOPoint,將重新設置后的IFMEOLine對象轉(zhuǎn)換為IFMEOCurve,然后對此IFMEOCurve對象使用IFMEOGeometryTools的CreatePolygonByCurve方法,生成新的IFMEOPolygon對象,最后利用正在遍歷的IFMEOFeature要素的SetGeometry方法,將新的IFMEOPolygon對象賦給當前要素,得到處理后的面要素集合Polygons’;步驟3、將含水印的要素寫入新的數(shù)據(jù)文件vw當中;利用環(huán)節(jié)一中用戶所指定的des_format來實現(xiàn)IFMEOWriter接口,進而調(diào)用此接口的AddSchema方法以及Writer方法來分別寫入數(shù)據(jù)的模式要素和幾何要素;直接按照存儲容器中的順序依次寫入IFMEOFeature,最后得到含水印信息的矢量數(shù)據(jù)文件vw。本發(fā)明利用FMEObjects的基于語義的統(tǒng)一數(shù)據(jù)讀寫接口以及要素類型點集化抽象方法,提出一種能夠支持目前主流GIS矢量數(shù)據(jù)格式的水印信息嵌入與提取方案,實現(xiàn)了水印嵌入與提取算法對多種GIS矢量數(shù)據(jù)格式的自適應應用能力,解決了進行GIS矢量數(shù)據(jù)水印信息嵌入與提取時的數(shù)據(jù)格式限制問題,使得在對數(shù)據(jù)進行處理時采用統(tǒng)一的方法進行操作,而無須考慮具體的數(shù)據(jù)格式,在嵌入與提取水印時也無須考慮具體的要素類型。圖1基于FMEObjects的矢量數(shù)據(jù)格式自適應水印信息嵌入流程2中國縣級行政區(qū)劃矢量數(shù)據(jù)圖3選擇數(shù)據(jù)格式以及路徑的界面圖4FME0bjects的格式庫截5針對數(shù)據(jù)要素與點集合的操作類6針對唯一性點集的操作類7水印提取結(jié)果驗證截圖具體實施例方式下面結(jié)合附圖和實施例做進一步詳細說明。實施例1本發(fā)明所提出的基于FMEObjects的矢量數(shù)據(jù)格式自適應水印信息嵌入與提取是基于二次開發(fā)的解決方案,其采用需依賴于程序代碼實現(xiàn)。本實例以采用該方案而開發(fā)的矢量數(shù)據(jù)水印系統(tǒng)為基礎,選擇一種典型的GIS矢量數(shù)據(jù),針對其讀取、組織、水印嵌入、保存、水印提取的整個過程,給出本發(fā)明的一個實施例,進一步詳細說明本發(fā)明。本實施例選擇中國縣級行政區(qū)劃矢量數(shù)據(jù)作為實驗數(shù)據(jù),數(shù)據(jù)格式為shp,面圖層。水印標記內(nèi)容為“南京師范大學地理科學學院”文本信息,對應的二進制水印序列w為10000111101000100001110001100100…。已實現(xiàn)的水印系統(tǒng)的開發(fā)是基于FMEObjects開發(fā)包,以WindowsXPSP2為操作系統(tǒng)環(huán)境,VisualStudio2005為開發(fā)環(huán)境,c#為開發(fā)語言。如圖1所示,是本發(fā)明所提出的基于FMEObjects的矢量數(shù)據(jù)格式自適應水印信息嵌入流程圖。整個流程分為以下幾個部分步驟一、通過FMEObjects內(nèi)封裝的IFMEODialog對話框來選擇實驗用的數(shù)據(jù)格式以及路徑。數(shù)據(jù)格式為shp,數(shù)據(jù)V為中國縣級行政區(qū)劃圖B0UNT_poly(圖2),選擇界面如圖3所示。數(shù)據(jù)格式的選擇是利用FMEObjects所提供的FormatsGallery來挑選(圖4),格式庫中涵蓋了目前國際上主流的矢量數(shù)據(jù)類型,可根據(jù)需要選擇。本實驗選擇ESRIShape格式。格式信息及路徑信息分別存儲到FMEOFormatlnfo類型變量的屬性Format和Dadaset當中,供后續(xù)部分的IFMEOReader接口調(diào)用。同樣需要指定嵌入水印后數(shù)據(jù)的保存格式以及路徑。全部指定完畢后,這些數(shù)據(jù)的有關(guān)信息會作為參數(shù)傳遞給系統(tǒng)的讀寫方法,等待調(diào)用。步驟二、數(shù)據(jù)組織。首先開始對數(shù)據(jù)要素進行讀取,系統(tǒng)默認分批處理。每次讀取100個數(shù)據(jù)要素存儲在List<IFME0Feature>泛型類容器m_features中。然后對此容器中的對象按類型歸類。這里,m_featUres可表示為{&,f\,f2,...,f99},&為數(shù)據(jù)文件V中的要素,i為當前要素組中的索引號。因為要素類型均為面類型,所以Polygons容器也表示為{fQ,f\,f2,...,f99},而Lines和Points中個數(shù)均為零。步驟三、獲取要素集合對應的具有唯一性的點集合。此步驟分為下面兩部分1)獲取要素集合所對應的完整點集合。系統(tǒng)內(nèi)實現(xiàn)這部分功能的主要是PointsOperation類中的靜態(tài)方法,PointsOperation類的類圖見圖5。本實施例使用的是面類型矢量數(shù)據(jù),因此會調(diào)用Polygon_getPoints方法來得到面要素的點集合,核心代碼如下staticIFMEOGeometryToo1sgeotools=FrmMain.fme_session.GeometryTools();publicstaticList<IFME0Point>[]Polygon_getPoints(List<IFME0Feature>features,intnum){List<IFME0Point>[]points=newList<IFME0Point>[features.Count];for(inti=0;i<features.Count;i++){points[i]=newList<IFME0Point>();IFMEOPolygonpPolygon=features[i].GetGeometry()asIFMEOPolygon;if(pPolygon==null)continue;IFMEOCurvepCurve=pPolygon.GetBoundaryAsCurve();IFMEOLinepLine=pCurve.GetAsLine();if((pLine.NoOfPoints-1)<num)continue;IFMEOPointpPoint=geotools.CreatePoint();for(intj=0;j<(pLine.No0fPoints-l);j++){pLine.GetPointAt((uint)j,pPoint);points[i].Add(pPoint);pPoint=geotools.CreatePoint();}}returnpoints;}這里使用!11_作站11儀8為輸入?yún)?shù),返回該要素集合所對應的完整的點集合MPoints。MPoints集合可表示為{pQ,Pl,p2,...,p99},Pi為第i個要素的點集。pQ中點的個數(shù)為798,Pl中點的個數(shù)為787,p2中點的個數(shù)為2139,…,p99中點的個數(shù)為782。2)獲取具有唯一性的點集合完整點集合中不可避免的會有一些重合的點,因此要保證這些重合關(guān)系不變,必須獲取具有唯一性的點集合來進行水印嵌入,待處理完畢再在后面的步驟中對所有原本重合的點做同樣的處理。這里使用UniquePoints類中的靜態(tài)方法GetUniquePoints,UniquePoints類的類圖如圖6所示。GetUniquePoints方法代碼如下publicstaticHashtableIfMatch;staticIFMEOGeometryToo1sgeotools=FrmMain.fme_session.GeometryTools();publicstaticList<IFME0Point>[]GetUniquePoints(List<IFME0Point>[]myPoints){List<IFME0Point>[]UniquePoints=newList<IFME0Point>[myPoints.Length];if(IfMatch==null)IfMatch=newHashtableO;for(inti=0;i<myPoints.Length;i++){UniquePoints[i]=newList<IFME0Point>();for(intj=0;j<myPoints[i].Count;j++){stringTxy=myPoints[i][j].X.ToStringO+“*"+myPoints[i][j].Y.ToString();if(IfMatch.Contains(Txy)==false){IFMEOPointtpoint=geotools.CreatePoint();IFMEOPointtpoint2=geotools.CreatePoint();X.ToString()+ToString();}這里以MPoints為輸入?yún)?shù),返回具有唯一性的點集合SPoints。SPoints集合可表示為{spQ,sPl,sp2,...,sp99},sPi為第i個要素的唯一性點集。SpQ中點的個數(shù)為tpoint.X=myPoints[i][j].X;tpoint.Y=myPoints[i][j].Y;tpoint2.X=tpoint.X;tpoint2.Y=tpoint.Y;stringmyXY=tpoint+tpoint.Y.ToString();intpy=UniquePoints[i].Count;stringpos=i.ToString()+*"+py.IfMatch.Add(myXY,pos);UniquePoints[i].Add(tpoint2);}}}returnUniquePoints;798,sPl中點的個數(shù)為621,sp2中點的個數(shù)為1961,…,sp99中點的個數(shù)為472。以SPQ中的點為例,其中各點的橫坐標值為{x0,Xl,x2,…x797},x0=122.78010001514291,=122.77445997814326,x2=122.77031998541904,…,x797=122.79492998126159。步驟四、水印信息嵌入。系統(tǒng)將唯一性點集SPoints交給水印嵌入算法處理,標記內(nèi)容為“南京師范大學地理科學學院”。這里選用的水印算法為“低位替換嵌入算法”,嵌入位置為小數(shù)點后第5位,嵌入長度為8位。處理完畢獲得含水印信息的唯一性點集WPoints。WPoints與SPoints的結(jié)構(gòu)一致,表示為{wp0,wPl,wp2,,wp99},wPi為第i個要素的含水印唯一性點集。但其中點的坐標值已發(fā)生了變化,以WP(1中的點為例,其中各點的橫坐標值為{xq',x/,x2',...,x797'},x0'=122.780100000032,x/=122.774410000111,x2'=122.7703000111,…,x797'=122.7949000111。步驟五、數(shù)據(jù)要素的重新裝配。此步驟是步驟三的逆過程,首先根據(jù)含水印的唯一性點集WPoints來對完整性點集MPoints作處理,得到含水印信息的完整性點集MPoints,。這里使用UniquePoints類中的靜態(tài)方法SetUniquePoints來實現(xiàn)。接下來將MPoints,重新裝配給數(shù)據(jù)要素,得到含水印信息的數(shù)據(jù)要素Polygons’。這里調(diào)用了PointsOperation類中的靜態(tài)方法Polygon_setPoints。步驟六、根據(jù)步驟一中指定的保存格式及路徑信息,將泛型類容器m_featUreS中的數(shù)據(jù)要素寫入新的數(shù)據(jù)文件當中,得到含水印信息的矢量數(shù)據(jù)文件vw。嵌入完畢后進行水印信息提取驗證。這部分的實質(zhì)是嵌入過程中步驟一到步驟四的綜合,不同的是選擇讀取的數(shù)據(jù)為步驟六中新生成的含水印的矢量數(shù)據(jù)文件vw,另外在步驟四中是將唯一性點集交給水印提取算法進行水印檢測。檢測得到結(jié)果為“南京師范大學地理科學學院”,如圖7所示。本實施例僅選擇了shp格式的面狀數(shù)據(jù)進行處理,對于FMEObjects支持的其他眾多格式以及各種要素類型的矢量數(shù)據(jù),本方案同樣有效。水印算法方面,本實施例僅選擇了低位替換算法進行水印信息的嵌入與提取,對于針對GIS矢量數(shù)據(jù)的其它水印算法,本方案同樣有效。1權(quán)利要求一種GIS矢量數(shù)據(jù)水印嵌入與提取的數(shù)據(jù)格式自適應方法,其步驟如下環(huán)節(jié)一讀取數(shù)據(jù)要素,并轉(zhuǎn)換成點集合SPoints;具體過程為步驟1、根據(jù)用戶指定的數(shù)據(jù)格式及文件路徑信息src_format進行數(shù)據(jù)讀取,同時存儲用戶指定的保存格式及路徑信息des_format。src_format、des_format均為FMEOFormatInfo類;將src_format傳遞給IFMEOReader接口并調(diào)用其ReadSchema方法以及Read方法來分別讀取數(shù)據(jù)的模式要素和幾何要素;IFMEOReader接口根據(jù)用戶所傳遞的格式信息透明實現(xiàn)相應數(shù)據(jù)格式的自動匹配與工作;步驟2、按照原始文件V中的ID序號依次存儲所讀取的矢量數(shù)據(jù)要素f,得到要素集合m_features;采用分批讀取方式,每次只讀取一批矢量數(shù)據(jù)要素,待處理完畢再讀取下一批;每一批矢量數(shù)據(jù)要素可視為V中的一個要素子集合F,如下式F={fi,0≤i≤N-1}(1)其中N為當前分批數(shù)據(jù)中的矢量數(shù)據(jù)要素個數(shù);讀取出來的矢量數(shù)據(jù)要素均為IFMEOFeature類型,利用.net中的泛型類容器List<IFMEOFeature>來存儲每一個讀取出來的矢量數(shù)據(jù)要素,矢量數(shù)據(jù)要素在容器中的索引號即為其在這批矢量數(shù)據(jù)要素中的相對位置,如下式m_features={m_featuresi|m_featuresi=fi,0≤i≤N-1}(2)其中N為當前分批數(shù)據(jù)中的矢量數(shù)據(jù)要素個數(shù)。步驟3、將臨時存儲容器m_features中的矢量數(shù)據(jù)要素按不同的幾何類型歸類為Points,Lines和Polygons三類,依次得到其對應的點集合MPoints并進行后面步驟的處理,MPoints為泛型類數(shù)組List<IFMEOPoint>[];a)幾何類型為Point的要素,全部歸類到Points集合中,Points同樣為泛型類容器;利用IFMEOFeature接口中的GetGeometry方法獲取Points集合中第i個要素的幾何體并直接轉(zhuǎn)換為IFMEOPoint對象pi,存儲到MPoints唯一的數(shù)組元素中的第i個位置上,每一個位置對應了一個點要素,如式(3)。這樣就獲得了點類型要素的點集合。MPoints={MPoints0i|MPoints0i=pi,0≤i≤N-1}(3)其中,N為容器中的要素個數(shù)。b)幾何類型為Line的要素,全部歸類到Lines集合中,Lines同樣為泛型類容器。利用IFMEOFeature接口中的GetGeometry方法獲取Lines集合中第i個要素的幾何體,并轉(zhuǎn)換為IFMEOLine類型,再使用IFMEOLine的GetPointAt方法獲取線要素中的第j個IFMEOPoint對象pij,將其添加到MPoints中的第i個數(shù)組元素當中的第j個位置,每一個數(shù)組元素對應了一個線要素中的點集合,如下式MPoints={MPointsi|MPointsi=pi,0≤i≤N-1}pi={pij,0≤j≤M-1}(4)其中,N為容器中的要素個數(shù),pi為第i個要素的點集,M為pi中的點的個數(shù)。這樣就獲得了線類型要素的點集合;c)幾何類型為Polygon的要素,全部歸類到Polygons集合中,Polygons同樣為泛型類容器;利用IFMEOFeature接口中的GetGeometry方法獲取Polygons集合中第i個要素的幾何體,并轉(zhuǎn)換為IFMEOPolygon類型,然后使用IFMEOPolygon中的GetBoundaryAsCurve方法獲取面的邊界對象IFMEOCurve,再使用IFMEOCurve的GetAsLine方法轉(zhuǎn)換為IFMEOLine,最后使用IFMEOLine的GetPointAt方法獲取當中的第j個IFMEOPoint對象pij,將其添加到MPoints中的第i個數(shù)組元素當中的第j個位置,每一個數(shù)組元素對應了一個面要素中的點集合,同式(4),這樣就獲得了面類型要素的點集合;步驟4、獲取具有唯一性的點集合SPoints,SPoints為泛型類數(shù)組;首先提取具有唯一性的點集;遍歷MPoints中的每一個點,利用.net中的Hashtable作為判斷依據(jù),以點的X坐標加上Y坐標組成的字符串作為鍵查詢,如果哈希表中存在此鍵,則說明已有重合的點加入了,不考慮此點;如果不存在,則將此點添加到SPoints中對應的數(shù)組元素里,并以該點的X坐標加上Y坐標組成的字符串作為鍵,以數(shù)組元素的索引號i加上元素內(nèi)部的索引號j組成的字符串作為值添加到哈希表中;至此環(huán)節(jié)一結(jié)束,獲得了已讀取要素m_features所對應的唯一性點集合SPoints,表示為下式SPoints={spi,0≤i≤N-1,}spi={spij,0≤j≤K-1}(5)spi為第i個要素的唯一性點集,N為SPoints中的元素個數(shù),spij為spi中第j個位置上的點對象,K為spi中的點個數(shù);環(huán)節(jié)二嵌入水印信息w,獲得含水印點集WPoints;水印算法是基于一致的水印嵌入模型來實現(xiàn)的WPoints=Em(SPoints,w)(6)Em表示將水印信息w嵌入點集SPoints中的嵌入算法;Em是將水印信息w循環(huán)嵌入到唯一性點集SPoints當中;將環(huán)節(jié)一中獲得的唯一性點集SPoints交給水印算法處理,即可滿足GIS矢量數(shù)據(jù)水印嵌入算法的需要;水印算法的處理過程如下A)配置嵌入?yún)?shù);獲取點集SPoints、水印信息序列w、嵌入位置、嵌入次數(shù)等參數(shù);B)生成水印信息嵌入序列w’;根據(jù)上述參數(shù)以及點集的嵌入容量綜合確定需要具體嵌入到每一個點spij中的水印信息,從而得到一個跟SPoints組織方式相同的水印序列w’,如下式w′={wi,0≤i≤N-1}wi={wij,0≤j≤K-1}(7)其中wi表示spi要嵌入的水印信息集合,N為w′中的子集合個數(shù),wij為嵌入到spij中的二進制水印信息,K為wi中的元素個數(shù);C)將水印信息嵌入序列對應地嵌入到點集當中每一個點的坐標屬性里,得到含水印點集WPoints,WPoints的結(jié)構(gòu)與SPoints相同,如下式WPoints={wpi,0≤i≤N-1,}wpi={wpij,0≤j≤K-1}(8)wpi為第i個要素的含水印唯一性點集,N為WPoints中的元素個數(shù),wpij為wpi中第j個位置上的點對象,K為wpi中的點個數(shù);至此環(huán)節(jié)二結(jié)束,獲得了已讀取要素m_features所對應的含水印唯一性點集合WPoints;另外,如果是水印提取,則此環(huán)節(jié)將從待檢測數(shù)據(jù)中提取出來的SPoints交給水印提取算法處理,返回提取結(jié)果;環(huán)節(jié)三將含水印的點集WPoints重新裝配給數(shù)據(jù)要素,并生成新的含水印文件vw,分為三個步驟;步驟1、根據(jù)WPoints來對原始的完整點集合MPoints進行處理;遍歷MPoints中的每一個點,仍然根據(jù)環(huán)節(jié)一當中的哈希表來進行判斷,如果以點的X坐標加上Y坐標組成的字符串作為鍵查詢到的值為字符串,則將結(jié)果字符串解析,得到在WPoints中的索引號,然后將此索引位置上的點的幾何屬性賦給正在遍歷的點,并將哈希表中的值替換為該索引位置上的IFMEOPoint;如果查詢到的值為IFMEOPoint類型,則直接將此IFMEOPoint的幾何屬性賦給正在遍歷的點,得到含水印完整點集MPoints’;步驟2、將MPoints’重新裝配回數(shù)據(jù)要素,分為三種情況1)遍歷Points當中的每一個要素,要素的索引號即對應了MPoints’中唯一的數(shù)組元素中的索引位置,此位置上的IFMEOPoint就是對應點要素經(jīng)過處理后的結(jié)果;將此索引位置上的IFMEOPoint的幾何屬性賦給正在遍歷的點要素的IFMEOPoint對象,得到處理后的點要素集合Points’;2)遍歷Lines當中的每一個要素,要素的索引號即對應了MPoints’中的數(shù)組元素的索引號;此位置上的泛型類對象中存儲的就是對應線要素經(jīng)過處理后的點集;依次對此泛型類對象中存儲的點使用線要素中IFMEOLine對象的SetPointAt方法來重新設置線要素中的每一個IFMEOPoint,得到處理后的線要素集合Lines’;3)遍歷Polygons當中的每一個要素,要素的索引號即對應了MPoints’中的數(shù)組元素的索引號;此位置上的泛型類對象中存儲的就是對應面要素經(jīng)過處理后的點集。;依次對此泛型類對象中存儲的點使用面要素中IFMEOLine對象的SetPointAt方法來重新設置面要素中的每一個IFMEOPoint,將重新設置后的IFMEOLine對象轉(zhuǎn)換為IFMEOCurve,然后對此IFMEOCurve對象使用IFMEOGeometryTools的CreatePolygonByCurve方法,生成新的IFMEOPolygon對象,最后利用正在遍歷的IFMEOFeature要素的SetGeometry方法,將新的IFMEOPolygon對象賦給當前要素,得到處理后的面要素集合Polygons’;步驟3、將含水印的要素寫入新的數(shù)據(jù)文件vw當中;利用環(huán)節(jié)一中用戶所指定的des_format來實現(xiàn)IFMEOWriter接口,進而調(diào)用此接口的AddSchema方法以及Writer方法來分別寫入數(shù)據(jù)的模式要素和幾何要素;直接按照存儲容器中的順序依次寫入IFMEOFeature,最后得到含水印信息的矢量數(shù)據(jù)文件vw。全文摘要本發(fā)明公開了一種GIS矢量數(shù)據(jù)水印嵌入與提取的數(shù)據(jù)格式自適應方法,本發(fā)明利用FMEObjects的基于語義的統(tǒng)一數(shù)據(jù)讀寫接口以及要素類型點集化抽象方法,提出一種能夠支持目前主流GIS矢量數(shù)據(jù)格式的水印信息嵌入與提取方案,實現(xiàn)了水印嵌入與提取算法對多種GIS矢量數(shù)據(jù)格式的自適應應用能力,解決了進行GIS矢量數(shù)據(jù)水印信息嵌入與提取時的數(shù)據(jù)格式限制問題,使得在對數(shù)據(jù)進行處理時采用統(tǒng)一的方法進行操作,而無須考慮具體的數(shù)據(jù)格式,在嵌入與提取水印時也無須考慮具體的要素類型。文檔編號G06T1/00GK101877119SQ20091023494公開日2010年11月3日申請日期2009年11月20日優(yōu)先權(quán)日2009年11月20日發(fā)明者左超,曹江華,李安波,閭國年申請人:南京師范大學