一种从Hbase瓦片存储快速导出区域子数据集的方法及装置与流程

文档序号:26938507发布日期:2021-10-12 13:47阅读:91来源:国知局
一种从Hbase瓦片存储快速导出区域子数据集的方法及装置与流程
一种从hbase瓦片存储快速导出区域子数据集的方法及装置
技术领域
1.本发明涉及计算机技术领取,特别地涉及一种从hbase瓦片存储快速导出区域子数据集的方法及装置。


背景技术:

2.单机版数字地球产品需要可以单机访问的地图数据,当前hbase内的切片数据不能满足要求。sqlite提供了一种规范,可以使得数以百万计的瓦片数据存储在一个文件中,因此目前成熟的单机版解决方案之一是将瓦片数据以mbtiles方式存储在sqlite数据库中,通过geowebcache进行访问,则需要把存储在hbase中的瓦片数据部分迁移到sqlite中。
3.但是,如何把hbase中的海量瓦片数据写入sqlite中是一个很大的问题,通常的方法是通过geowebcache自带的生成mbtiles文件方式,但是用这种方式导出全球地图大概需要5年的时间,效率明显太低,而且不能自定义区域导出,灵活性也很差。


技术实现要素:

4.本发明的目的在于提供一种从hbase瓦片存储快速导出区域子数据集的方法及装置,用户可以自定义瓦片数据的导出区域,同时提高了导出效率。
5.为此,根据本发明的第一方面,提供了一种从hbase瓦片存储快速导出区域子数据集的方法,包括:
6.根据两个坐标点的经纬度坐标获取需要导出的瓦片数据的矩形区域;
7.根据所述矩形区域确定scan边界;
8.根据所述scan边界并行地读取hbase的每个region中的瓦片数据,存放到全局变量hashmap中;
9.将所述全局变量hashmap中的瓦片数据以读写分离的方式存入sqlite数据库中。
10.进一步地,所述两个坐标点不在同一个经度或纬度上。
11.进一步地,所述根据所述矩形区域确定scan边界包括:
12.计算出所述矩形区域中每一层每一列瓦片的startkey与endkey,所述startkey与endkey为scan边界。
13.进一步的,所述根据所述scan边界并行地读取hbase的每个region中的瓦片数据,存放到全局变量hashmap中包括:
14.针对瓦片金字塔的每一层,计算出在矩形区域内开始的瓦片和结束的瓦片的层、行、列(lrc)信息;
15.根据所述lrc信息给线程池分发任务,生成多个线程任务;
16.并行地执行所述多个线程任务,每个线程任务根据所述scan边界从一个region中读取相应的瓦片数据;
17.将读取的瓦片数据存放在全局变量hashmap中;
18.所述全局变量hashmap中,key用于存储从region中读取的瓦片数据,value值为
listclass,在listclass类中定义两个arraylist链表和一个index变量,所述index变量用于区别arraylist链表功能,index0表示第一arraylist负责读取数据,第二arraylist负责写入数据,index1表示第一arraylist负责写入数据,第二arraylist负责读取数据。
19.进一步的,所述将所述全局变量hashmap中的瓦片数据以读写分离的方式存入sqlite数据库中包括:
20.根据所述全局变量hashmap中的index变量确定arraylist链表功能;
21.根据arraylist链表的功能将所述全局变量hashmap中的瓦片数据以读写分离的方式数据存入sqlite数据库中。
22.根据本发明的第二方面,提供了一种从hbase瓦片存储快速导出区域子数据集的装置,包括:
23.获取模块,用于根据两个坐标点的经纬度坐标获取需要导出的瓦片数据的矩形区域;
24.确定模块,用于根据所述矩形区域确定scan边界;
25.读取模块,用于根据所述scan边界并行地读取hbase的每个region中的瓦片数据,存放到全局变量hashmap中;
26.存储模块,用于将所述全局变量hashmap中的瓦片数据以读写分离的方式存入sqlite数据库中。
27.进一步地,所述确定模块具体用于:
28.计算出所述矩形区域中每一层每一列瓦片的startkey与endkey,所述startkey与endkey为scan边界。
29.进一步地,所述读取模块具体用于:
30.针对瓦片金字塔的每一层,计算出在矩形区域内开始的瓦片和结束的瓦片的层、行、列(lrc)信息;
31.根据所述lrc信息给线程池分发任务,生成多个线程任务;
32.并行地执行所述多个线程任务,每个线程任务根据所述scan边界从一个region中读取相应的瓦片数据;
33.将读取的瓦片数据存放在全局变量hashmap中。
34.进一步地,所述全局变量hashmap中,key用于存储从region中读取的瓦片数据,value值为listclass,在listclass类中定义两个arraylist链表和一个index变量,所述index变量用于区别arraylist链表功能,index0表示第一arraylist负责读取数据,第二arraylist负责写入数据,index1表示第一个arraylist负责写入数据,第二arraylist负责读取数据。
35.进一步地,所述存储模块具体用于:
36.根据所述全局变量hashmap中的index变量确定arraylist链表功能;
37.根据arraylist链表的功能将所述全局变量hashmap中的瓦片数据以读写分离的方式数据存入sqlite数据库中。
38.本发明的附加方面和优点将在下面的描述部分中给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
39.本发明具有的有益效果是:通过先将区域边界转换为hbase的scan的边界,再以多
线程调度并行地从hbase中读取数据,大幅度提高了瓦片数据的导出效率;通过读写分离的方式将导出的数据存入sqlite数据库中,提升了数据存储的速度,使得读写之间没有瓶颈。
附图说明
40.本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
41.图1是根据本发明一实施例的从hbase瓦片存储快速导出区域子数据集的方法流程图。
42.图2是根据本发明一实施例的从hbase瓦片存储快速导出区域子数据集的装置框架图。
43.图3是根据本发明一实施例的从hbase瓦片存储快速导出区域子数据集的架构图。
具体实施方式
44.为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不冲突的情况下,本技术的实施例及实施例中的特征可以相互组合。
45.在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。
46.本发明的方案中使用到的术语解释如下:
47.瓦片:指将一定范围内的地图按照一定的尺寸和格式,按缩放级别或者比例尺,切成若干行和列的正方形栅格图片,对切片后的正方形栅格图片被形象的称为瓦片(tile)。
48.gwc:geowebcache是一个java web应用程序,用于缓存来自各种来源的地图图块,例如ogc web地图服务(wms)。它实现了各种服务接口(如wms-c,wmts,tms,google maps kml,virtual earth),以加速和优化地图图像传输。
49.mbtiles:mbtiles是一个用于在sqlite数据库中存储任意平铺地图数据的规范,可即时使用和高效传输。
50.影像金字塔:指在同一的空间参照下,根据用户需要以不同分辨率进行存储与显示,形成分辨率由粗到细、数据量由小到大的金字塔结构。影像金字塔结构用于图像编码和渐进式图像传输,是一种典型的分层数据结构形式,适合于栅格数据和影像数据的多分辨率组织,也是一种栅格数据或影像数据的有损压缩方式。
51.如图1所示,根据本发明一实施例,提供了一种从hbase瓦片存储快速导出区域子数据集的方法,包括以下步骤:
52.s11、根据两个坐标点的经纬度坐标获取需要导出的瓦片数据的矩形区域;
53.其中,所述两个坐标点不在同一经度或者是纬度上,也即以所述两个坐标点为矩形的对角点,即可确认一个矩形区域。所述两个坐标点的经纬度坐标可以根据用户的输入得到,或者根据用户在地图界面上的点击而生成。
54.s12、根据所述矩形区域确定scan边界;
55.计算出所述矩形区域中每一层每一列瓦片的startkey与endkey,所述startkey与
endkey为scan边界。
56.s13、根据所述scan边界并行地读取hbase的每个region中的瓦片数据,存放到全局变量hashmap中;
57.针对瓦片金字塔的每一层,计算出在矩形区域内开始的瓦片和结束的瓦片的层、行、列(lrc)信息,根据这些层、行、列信息给线程池分发任务,生成多个线程任务,所述多个线程任务根据所述scan边界并行地从每个region中读取相应的瓦片数据。
58.在所述全局变量hashmap中,key值用于存储从region中读取的瓦片数据,value值为listclass,在listclass类中定义两个arraylist链表和一个index变量,所述index变量用于区别arraylist链表功能,index0表示第一arraylist负责读取数据,第二arraylist负责写入数据,index1表示第一arraylist负责写入数据,第二arraylist负责读取数据。所述“读取”是指从hashmap中读取数据,所述写入是指写入sqlite数据库。
59.s14、将所述全局变量hashmap中的瓦片数据以读写分离的方式存入sqlite数据库中;
60.读取瓦片数据时,首先判断hashmap的key值中是否存有所述瓦片数据,若不存在则初始化,若存在则根据index变量获取hashmap中负责读取数据的arraylist链表,通过synchronized方法锁住该arraylist链表同时该arraylist写入数据。当key值中的数据到达指定阈值(例如10000)时,根据index的值获取负责读取数据的arraylist链表,通过synchronized方法锁住该arraylist链表,同时更改index变量,使得读取数据的arraylist链表变为写入数据的arraylist链表,并且进行写入数据库操作,如此反复直到所有瓦片数据都存入到sqlite数据库中。
61.在本实施例中,通过先将区域边界转换为hbase的scan的边界,再以多线程调度并行地从hbase中读取数据,大幅度提高了瓦片数据的导出效率;通过读写分离的方式将导出的数据存入sqlite数据库中,提升了数据存储的速度,使得读写之间没有瓶颈。
62.本发明实施例还提供了一种从hbase瓦片存储快速导出区域子数据集的装置,如图2所示,包括:
63.获取模块21,用于根据传入的两点经纬度坐标获取需要导出的瓦片数据的矩形区域;
64.其中,所述两个坐标点不在同一经度或者是纬度上,也即以所述两个坐标点为矩形的对角点,即可确认一个矩形区域。所述两个坐标点的经纬度坐标可以根据用户的输入得到,或者根据用户在地图界面上的点击而生成。
65.确定模块22,用于根据所述矩形区域确定scan边界;
66.计算出所述矩形区域中每一层每一列瓦片的startkey与endkey,所述startkey与endkey为scan边界。
67.读取模块23,用于根据所述scan边界并行地读取hbase的每个region中的瓦片数据,存放到全局变量hashmap中;
68.针对瓦片金字塔的每一层,计算出在矩形区域内开始的瓦片和结束的瓦片的层、行、列(lrc)信息,根据这些层、行、列信息给线程池分发任务,生成多个线程任务,所述多个线程任务根据所述scan边界并行地从每个region中读取相应的瓦片数据。
69.在所述全局变量hashmap中,key值用于存储从region中读取的瓦片数据,value值
为listclass,在listclass类中定义两个arraylist链表和一个index变量,所述index变量用于区别arraylist链表功能,index0表示第一arraylist负责读取数据,第二arraylist负责写入数据,index1表示第一arraylist负责写入数据,第二arraylist负责读取数据。所述“读取”是指从hash中读取数据,所述写入是指写入sqlite数据库。
70.存储模块24,用于将所述全局变量hashmap中的瓦片数据以读写分离的方式存入sqlite数据库中。
71.读取瓦片数据时,首先判断hashmap的key值中是否存有所述瓦片数据,若不存在则初始化,若存在则根据index变量获取hashmap中负责读取数据的arraylist链表,通过synchronized方法锁住该arraylist链表同时该arraylist写入数据。当key值中的数据到达指定阈值(例如10000)时,根据index的值获取负责读取数据的arraylist链表,通过synchronized方法锁住该arraylist链表,同时更改index变量,使得读取数据的arraylist链表变为写入数据的arraylist链表,并且进行写入数据库操作,如此反复直到所有瓦片数据都存入到sqlite数据库中。
72.在本实施例中,通过获取模块获到需要导出的瓦片数据,然后通过确定模块确定所述瓦片数据的scan边界,读取模块根据所述scan边界并行地读取hbase的每个region中的瓦片数据,存放到全局变量hashmap中,最后通过存储模块将所述全局变量hashmap中的瓦片数据以读写分离的方式存入sqlite数据库中,提升了数据存储的速度,使得读写之间没有瓶颈。
73.具体实施方式如图3所示:
74.首先根据不在同一经纬度的两个坐标确定一个矩形区域,然后通过计算得到瓦片scan边界,即每一层每一列瓦片的startkey和endkey值,针对瓦片金字塔的每一层,计算出在矩形区域内开始的瓦片和结束的瓦片的层、行、列(lrc)信息,根据这些层、行、列信息给线程池分发任务,生成多个scanner线程任务,所述多个scanner线程任务根据所述scan边界并行地从region中读取相应的瓦片数据。
75.设置一个全局变量hashmap,用于存储根据所述scan边界并行地从每个region1和region2中读取的相应瓦片数据,在所述hashmap中,key值用于存储从region1和region2中读取的瓦片数据,value值为listclass类,在listclass类中定义两个arraylist链表和一个index变量,index0表示第一arraylist链表负责从所述hashmap中读取数据,第二arraylis链表负责将读取的数据写入sqlite数据库,index1表示第二arraylist链表负责从所述hashmap中读取数据,第一arraylist链表负责将读取的数据写入sqlite数据库。
76.作为示例,当hashmap中key值存储的瓦片数据到达10000时,index值为index1,线程向hashmap查询,得到index反馈值index1,读取第一arraylist链表,并将第一arraylis链表中的数据写入sqlite数据库中,此时第二arraylist链表负责从hashmap中读取数据,同时使用synchronized方法对第一arraylist链表加锁,直到第一arraylist链表中的数据全部存到sqlite数据库后解锁,同时index值变为index0,即第二arraylist链表用于将读取的瓦片数据存入sqlite数据库,第一arraylist链表负责从hashmap中读取数据,如此反复直到所有瓦片数据都存入到sqlite数据库中。
77.经测试,通过一般的方式全量导出全球地图大概需要5年以上的时间,而通过本方法只需要1天的时间。
78.本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质包括只读存储器(read-only memory,rom)、随机存储器(random access memory,ram)、可编程只读存储器(programmable read-only memory,prom)、可擦除可编程只读存储器(erasable programmable read only memory,eprom)、一次可编程只读存储器(one-time programmable read-only memory,otprom)、电子抹除式可复写只读存储器(electrically-erasable programmable read-only memory,eeprom)、只读光盘(compact disc read-only memory,cd-rom)或其他光盘存储器、磁盘存储器、磁带存储器、或者能够用于携带或存储数据的计算机可读的任何其他介质。
79.以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1