一种gis矢量数据水印嵌入与提取的数据格式自适应方法

文档序号:6584321阅读:375来源:国知局

专利名称::一种gis矢量数据水印嵌入与提取的数据格式自适应方法
技术领域
:本发明属于地理信息版权保护领域,具体涉及一种在对GIS矢量数据进行水印嵌入与提取时无须考虑数据格式与要素类型的解决方法,属于矢量数据处理技术。
背景技术
:GIS矢量数据产品作为一种重要的地理信息载体,其数据安全及版权保护问题至关重要。目前对GIS矢量数据的版权保护主要是采用数字水印技术。国内外关于如何在矢量数据中嵌入水印已经有了比较成熟的研究,基础算法理论方面已经有了相当数量的文献可供查阅,也出现了很多具体的实际应用,但由于矢量数据在数据格式上的多样性与复杂性,诸多算法与应用仅能应用于特定的一种或几种数据格式,针对GIS矢量数据格式的自适应能力较差。面对众多的GIS软件及其自主开发、不够规范、不够公开的数据模型,目前主要采取在某特定格式数据的数据接口或者自主底层开发数据读写接口的基础上,进行GIS矢量数据数字水印嵌入与提取算法的编写。但这两种方式都有各自的缺点,前者支持格式单一,一般来说,采用哪一种软件的数据接口就只能读写该软件的数据类型,极大地限制了算法所能应用的数据类型;而后者在开发上十分繁琐,需要有针对性的为各种数据格式定制读写方案,技术难度较大,工作量极为繁重,并且随GIS的日益发展,需要处理的格式越来越^^o
发明内容本发明的目的在于解决进行矢量数据水印信息嵌入与提取时的数据格式限制问题,提出一种能够支持目前主流矢量数据格式的水印信息嵌入与提取方案,使得在对数据进行处理时采用统一的方法进行操作,而无须考虑具体的数据格式,在嵌入与提取水印时也无须考虑具体的要素类型。为达到上述目的,本发明采用如下思路一方面,读写矢量数据部分采用FMEObjects的基于语义的统一数据读写接口,用户可将对各种格式GIS矢量数据的操作统一于FMEObjects的要素类型来进行,而不依赖于具体的格式,从而满足了算法在数据格式上充分的自适应能力;另一方面,由于对矢量数据的处理实质都是对其所包含的点坐标进行处理,因此,将所有读取获得的GIS矢量数据要素(简称矢量数据要素、数据要素或要素)按其原始ID顺序分别转换为点集,即不管要素类型是点、线或面,全部转换成点的集合,所有这些点的集合便可以交给水印算法进行嵌入,嵌入完毕后,再将含水印点集按其原本的要素类型装配回去,最后按照原本的ID顺序将这些要素写入对应的数据文件当中,这样便使得在对数据进行水印嵌入与提取时,统一抽象为点集合的形式进行处理,而无需考虑具体的要素类型,从而可以令水印算法的编写变得更加有针对性,编写者更多的专注于算法本身,而无需耗费大量的精力进行多格式GIS矢量数据的读写处理。本发明的技术方案主要是基于FMEObjects开发包及点集抽象技术来统一实现对矢量数据V的统一读取、点集组织、嵌入水印信息w及存储为新的含水印数据vw。本发明GIS矢量数据水印嵌入与提取的数据格式自适应方法,其主要步骤如下环节一读取数据要素,并转换成点集合SPoints。具体过程为步骤1、根据用户指定的数据格式及文件路径信息snformat进行数据读取,同时存储用户指定的保存格式及路径信息des_format。src_format、des_format均为FMEOFormatlnfo类。将src_format传递给IFMEOReader接口并调用其ReadSchema方法以及Read方法来分别读取数据的模式要素和几何要素。此接口会根据用户所传递的格式信息透明实现相应数据格式的自动匹配与工作,用户和开发者均无需考虑其底层如何实现的;步骤2、按照原始文件V中的ID序号依次存储所读取的矢量数据要素f,得到要素集合m_features。本方法采用分批读取策略,每次只读取一批要素,待处理完毕再读取下一批。每一批要素可视为V中的一个要素子集合F,如式(1)。F={fi,0^i^N-l}(1)其中N为当前分批数据中的要素个数。Read方法读取出来的均为IFMEOFeature类型,为避免过多的强类型转换,且能保留原始的要素顺序,本方案利用.net中的泛型类容器List<IFME0Feature>来存储每一个读取出来的数据要素,要素在容器中的索引号即为其在这批数据中的相对位置,如式(2)。m—features={m_featuresi|m_featuresi=fi0^i^N-l}(2)其中N为当前分批数据中的要素个数。步骤3、将临时存储容!m_featUreS中的数据要素按不同的几何类型归类为Points,Lines和Polygons三类,依次得到其对应的点集合MPoints并进行后面步骤的处理,MPoints为泛型类数组List<IFME0Point>[]。1)几何类型为Point的要素,全部归类到Points集合中,Points同样为泛型类容器。利用IFMEOFeature接口中的GetGeometry方法获取Points集合中第i个要素的几何体并直接转换为IFMEOPoint对象Pi,存储到MPoints唯一的数组元素中的第i个位置上,每一个位置对应了一个点要素,如式(3)。这样就获得了点类型要素的点集合。MPoints={MPoints0i|MPoints0i=p^O^i^N-l}(3)其中,N为容器中的要素个数。2)几何类型为Line的要素,全部归类到Lines集合中,Lines同样为泛型类容器。利用IFMEOFeature接口中的GetGeometry方法获取Lines集合中第i个要素的几何体,并转换为IFMEOLine类型,再使用IFMEOLine的GetPointAt方法获取线要素中的第j个IFMEOPoint对象Pij,将其添加到MPoints中的第i个数组元素当中的第j个位置,每一个数组元素对应了一个线要素中的点集合,如式(4)。这样就获得了线类型要素的点集合。MPoints={MPointSj|MPointSj=p^O^i^N-l}Pi={PiJ,0彡j彡M-l}(4)其中,N为容器中的要素个数,Pi为第i个要素的点集,M为Pi中的点的个数。3)几何类型为Polygon的要素,全部归类到Polygons集合中,Polygons同样为泛型类容器。利用IFMEOFeature接口中的GetGeometry方法获取Polygons集合中第i个要素的几何体,并转换为IFMEOPolygon类型,然后使用IFMEOPolygon中的GetBoundaryAsCurve方法获取面的边界对象IFMEOCurve,再使用IFMEOCurve的GetAsLine方法转换为IFMEOLine,最后使用IFMEOLine的GetPointAt方法获取当中的第j个IFMEOPoint对象PU,将其添加到MPoints中的第i个数组元素当中的第j个位置,每一个数组元素对应了一个面要素中的点集合,同式(4)这样就获得了面类型要素的点集合。步骤4、获取具有唯一性的点集合SPoints,SPoints为泛型类数组。由于矢量数据中不可避免的会有很多重合的边界,即会有很多重复的点,为保证之前重合的关系不会变化,因此对原本重合的点必须做相同的处理。本方法首先提取具有唯一性的点集。遍历MPoints中的每一个点,利用.net中的Hashtable作为判断依据,以点的X坐标加上Y坐标组成的字符串作为键查询,如果哈希表中存在此键,则说明已有重合的点加入了,不考虑此点;如果不存在,则将此点添加到SPoints中对应的数组元素里,并以该点的X坐标加上Y坐标组成的字符串作为键,以数组元素的索引号i加上元素内部的索引号j组成的字符串作为值添加到哈希表中。至此环节一结束,获得了已读取要素m_featureS所对应的唯一性点集合SPoints,表示为下式SPoints={sp^O彡i彡N_l,}sPi={sPiJ,0(j(K-l}(5)sPi为第i个要素的唯一性点集,N为SPoints中的元素个数,sPij为sPi中第j个位置上的点对象,K为sPi中的点个数。环节二嵌入水印信息w,获得含水印点集WPoints。水印算法无论在具体实现上有多大不同,均是基于一致的水印嵌入模型(式(6))来实现的。WPoints=Em(SPoints,w)(6)Em表示将水印信息w嵌入点集SPoints中的嵌入算法。Em主要是将水印信息w循环嵌入到唯一性点集SPoints当中。因此,将环节一中获得的唯一性点集SPoints交给水印算法处理,即可满足GIS矢量数据水印嵌入算法的需要。算法的一般处理过程如下1)配置嵌入参数。获取点集SPoints、水印信息序列w、嵌入位置、嵌入次数等参数;2)生成水印信息嵌入序列w’。根据上述参数以及点集的嵌入容量综合确定需要具体嵌入到每一个点sPij中的水印信息,从而得到一个跟SPoints组织方式相同的水印序列w’。如下式w'={w^O^i^N-1}Wi={Wij.,0彡j彡K-l}(7)其中Wi表示sPi要嵌入的水印信息集合,N为w'中的子集合个数,WiJ为嵌入到sPiJ中的二进制水印信息,K为Wi中的元素个数。水印信息嵌入序列w'可能会是一个内容不断重复的序列,以达到循环嵌入的目的。这是由点集的嵌入容量以及嵌入次数所决定的。3)将水印信息嵌入序列对应地嵌入到点集当中每一个点的坐标属性里,得到含水印点集WPoints,WPoints的结构与SPoints相同,如式(8)。WPoints={wp^O^i^N-1,}wpi={wpij.,0彡i彡K-l}(8)wPi为第i个要素的含水印唯一性点集,N为WPoints中的元素个数,wPij为wPi中第j个位置上的点对象,K为wPi中的点个数。至此环节二结束,获得了已读取要素m_featureS所对应的含水印唯一性点集合WPoints.另外,如果是水印提取,则此环节将从待检测数据中提取出来的SPoints交给水印提取算法处理,返回提取结果。环节三将含水印的点集WPoints重新装配给数据要素,并生成新的含水印文件vw,分为三个步骤步骤1、根据WPoints来对原始的完整点集合MPoints进行处理;遍历MPoints中的每一个点,仍然根据环节一当中的哈希表来进行判断,如果以点的X坐标加上Y坐标组成的字符串作为键查询到的值为字符串,则将结果字符串解析,得到在WPoints中的索引号,然后将此索引位置上的点的几何属性赋给正在遍历的点,并将哈希表中的值替换为该索引位置上的IFMEOPoint;如果查询到的值为IFMEOPoint类型,则直接将此IFMEOPoint的几何属性赋给正在遍历的点,得到含水印完整点集MPoints’;步骤2、将MPoints’重新装配回数据要素,分为三种情况1)遍历Points当中的每一个要素,要素的索引号即对应了MPoints’中唯一的数组元素中的索引位置,此位置上的IFMEOPoint就是对应点要素经过处理后的结果;将此索引位置上的IFMEOPoint的几何属性赋给正在遍历的点要素的IFMEOPoint对象,得到处理后的点要素集合Points’;2)遍历Lines当中的每一个要素,要素的索引号即对应了MPoints’中的数组元素的索引号;此位置上的泛型类对象中存储的就是对应线要素经过处理后的点集;依次对此泛型类对象中存储的点使用线要素中IFMEOLine对象的SetPointAt方法来重新设置线要素中的每一个IFMEOPoint,得到处理后的线要素集合Lines’;3)遍历Polygons当中的每一个要素,要素的索引号即对应了MPoints’中的数组元素的索引号;此位置上的泛型类对象中存储的就是对应面要素经过处理后的点集;依次对此泛型类对象中存储的点使用面要素中IFMEOLine对象的SetPointAt方法来重新设置面要素中的每一个IFMEOPoint,将重新设置后的IFMEOLine对象转换为IFMEOCurve,然后对此IFMEOCurve对象使用IFMEOGeometryTools的CreatePolygonByCurve方法,生成新的IFMEOPolygon对象,最后利用正在遍历的IFMEOFeature要素的SetGeometry方法,将新的IFMEOPolygon对象赋给当前要素,得到处理后的面要素集合Polygons’;步骤3、将含水印的要素写入新的数据文件vw当中;利用环节一中用户所指定的des_format来实现IFMEOWriter接口,进而调用此接口的AddSchema方法以及Writer方法来分别写入数据的模式要素和几何要素;直接按照存储容器中的顺序依次写入IFMEOFeature,最后得到含水印信息的矢量数据文件vw。本发明利用FMEObjects的基于语义的统一数据读写接口以及要素类型点集化抽象方法,提出一种能够支持目前主流GIS矢量数据格式的水印信息嵌入与提取方案,实现了水印嵌入与提取算法对多种GIS矢量数据格式的自适应应用能力,解决了进行GIS矢量数据水印信息嵌入与提取时的数据格式限制问题,使得在对数据进行处理时采用统一的方法进行操作,而无须考虑具体的数据格式,在嵌入与提取水印时也无须考虑具体的要素类型。图1基于FMEObjects的矢量数据格式自适应水印信息嵌入流程2中国县级行政区划矢量数据图3选择数据格式以及路径的界面图4FME0bjects的格式库截5针对数据要素与点集合的操作类6针对唯一性点集的操作类7水印提取结果验证截图具体实施例方式下面结合附图和实施例做进一步详细说明。实施例1本发明所提出的基于FMEObjects的矢量数据格式自适应水印信息嵌入与提取是基于二次开发的解决方案,其采用需依赖于程序代码实现。本实例以采用该方案而开发的矢量数据水印系统为基础,选择一种典型的GIS矢量数据,针对其读取、组织、水印嵌入、保存、水印提取的整个过程,给出本发明的一个实施例,进一步详细说明本发明。本实施例选择中国县级行政区划矢量数据作为实验数据,数据格式为shp,面图层。水印标记内容为“南京师范大学地理科学学院”文本信息,对应的二进制水印序列w为10000111101000100001110001100100…。已实现的水印系统的开发是基于FMEObjects开发包,以WindowsXPSP2为操作系统环境,VisualStudio2005为开发环境,c#为开发语言。如图1所示,是本发明所提出的基于FMEObjects的矢量数据格式自适应水印信息嵌入流程图。整个流程分为以下几个部分步骤一、通过FMEObjects内封装的IFMEODialog对话框来选择实验用的数据格式以及路径。数据格式为shp,数据V为中国县级行政区划图B0UNT_poly(图2),选择界面如图3所示。数据格式的选择是利用FMEObjects所提供的FormatsGallery来挑选(图4),格式库中涵盖了目前国际上主流的矢量数据类型,可根据需要选择。本实验选择ESRIShape格式。格式信息及路径信息分别存储到FMEOFormatlnfo类型变量的属性Format和Dadaset当中,供后续部分的IFMEOReader接口调用。同样需要指定嵌入水印后数据的保存格式以及路径。全部指定完毕后,这些数据的有关信息会作为参数传递给系统的读写方法,等待调用。步骤二、数据组织。首先开始对数据要素进行读取,系统默认分批处理。每次读取100个数据要素存储在List<IFME0Feature>泛型类容器m_features中。然后对此容器中的对象按类型归类。这里,m_featUres可表示为{&,f\,f2,...,f99},&为数据文件V中的要素,i为当前要素组中的索引号。因为要素类型均为面类型,所以Polygons容器也表示为{fQ,f\,f2,...,f99},而Lines和Points中个数均为零。步骤三、获取要素集合对应的具有唯一性的点集合。此步骤分为下面两部分1)获取要素集合所对应的完整点集合。系统内实现这部分功能的主要是PointsOperation类中的静态方法,PointsOperation类的类图见图5。本实施例使用的是面类型矢量数据,因此会调用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为输入参数,返回该要素集合所对应的完整的点集合MPoints。MPoints集合可表示为{pQ,Pl,p2,...,p99},Pi为第i个要素的点集。pQ中点的个数为798,Pl中点的个数为787,p2中点的个数为2139,…,p99中点的个数为782。2)获取具有唯一性的点集合完整点集合中不可避免的会有一些重合的点,因此要保证这些重合关系不变,必须获取具有唯一性的点集合来进行水印嵌入,待处理完毕再在后面的步骤中对所有原本重合的点做同样的处理。这里使用UniquePoints类中的静态方法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为输入参数,返回具有唯一性的点集合SPoints。SPoints集合可表示为{spQ,sPl,sp2,...,sp99},sPi为第i个要素的唯一性点集。SpQ中点的个数为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中点的个数为621,sp2中点的个数为1961,…,sp99中点的个数为472。以SPQ中的点为例,其中各点的横坐标值为{x0,Xl,x2,…x797},x0=122.78010001514291,=122.77445997814326,x2=122.77031998541904,…,x797=122.79492998126159。步骤四、水印信息嵌入。系统将唯一性点集SPoints交给水印嵌入算法处理,标记内容为“南京师范大学地理科学学院”。这里选用的水印算法为“低位替换嵌入算法”,嵌入位置为小数点后第5位,嵌入长度为8位。处理完毕获得含水印信息的唯一性点集WPoints。WPoints与SPoints的结构一致,表示为{wp0,wPl,wp2,,wp99},wPi为第i个要素的含水印唯一性点集。但其中点的坐标值已发生了变化,以WP(1中的点为例,其中各点的横坐标值为{xq',x/,x2',...,x797'},x0'=122.780100000032,x/=122.774410000111,x2'=122.7703000111,…,x797'=122.7949000111。步骤五、数据要素的重新装配。此步骤是步骤三的逆过程,首先根据含水印的唯一性点集WPoints来对完整性点集MPoints作处理,得到含水印信息的完整性点集MPoints,。这里使用UniquePoints类中的静态方法SetUniquePoints来实现。接下来将MPoints,重新装配给数据要素,得到含水印信息的数据要素Polygons’。这里调用了PointsOperation类中的静态方法Polygon_setPoints。步骤六、根据步骤一中指定的保存格式及路径信息,将泛型类容器m_featUreS中的数据要素写入新的数据文件当中,得到含水印信息的矢量数据文件vw。嵌入完毕后进行水印信息提取验证。这部分的实质是嵌入过程中步骤一到步骤四的综合,不同的是选择读取的数据为步骤六中新生成的含水印的矢量数据文件vw,另外在步骤四中是将唯一性点集交给水印提取算法进行水印检测。检测得到结果为“南京师范大学地理科学学院”,如图7所示。本实施例仅选择了shp格式的面状数据进行处理,对于FMEObjects支持的其他众多格式以及各种要素类型的矢量数据,本方案同样有效。水印算法方面,本实施例仅选择了低位替换算法进行水印信息的嵌入与提取,对于针对GIS矢量数据的其它水印算法,本方案同样有效。1权利要求一种GIS矢量数据水印嵌入与提取的数据格式自适应方法,其步骤如下环节一读取数据要素,并转换成点集合SPoints;具体过程为步骤1、根据用户指定的数据格式及文件路径信息src_format进行数据读取,同时存储用户指定的保存格式及路径信息des_format。src_format、des_format均为FMEOFormatInfo类;将src_format传递给IFMEOReader接口并调用其ReadSchema方法以及Read方法来分别读取数据的模式要素和几何要素;IFMEOReader接口根据用户所传递的格式信息透明实现相应数据格式的自动匹配与工作;步骤2、按照原始文件V中的ID序号依次存储所读取的矢量数据要素f,得到要素集合m_features;采用分批读取方式,每次只读取一批矢量数据要素,待处理完毕再读取下一批;每一批矢量数据要素可视为V中的一个要素子集合F,如下式F={fi,0≤i≤N-1}(1)其中N为当前分批数据中的矢量数据要素个数;读取出来的矢量数据要素均为IFMEOFeature类型,利用.net中的泛型类容器List<IFMEOFeature>来存储每一个读取出来的矢量数据要素,矢量数据要素在容器中的索引号即为其在这批矢量数据要素中的相对位置,如下式m_features={m_featuresi|m_featuresi=fi,0≤i≤N-1}(2)其中N为当前分批数据中的矢量数据要素个数。步骤3、将临时存储容器m_features中的矢量数据要素按不同的几何类型归类为Points,Lines和Polygons三类,依次得到其对应的点集合MPoints并进行后面步骤的处理,MPoints为泛型类数组List<IFMEOPoint>[];a)几何类型为Point的要素,全部归类到Points集合中,Points同样为泛型类容器;利用IFMEOFeature接口中的GetGeometry方法获取Points集合中第i个要素的几何体并直接转换为IFMEOPoint对象pi,存储到MPoints唯一的数组元素中的第i个位置上,每一个位置对应了一个点要素,如式(3)。这样就获得了点类型要素的点集合。MPoints={MPoints0i|MPoints0i=pi,0≤i≤N-1}(3)其中,N为容器中的要素个数。b)几何类型为Line的要素,全部归类到Lines集合中,Lines同样为泛型类容器。利用IFMEOFeature接口中的GetGeometry方法获取Lines集合中第i个要素的几何体,并转换为IFMEOLine类型,再使用IFMEOLine的GetPointAt方法获取线要素中的第j个IFMEOPoint对象pij,将其添加到MPoints中的第i个数组元素当中的第j个位置,每一个数组元素对应了一个线要素中的点集合,如下式MPoints={MPointsi|MPointsi=pi,0≤i≤N-1}pi={pij,0≤j≤M-1}(4)其中,N为容器中的要素个数,pi为第i个要素的点集,M为pi中的点的个数。这样就获得了线类型要素的点集合;c)几何类型为Polygon的要素,全部归类到Polygons集合中,Polygons同样为泛型类容器;利用IFMEOFeature接口中的GetGeometry方法获取Polygons集合中第i个要素的几何体,并转换为IFMEOPolygon类型,然后使用IFMEOPolygon中的GetBoundaryAsCurve方法获取面的边界对象IFMEOCurve,再使用IFMEOCurve的GetAsLine方法转换为IFMEOLine,最后使用IFMEOLine的GetPointAt方法获取当中的第j个IFMEOPoint对象pij,将其添加到MPoints中的第i个数组元素当中的第j个位置,每一个数组元素对应了一个面要素中的点集合,同式(4),这样就获得了面类型要素的点集合;步骤4、获取具有唯一性的点集合SPoints,SPoints为泛型类数组;首先提取具有唯一性的点集;遍历MPoints中的每一个点,利用.net中的Hashtable作为判断依据,以点的X坐标加上Y坐标组成的字符串作为键查询,如果哈希表中存在此键,则说明已有重合的点加入了,不考虑此点;如果不存在,则将此点添加到SPoints中对应的数组元素里,并以该点的X坐标加上Y坐标组成的字符串作为键,以数组元素的索引号i加上元素内部的索引号j组成的字符串作为值添加到哈希表中;至此环节一结束,获得了已读取要素m_features所对应的唯一性点集合SPoints,表示为下式SPoints={spi,0≤i≤N-1,}spi={spij,0≤j≤K-1}(5)spi为第i个要素的唯一性点集,N为SPoints中的元素个数,spij为spi中第j个位置上的点对象,K为spi中的点个数;环节二嵌入水印信息w,获得含水印点集WPoints;水印算法是基于一致的水印嵌入模型来实现的WPoints=Em(SPoints,w)(6)Em表示将水印信息w嵌入点集SPoints中的嵌入算法;Em是将水印信息w循环嵌入到唯一性点集SPoints当中;将环节一中获得的唯一性点集SPoints交给水印算法处理,即可满足GIS矢量数据水印嵌入算法的需要;水印算法的处理过程如下A)配置嵌入参数;获取点集SPoints、水印信息序列w、嵌入位置、嵌入次数等参数;B)生成水印信息嵌入序列w’;根据上述参数以及点集的嵌入容量综合确定需要具体嵌入到每一个点spij中的水印信息,从而得到一个跟SPoints组织方式相同的水印序列w’,如下式w′={wi,0≤i≤N-1}wi={wij,0≤j≤K-1}(7)其中wi表示spi要嵌入的水印信息集合,N为w′中的子集合个数,wij为嵌入到spij中的二进制水印信息,K为wi中的元素个数;C)将水印信息嵌入序列对应地嵌入到点集当中每一个点的坐标属性里,得到含水印点集WPoints,WPoints的结构与SPoints相同,如下式WPoints={wpi,0≤i≤N-1,}wpi={wpij,0≤j≤K-1}(8)wpi为第i个要素的含水印唯一性点集,N为WPoints中的元素个数,wpij为wpi中第j个位置上的点对象,K为wpi中的点个数;至此环节二结束,获得了已读取要素m_features所对应的含水印唯一性点集合WPoints;另外,如果是水印提取,则此环节将从待检测数据中提取出来的SPoints交给水印提取算法处理,返回提取结果;环节三将含水印的点集WPoints重新装配给数据要素,并生成新的含水印文件vw,分为三个步骤;步骤1、根据WPoints来对原始的完整点集合MPoints进行处理;遍历MPoints中的每一个点,仍然根据环节一当中的哈希表来进行判断,如果以点的X坐标加上Y坐标组成的字符串作为键查询到的值为字符串,则将结果字符串解析,得到在WPoints中的索引号,然后将此索引位置上的点的几何属性赋给正在遍历的点,并将哈希表中的值替换为该索引位置上的IFMEOPoint;如果查询到的值为IFMEOPoint类型,则直接将此IFMEOPoint的几何属性赋给正在遍历的点,得到含水印完整点集MPoints’;步骤2、将MPoints’重新装配回数据要素,分为三种情况1)遍历Points当中的每一个要素,要素的索引号即对应了MPoints’中唯一的数组元素中的索引位置,此位置上的IFMEOPoint就是对应点要素经过处理后的结果;将此索引位置上的IFMEOPoint的几何属性赋给正在遍历的点要素的IFMEOPoint对象,得到处理后的点要素集合Points’;2)遍历Lines当中的每一个要素,要素的索引号即对应了MPoints’中的数组元素的索引号;此位置上的泛型类对象中存储的就是对应线要素经过处理后的点集;依次对此泛型类对象中存储的点使用线要素中IFMEOLine对象的SetPointAt方法来重新设置线要素中的每一个IFMEOPoint,得到处理后的线要素集合Lines’;3)遍历Polygons当中的每一个要素,要素的索引号即对应了MPoints’中的数组元素的索引号;此位置上的泛型类对象中存储的就是对应面要素经过处理后的点集。;依次对此泛型类对象中存储的点使用面要素中IFMEOLine对象的SetPointAt方法来重新设置面要素中的每一个IFMEOPoint,将重新设置后的IFMEOLine对象转换为IFMEOCurve,然后对此IFMEOCurve对象使用IFMEOGeometryTools的CreatePolygonByCurve方法,生成新的IFMEOPolygon对象,最后利用正在遍历的IFMEOFeature要素的SetGeometry方法,将新的IFMEOPolygon对象赋给当前要素,得到处理后的面要素集合Polygons’;步骤3、将含水印的要素写入新的数据文件vw当中;利用环节一中用户所指定的des_format来实现IFMEOWriter接口,进而调用此接口的AddSchema方法以及Writer方法来分别写入数据的模式要素和几何要素;直接按照存储容器中的顺序依次写入IFMEOFeature,最后得到含水印信息的矢量数据文件vw。全文摘要本发明公开了一种GIS矢量数据水印嵌入与提取的数据格式自适应方法,本发明利用FMEObjects的基于语义的统一数据读写接口以及要素类型点集化抽象方法,提出一种能够支持目前主流GIS矢量数据格式的水印信息嵌入与提取方案,实现了水印嵌入与提取算法对多种GIS矢量数据格式的自适应应用能力,解决了进行GIS矢量数据水印信息嵌入与提取时的数据格式限制问题,使得在对数据进行处理时采用统一的方法进行操作,而无须考虑具体的数据格式,在嵌入与提取水印时也无须考虑具体的要素类型。文档编号G06T1/00GK101877119SQ20091023494公开日2010年11月3日申请日期2009年11月20日优先权日2009年11月20日发明者左超,曹江华,李安波,闾国年申请人:南京师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1