海量栅格瓦块地图发布方法
技术领域
本发明涉及一种地图发布方法,尤其涉及一种海量栅格瓦块地图发布方法。
背景技术
Web GIS是Internet技术应用于GIS开发的地理信息系统。其使用的静态背景地图多采用预先生成栅格瓦块地图,然后通过HTTP(HyperText TransferProtocol,超文本传输协议)的方式发布。这种方式减少了服务器端动态生成地图图片的计算压力,是目前采用最多的Web GIS技术之一。
栅格瓦块地图一般的发布方式是:使用工具把矢量地图按行列切割为大小统一的栅格小图片并存储于地图目录Root下;然后将这些栅格小图片拷贝至Web服务器上并发布出去;客户端程序根据当前地图范围计算待加载的栅格小图片的URL(Universal Resource Locator,统一资源定位符)路径,并根据该URL路径查找对应栅格小图片的存储位置;最后客户端通过HTTP加载对应的栅格小图片。
目前,栅格瓦块地图一般通过IIS软件进行发布出去,IIS软件发布方式存在以下缺点:将矢量地图切割成海量栅格小图片,增大了磁盘空间的占有量,此外在栅格小图片存储于地图目录Root过程中,针对大量相同的图片(诸如空白图片)均按照行列分别重复存储,进一步增大了磁盘空间的占有量;
将栅格小图片拷贝至Web发布服务器上并发布出去,由于海量栅格小图片的数量较多,需要消耗较长的时间来拷贝数据;
在根据URL路径查找对应栅格小图片的位置时,IIS软件只能依赖文件系统,几乎每次访问,都要进行磁盘IO,查找效率低。
发明内容
本发明旨在至少解决现有技术中存在的技术问题,特别创新地提出了一种海量栅格瓦块地图发布方法,将海量栅格小图片打包至数据文件中,并对相同的文件只进行一次存储分配,减小了磁盘空间的占有量;在根据URL路径查找对应栅格小图片时,不是依赖于文件系统逐一查找,而是通过索引的形式查找,提高了查找效率。
为了实现本发明的上述目的,本发明提供了一种海量栅格瓦块地图发布方法,其特征在于包括以下步骤:
S1、将矢量地图切割成多个栅格小图片并存储于地图目录Root中,遍历该地图目录Root中的栅格小图片并打包至数据文件中;
S2、建立索引文件,该索引文件用于表示URL路径与数据文件中对应栅格小图片存储位置的索引关系;
S3、根据客户端请求的URL路径以及索引文件,在数据文件中查找与该URL路径对应的栅格小图片的存储位置,读取该栅格小图片并发送给客户端。
本发明将海量栅格小图片打包至数据文件中,并对相同的文件只进行一次存储分配,减小了磁盘空间的占有量;在根据URL路径查找对应栅格小图片时,不依赖于文件系统逐一查找,而是通过索引的形式查找,提高了查找效率。
所述步骤S1由以下步骤组成:
S10、将矢量地图切割成多个栅格小图片并存储于地图目录Root中,针对大量内容相同的栅格小图片设置模板文件T=(path,size,context,fno,offset),其中T.path表示模板文件T的存储路径,T.size表示模板文件T的大小,T.context表示模板文件T的内容,T.fno表示模板文件T所在数据文件Fi的编号,T.offset表示模板文件T在数据文件Fi中的偏移,初始状态下T.fno=T.offset=0且i为整数;
S11、设置i=0,打开数据文件Fi,读取模板文件T并将该模板文件T=(path,size,context,fno,offset)写入数据文件Fi中,保存该模板文件T在数据文件Fi中的偏移T.offset且T.fno=i;
S12、深度遍历该地图目录Root,依次读取该地图目录Root下各栅格小图片LF=(path,size,context,fno,offset),其中LF.path表示栅格小图片LF的存储路径,LF.size表示栅格小图片LF的大小,LF.context表示栅格小图片LF的内容,LF.fno表示栅格小图片LF所在数据文件Fi的编号,LF.offset表示栅格小图片LF在数据文件Fi中的偏移,在初始状态下LF.fno=LF.offset=0;
S13、将各栅格小图片LF与该模板文件T进行比较:
在LF.size=T.size且LF.context=T.context时表示该栅格小图片LF与模板文件T相同,不再将该栅格小图片LF重复写入该数据文件Fi中,并且LF.offset=T.offset,LF.fno=T.fno;
否则表示该栅格小图片LF与模板文件T不相同,进一步判断数据文件Fi是否超过其最大容量值MaxSize:如果判定该数据文件Fi未超过其最大容量值MaxSize,则将LF.context存放至当前的数据文件Fi中,保存该栅格小图片LF在该数据文件Fi中的偏移LF.offset且LF.fno=i;
如果判定该数据文件Fi超过其最大容量值MaxSize,则关闭当前的数据文件Fi,i=i+1;打开下一数据文件Fi,将LF.context存放至下一数据文件Fi中,并且保存该栅格小图片LF在该数据文件Fi中的偏移LF.offset且LF.fno=i;
S14、判断地图目录Root下是否还存在尚未被读取的栅格小图片,如果存在则重复执行步骤S12~S13,否则关闭当前的数据文件Fi以及中间文件Fdb。
本发明针对大量相同的图片(诸如空白图片),设置模板文件,在将海量栅格小图片打包至数据文件的过程中,首先将栅格小图片与该模板文件进行比较,如果相同则不再重复存储,因此进一步减小了磁盘空间的占有量。
在所述步骤S12中深度遍历该地图目录Root时,按照名称大小顺序依次读取各栅格小图片。由于栅格小图片的名称大小反映了栅格小图片在空间上的临近关系,当加载某一栅格小图片时会将与其临近的图片一起加载,从而可以减少磁盘IO的访问次数,提高服务性能。
所述步骤S2由以下步骤组成:
S20、初始化路径哈希表Hash_Path、文件名哈希表Hash_Name和数组FArray={},其中该路径哈希表Hash_Path中路径的标号Path_ID初始化为0,该文件名哈希表Hash_Name中文件名的标号Name_ID初始化为0;
S21、在地图目录Root中的栅格小图片打包至数据文件的过程中,依次将各栅格小图片LF=(path,size,fno,offset)写入Fdb中间文件,在建立索引文件的过程中打开该中间文件Fdb,其中LF.path表示栅格小图片LF的存储路径,LF.size表示栅格小图片LF的大小,LF.fno表示栅格小图片LF所在数据文件Fi的编号,LF.offset表示栅格小图片LF的在数据文件Fi中的偏移;
S22、从该中间文件Fdb中读取一个栅格小图片LF的存储路径LF.path,并将LF.path分解为路径部分PATH和文件名部分NAME;
S23、按照栅格小图片的读取顺序对该栅格小图片的路径部分PATH和文件名部分NAME分别进行标号,其中路径部分PATH的标号记为PID,文件名部分NAME的标号记为NID,如果路径哈希表Hash_Path中不存在PATH,则PID=PID+1,并将(PATH,PID)插入Hash_Path中;如果文件名哈希表Hash_Name中不存在NAME,则NID=NID+1,并将(NAME,NID)插入该文件名哈希表Hash_Name中;
S24、确定该栅格小图片的标号FID=PID<<16|NID,并且将(FID,LF.size,LF.fno,LF.offset)存储至数组FArray{}末尾,其中<<表示左移运算符,|表示或运算符;
S25、重复执行步骤S22~S24,直至该中间文件Fdb中所有栅格小图片读取完成;
S26、按照各栅格小图片的标号FID大小对该数组FArray{}进行排序;
S27、将该路径哈希表Hash_Path、文件名哈希表Hash_Name以及数组FArray{}的内容写入索引文件中,建立索引文件。
在建立索引文件的过程中,本发明采用路径名与文件名分别压缩编码的方式,减少索引所占的空间,达到了压缩的目的,索引文件可一次性读入内存;并且利用索引查找栅格小图片时不必访问磁盘,进一步提高了查找效率。
该索引文件通过加密算法进行加密,提高了索引的安全性。
所述步骤S3中根据客户端请求的URL路径以及索引文件,在数据文件中查找与该URL路径对应的栅格小图片的存储位置的步骤为:根据客户端请求的URL路径构造出待加载栅格小图片的路径部分PATH和文件名部分NAME,根据该路径部分PATH和文件名部分NAME查找索引文件的路径哈希表Hash_Path和文件名哈希表Hash_Name,确定该路径部分PATH和文件名部分NAME的标号PID、NID,从而确定待加载栅格小图片的标号FID=PID<<16|NID;
根据待加载栅格小图片的标号FID查找索引文件的数组FArray{},确定待加载栅格小图片的相关信息(FID,LF.size,LF.fno,LF.offset);
根据待加载栅格小图片的相关信息LF.fno和LF.offset,确定待加载栅格小图片所在的数据文件Fi以及在该数据文件Fi中的偏移,从而确定与该URL路径对应的栅格小图片的存储位置。
所述步骤S3中采用数据缓存机制读取该栅格小图片,在读取该栅格小图片时,首先查找缓冲池的缓冲块中是否缓存有该栅格小图片,如果缓冲块中缓存有该栅格小图片则直接从对应的缓冲块中读取该栅格小图片,否则从磁盘的数据文件中查找到该栅格小图片并将该栅格小图片缓存至缓冲块中,并从该缓冲块中读取该栅格小图片。
本发明采用数据缓存机制,使用缓存块,一次性加载相邻的小图片,对即将访问的小图片进行预加载,减少了磁盘访问次数,提高了访问效率。
该海量栅格瓦块地图发布方法还包括增量发布的步骤:对增加的地图单独切割成多个栅格小图片,打包至一个单独的数据文件中,并建立同一索引文件。
该海量栅格瓦块地图发布方法还包括局部更新的步骤:对更新的地图重新切割成多个栅格小图片,打包至一个单独的数据文件中,并建立同一索引文件。
综上所述,由于采用了上述技术方案,本发明的有益效果是:
1、本发明将海量栅格小图片打包至数据文件中,减小了磁盘空间的占有量;在根据URL路径查找对应栅格小图片时,不是依赖于文件系统逐一查找,而是通过索引的形式查找,提高了查找效率;此外,该索引文件存储在内存中,利用索引文件查找栅格小图片时不必访问磁盘,进一步提高了查找效率;
2、本发明针对大量相同的图片(诸如空白图片),设置模板文件,在将海量栅格小图片打包至数据文件的过程中,首先将栅格小图片与该模板文件进行比较,如果相同则不再重复存储,因此进一步减小了磁盘空间的占有量;
3、深度遍历该地图目录Root时,按照名称大小顺序依次读取各栅格小图片,由于栅格小图片的名称大小反映了栅格小图片在空间上的临近关系,当加载某一栅格小图片时会将与其临近的图片一起加载,从而可以减少磁盘IO的访问次数,提高服务性能;
4、在建立索引文件的过程中,本发明采用路径和文件名压缩编码的方式减少了相同路径与同名文件的数量,达到了压缩的目的,减少了内存使用量;
5、索引文件通过加密算法进行加密,提高了索引的安全性;
6、本发明采用数据缓存机制读取该栅格小图片,减少了磁盘访问次数,提高了访问效率;
7、本发明支持增量发布和局部更新,避免了全范围内地图的重新切割,减少了工作量。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1是栅格小图片的地图目录Root的第一示意图;
图2是栅格小图片的地图目录Root的第二示意图;
图3是本发明的工作流程图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
该海量栅格瓦块地图发布方法由以下步骤组成,如图3所示:
S1、将矢量地图切割成多个栅格小图片并存储于地图目录Root中,遍历该地图目录Root中的栅格小图片并打包至数据文件中。
本发明将海量栅格小图片打包至数据文件中,减小了磁盘空间的占有量。
以ESRI的ArcMap Server的切图为例,说明栅格小图片的地图目录Root,如图1~2所示:Layers目录下包含“_alllayers”目录和两个配置文件:“conf.cdi”、“conf.xml”。“_alllayers”目录下包括所有层的目录,以“LXX”为层目录名,编号从00开始,“L00”表示最小比例的地图目录,“L01”表示第二层次的地图目录,以此类推。
在某一个层的地图目录中,包含了行地图目录,名称以字母‘R’开始,后跟8为十六进制数字,表示行编号。此外,在行地图目录中,包含了该行的所有列图片,图片名称以字母C开始,后跟8位十六进制以及图片文件扩展名(诸如png、jpg等)。
具体地,该过程由以下步骤组成:
第一步、将矢量地图切割成多个栅格小图片并存储于地图目录Root中,针对大量内容相同的栅格小图片设置模板文件T=(path,size,context,fno,offset),其中T.path表示模板文件T的存储路径,T.size表示模板文件T的大小,T.context表示模板文件T的内容,T.fno表示模板文件T所在数据文件Fi的编号,T.offset表示模板文件T在数据文件Fi中的偏移,初始状态下T.fno=T.offset=0且i为整数。
第二步、设置i=0,打开数据文件Fi,读取模板文件T并将该模板文件T=(path,size,context,fno,offset)写入数据文件Fi中,保存该模板文件T在数据文件Fi中的偏移T.offset且T.fno=i。
第三步、深度遍历该地图目录Root,依次读取该地图目录Root下各栅格小图片LF=(path,size,context,fno,offset),其中LF.path表示栅格小图片LF的存储路径,LF.size表示栅格小图片LF的大小,LF.context表示栅格小图片LF的内容,LF.fno表示栅格小图片LF所在数据文件Fi的编号,LF.offset表示栅格小图片LF在数据文件Fi中的偏移,在初始状态下LF.fno=LF.offset=0。在深度遍历该地图目录Root时,按照名称大小顺序依次读取各栅格小图片。
第四步、将各栅格小图片LF与该模板文件T进行比较:
在LF.size=T.size且LF.context=T.context时表示该栅格小图片LF与模板文件T相同,不再将该栅格小图片LF重复写入该数据文件Fi中,并且LF.offset=T.offset,LF.fno=T.fno;
否则表示该栅格小图片LF与模板文件T不相同,进一步判断数据文件Fi是否超过其最大容量值MaxSize:如果判定该数据文件Fi未超过其最大容量值MaxSize,则将LF.context存放至当前的数据文件Fi中,保存该栅格小图片LF在该数据文件Fi中的偏移LF.offset且LF.fno=i,MaxSize≤4G;
如果判定该数据文件Fi超过其最大容量值MaxSize,则关闭当前的数据文件Fi,i=i+1,打开下一数据文件Fi,将LF.context存放至下一数据文件Fi中,并且保存该栅格小图片LF在该数据文件Fi中的偏移LF.offset且LF.fno=i+1;
第五步、判断地图目录Root下是否还存在尚未被读取的栅格小图片,如果存在则重复执行第三至第四步,否则关闭当前的数据文件Fi,结束打包操作。
由此可见,本发明针对大量相同的图片(诸如空白图片),设置模板文件,在将海量栅格小图片打包至数据文件的过程中,首先将栅格小图片与该模板文件进行比较,如果相同则不再重复存储,因此进一步减小了磁盘空间的占有量。此外,深度遍历该地图目录Root时,按照名称大小顺序依次读取各栅格小图片,由于栅格小图片的名称大小反映了栅格小图片在空间上的临近关系,当加载某一栅格小图片时会将与其临近的图片一起加载,从而可以减少磁盘IO的访问次数,提高服务性能。
S2、建立索引文件并采用路径名与文件名分别压缩编码的方式,减少磁盘内存占用量,可一次性读入内存中,该索引文件用于表示URL路径与数据文件中对应栅格小图片存储位置的索引关系。
在根据URL路径查找对应栅格小图片时,不是依赖于文件系统逐一查找,而是通过索引的形式查找,提高了查找效率。此外,该索引文件存储在内存中,利用索引文件查找栅格小图片时不必访问磁盘,进一步提高了查找效率。
具体地,该过程由以下步骤组成:
第一步、初始化路径哈希表Hash_Path、文件名哈希表Hash_Name和数组FArray={},其中该路径哈希表Hash_Path中路径的标号Path_ID初始化为0,该文件名哈希表Hash_Name中文件名的标号Name_ID初始化为0。
第二步,在地图目录Root中的栅格小图片打包至数据文件过程中,依次将栅格小图片LF=(path,size,fno,offset)写入中间文件Fdb中,在建立索引文件的过程中打开该中间文件Fdb。
第三步、从该中间文件Fdb中读取一个栅格小图片LF的存储路径信息LF.path,并将LF.path分解为路径部分PATH和文件名部分NAME。
第四步、按照栅格小图片的读取顺序对该栅格小图片的路径部分PATH和文件名部分NAME分别进行标号,其中路径部分PATH的标号记为PID,文件名部分NAME的标号记为NID,并将(PATH,PID)插入该路径哈希表Hash_Path中,将(NAME,NID)插入该文件名哈希表Hash_Name中。
在本发明的实施例中,从0开始没依次加1,分别对各栅格小图片的路径部分PATH和文件名部分NAME分别进行标号:
判断路径哈希表Hash_Path中是否存在PATH:如果不存在,则该栅格小图片的路径部分PATH的标号PID=PID+1,并将(PATH,PID)插入该路径哈希表Hash_Path中;
判断该文件名哈希表Hash_Name中是否存在NAME:如果不存在,则该栅格小图片的文件名部分NAME的标号NID=NID+1,并将(NAME,NID)插入该文件名哈希表Hash_Name中。
第五步、确定该栅格小图片的标号FID=PID<<16|NID,并且将(FID,LF.size,LF.fno,LF.offset)存储至数组FArray{}末尾,其中<<表示左移运算符,|表示或运算符。
第六步、重复执行第三步至第五步,直至该中间文件Fdb中所有栅格小图片读取完成。
第七步、按照各栅格小图片的标号FID大小对该数组FArray{}进行排序。
第八步、将该路径哈希表Hash_Path、文件名哈希表Hash_Name以及数组FArray{}的内容写入索引文件中。此外,该索引文件还可以采用加密算法进行加密,从而提高索引的安全性。
由此可见,在建立索引文件的过程中,本发明采用路径和文件名压缩编码的方式减少了相同路径与同名文件的数量,达到了压缩的目的,减少了内存使用量。
S3、根据客户端请求的URL路径以及索引文件,在数据文件中查找与该URL路径对应的栅格小图片的存储位置,读取该栅格小图片并发送给客户端。
具体地,根据客户端请求的URL路径构造出待加载栅格小图片的路径部分PATH和文件名部分NAME,根据该路径部分PATH和文件名部分NAME查找索引文件的路径哈希表Hash_Path和文件名哈希表Hash_Name,确定该路径部分PATH和文件名部分NAME的标号PID、NID,从而确定待加载栅格小图片的标号FID=PID<<16|NID;
根据待加载栅格小图片的标号FID查找索引文件的数组FArray{},确定待加载栅格小图片的相关信息(FID,LF.size,LF.fno,LF.offset);
根据待加载栅格小图片的相关信息LF.fno和LF.offset,确定待加载栅格小图片所在的数据文件Fi以及在该数据文件Fi中的偏移,从而确定与该URL路径对应的栅格小图片的存储位置。
为了减少磁盘访问次数,提高访问效率,本发明提出了数据缓存机制,对最近读取的栅格小图片以缓冲块的形式缓存在缓冲池中。在读取该栅格小图片时,首先查找缓冲池的缓冲块中是否缓存有该栅格小图片,如果缓冲块中缓存有该栅格小图片则直接从对应的缓冲块中读取该栅格小图片,否则从磁盘的数据文件中查找到该栅格小图片并将该栅格小图片缓存至缓冲块中,并从该缓冲块中读取该栅格小图片。最近被访问的缓冲块被移动至缓冲块队列的头部。当缓存池空间超过一定数量,就需要从其中删除一部分缓存块,以释放资源,删除方法:从缓存队列的末尾开始向前搜索,如果某一个缓存块的引用计数为0,就可以删除,这样可以保证最近访问的缓存块最后被删除。
本发明还支持增量发布和局部更新,避免了全范围内地图的重新切割,减少了工作量。增量发布的步骤为:对增加的地图单独切割成多个栅格小图片,打包至一个单独的数据文件中,并建立同一索引文件;局部更新的步骤为:对更新的地图重新切割成多个栅格小图片,打包至一个单独的数据文件中,并建立同一索引文件。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。