亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

面向NoSQL數(shù)據(jù)庫(kù)的將地理空間數(shù)據(jù)一維化的GeoHash編碼方法與流程

文檔序號(hào):12666690閱讀:451來(lái)源:國(guó)知局
面向NoSQL數(shù)據(jù)庫(kù)的將地理空間數(shù)據(jù)一維化的GeoHash編碼方法與流程

本發(fā)明屬于空間數(shù)據(jù)存儲(chǔ)與管理技術(shù)領(lǐng)域,尤其涉及一種面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法。



背景技術(shù):

高分辨率對(duì)地觀測(cè)、遙感、導(dǎo)航定位和移動(dòng)互聯(lián)網(wǎng)等技術(shù)的不斷發(fā)展極大地豐富了地理空間數(shù)據(jù)的產(chǎn)生渠道、提高了地理空間數(shù)據(jù)的產(chǎn)生速度,因此給地理空間數(shù)據(jù)的存儲(chǔ)、查詢、處理和分析帶來(lái)了挑戰(zhàn)。以HBase為代表的分布式NoSQL數(shù)據(jù)庫(kù)具有良好的可伸縮性和可擴(kuò)展性,能夠有效地存儲(chǔ)大規(guī)模數(shù)據(jù),并且支持?jǐn)?shù)據(jù)的高速寫(xiě)入和基于鍵值的快速查詢。因此NoSQL數(shù)據(jù)庫(kù)在空間大數(shù)據(jù)存儲(chǔ)和管理領(lǐng)域?qū)⒕哂辛己玫膽?yīng)用前景。但另一方面,HBase等NoSQL數(shù)據(jù)庫(kù)都是基于一維的Key-Value對(duì)形式組織數(shù)據(jù),因此只對(duì)一維數(shù)據(jù)的存儲(chǔ)和查詢提供了良好地支持;而地理空間數(shù)據(jù)是二維或三維數(shù)據(jù),直接存儲(chǔ)于NoSQL數(shù)據(jù)庫(kù)并實(shí)現(xiàn)空間查詢難度較大。

針對(duì)上述問(wèn)題一種常用的解決方法是利用Gustavo Niemeyer發(fā)明的標(biāo)準(zhǔn)GeoHash編碼技術(shù)將地理空間數(shù)據(jù)一維化,即將每個(gè)地理空間數(shù)據(jù)對(duì)應(yīng)一個(gè)標(biāo)準(zhǔn)GeoHash編碼,然后以該GeoHash編碼為Key,將空間要素作為Value,存儲(chǔ)到NoSQL數(shù)據(jù)庫(kù)中。在實(shí)施空間查詢時(shí),將二維的區(qū)域查詢轉(zhuǎn)化為一維GeoHash編碼空間上的多個(gè)一維區(qū)間查詢。這種常用方法將全球地理范圍劃分為大小相等的矩形,并按照Morton編碼為每個(gè)矩形指定一個(gè)二進(jìn)制編碼,稱為標(biāo)準(zhǔn)GeoHash編碼。由于實(shí)際的地理空間數(shù)據(jù)在全球范圍內(nèi)一般并非均勻分布,因此如果按照標(biāo)準(zhǔn)GeoHash編碼規(guī)定的方法將全球劃分為多個(gè)等大小矩形,則有的矩形包含的地理空間數(shù)據(jù)多,有的包含的少。結(jié)果導(dǎo)致有的一維Key區(qū)間對(duì)應(yīng)的數(shù)據(jù)很多,有的區(qū)間對(duì)應(yīng)的數(shù)據(jù)很少,執(zhí)行查詢?nèi)蝿?wù)時(shí)有的線程任務(wù)繁重,有的線程幾乎空轉(zhuǎn)。因此這種數(shù)據(jù)的不均勻性會(huì)大大降低上述常用地理空間數(shù)據(jù)存儲(chǔ)方法的空間查詢效率。

綜上所述,現(xiàn)有的地理空間數(shù)據(jù)一維化GeoHash編碼方法沒(méi)有考慮數(shù)據(jù)的空間分布不均勻性,如果直接應(yīng)用在NoSQL數(shù)據(jù)庫(kù)中將會(huì)使空間查詢效率較低。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明的目的在于提供一種面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法,旨在解決現(xiàn)有的數(shù)據(jù)的不均勻性會(huì)降低NoSQL數(shù)據(jù)庫(kù)的空間查詢效率的問(wèn)題。

本發(fā)明是這樣實(shí)現(xiàn)的,一種面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法,所述面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法包括以下步驟:

步驟一,依據(jù)地理空間點(diǎn)要素空間分布的歷史統(tǒng)計(jì)數(shù)據(jù)將標(biāo)準(zhǔn)GeoHash編碼轉(zhuǎn)換成平衡GeoHash編碼,并得到一張兩者之間的映射表,稱為編碼映射表;

步驟二,需要入庫(kù)的地理空間點(diǎn)要素通過(guò)查編碼映射表綁定一個(gè)平衡GeoHash編碼,然后以平衡GeoHash編碼為關(guān)鍵字將空間點(diǎn)要素存儲(chǔ)在HBase等NoSQL數(shù)據(jù)庫(kù)中;

步驟三,當(dāng)對(duì)NoSQL數(shù)據(jù)庫(kù)中存儲(chǔ)的空間點(diǎn)要素?cái)?shù)據(jù)進(jìn)行空間范圍查詢時(shí),將作為查詢條件的空間范圍轉(zhuǎn)化為平衡GeoHash編碼一維空間上一系列取值區(qū)間,然后針對(duì)每個(gè)取值區(qū)間生成一個(gè)對(duì)應(yīng)的區(qū)間Scan查詢,再進(jìn)行精細(xì)過(guò)濾獲得最終查詢結(jié)果。

進(jìn)一步,所述將標(biāo)準(zhǔn)GeoHash編碼轉(zhuǎn)換成平衡GeoHash編碼并生成編碼映射表的方法具體包括:

步驟一,把全球地理范圍均勻地劃分成大小相等的n*n個(gè)矩形區(qū)域,并且按照標(biāo)準(zhǔn)GeoHash規(guī)則,即Morton編碼規(guī)則,對(duì)這些區(qū)域進(jìn)行標(biāo)準(zhǔn)GeoHash編碼;

步驟二,根據(jù)點(diǎn)要素空間分布的歷史統(tǒng)計(jì)數(shù)據(jù)獲得各個(gè)矩形區(qū)域的相關(guān)統(tǒng)計(jì)值,并求得每個(gè)區(qū)域的理想期望值E,其中:

E=點(diǎn)要素總個(gè)數(shù)÷(n×n);

步驟三,遍歷標(biāo)準(zhǔn)GeoHash編碼的各個(gè)區(qū)域,根據(jù)各區(qū)域的相關(guān)統(tǒng)計(jì)值與理想期望值的大小關(guān)系,對(duì)標(biāo)準(zhǔn)GeoHash編碼區(qū)域進(jìn)行或?qū)Φ?、或拆分、或聚合的處理后得到一批新的矩形區(qū)域,使得新矩形區(qū)中包含的點(diǎn)要素個(gè)數(shù)最接近于理想期望值E;

步驟四,對(duì)新生成的矩形區(qū)域基于原標(biāo)準(zhǔn)GeoHash編碼的先后順序重新從小到大進(jìn)行編碼,得到平衡GeoHash編碼,同時(shí)將從標(biāo)準(zhǔn)GeoHash編碼到平衡GeoHash編碼的映射關(guān)系也記錄到編碼映射表中。

進(jìn)一步,所述將空間點(diǎn)要素通過(guò)查編碼映射表綁定平衡GeoHash編碼的方法具體包括:

第一步,根據(jù)待空間點(diǎn)要素的經(jīng)緯度信息計(jì)算得到其所屬的標(biāo)準(zhǔn)GeoHash編碼區(qū)域;

第二步,查編碼映射表,根據(jù)標(biāo)準(zhǔn)GeoHash編碼得到其所對(duì)應(yīng)的平衡GeoHash編碼;

第三步,用第二步得到的平衡GeoHash編碼作關(guān)鍵字把空間點(diǎn)要素插入到NoSQL數(shù)據(jù)庫(kù)中。

進(jìn)一步,所述對(duì)已入庫(kù)的空間點(diǎn)要素進(jìn)行空間范圍查詢的方法具體包括:

(1)根據(jù)查詢矩形的經(jīng)緯度范圍,計(jì)算與查詢矩形有交集的標(biāo)準(zhǔn)GeoHash編碼區(qū)域,得到一個(gè)標(biāo)準(zhǔn)GeoHash編碼列表;

(2)從標(biāo)準(zhǔn)GeoHash編碼列表中依次取出各個(gè)標(biāo)準(zhǔn)GeoHash編碼,然后通過(guò)查編碼映射表,得到對(duì)應(yīng)的平衡GeoHash編碼列表;

(3)將平衡GeoHash編碼列表中的編碼從小到大排序,然后將相鄰的編碼盡量合并,生成多個(gè)平衡GeoHash編碼區(qū)間;

(4)使用(3)生成的平衡GeoHash編碼區(qū)間作為查詢條件進(jìn)行空間點(diǎn)要素的范圍查詢,一個(gè)平衡GeoHash編碼區(qū)間對(duì)應(yīng)NoSQL數(shù)據(jù)庫(kù)的一個(gè)Scan查詢;

(5)最后利用NoSQL數(shù)據(jù)庫(kù)的Coprocessor機(jī)制或者用戶自定義函數(shù)UDF機(jī)制對(duì)上述粗查詢所得的空間點(diǎn)要素進(jìn)行進(jìn)一步的細(xì)篩選,最終得到被查詢矩形所覆蓋的空間點(diǎn)要素。

本發(fā)明的另一目的在于提供一種利用所述面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法的NoSQL數(shù)據(jù)庫(kù)。

相較于現(xiàn)有技術(shù),本發(fā)明具有以下有益效果:

本發(fā)明提供的面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法,根據(jù)地理空間數(shù)據(jù)空間分布的歷史統(tǒng)計(jì)數(shù)據(jù),將標(biāo)準(zhǔn)GeoHash編碼轉(zhuǎn)換成平衡GeoHash編碼。平衡GeoHash編碼中每個(gè)編碼值對(duì)應(yīng)的空間區(qū)域大小不等,但不同編碼值對(duì)應(yīng)空間區(qū)域內(nèi)包含的空間要素個(gè)數(shù)更均勻。與標(biāo)準(zhǔn)GeoHash編碼相比,以該平衡GeoHash編碼為關(guān)鍵字將地理空間點(diǎn)要素存儲(chǔ)在HBase等NoSQL數(shù)據(jù)庫(kù)中,再利用本發(fā)明設(shè)計(jì)的空間范圍查詢方法,可以獲得更高的空間查詢效率和更短的查詢響應(yīng)時(shí)間。

附圖說(shuō)明

圖1是本發(fā)明實(shí)施例提供的面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法流程圖。

圖2是本發(fā)明實(shí)施例提供的標(biāo)準(zhǔn)GeoHash編碼轉(zhuǎn)換為平衡GeoHash編碼過(guò)程的示意圖;

圖中:(a)表示標(biāo)準(zhǔn)GeoHash編碼;(b)表示點(diǎn)要素空間分布的歷史統(tǒng)計(jì)數(shù)據(jù);(c)表示平衡GeoHash編碼。

圖3是本發(fā)明實(shí)施例提供的標(biāo)準(zhǔn)GeoHash編碼過(guò)程的示意圖。

圖4是本發(fā)明實(shí)施例提供的從標(biāo)準(zhǔn)GeoHash到平衡GeoHash的編碼映射表結(jié)構(gòu)示意圖。

圖5是本發(fā)明實(shí)施例提供的全球標(biāo)準(zhǔn)GeoHash編碼后的結(jié)果示意圖。

圖6是本發(fā)明實(shí)施例提供的示例用的點(diǎn)要素空間分布?xì)v史統(tǒng)計(jì)數(shù)據(jù)示意圖。

圖7是本發(fā)明實(shí)施例提供的標(biāo)準(zhǔn)GeoHash和平衡GeoHash是一對(duì)一關(guān)系的示意圖。

圖8是本發(fā)明實(shí)施例提供的標(biāo)準(zhǔn)GeoHash和平衡GeoHash是多對(duì)一關(guān)系的示意圖。

圖9是本發(fā)明實(shí)施例提供的標(biāo)準(zhǔn)GeoHash和平衡GeoHash是一對(duì)多關(guān)系的示意圖。

圖10是本發(fā)明實(shí)施例提供的全球平衡GeoHash編碼后的結(jié)果示意圖。

圖11是本發(fā)明實(shí)施例提供的編碼映射表。

圖12是本發(fā)明實(shí)施例提供的作為示例用的空間點(diǎn)要素。

圖13是本發(fā)明實(shí)施例提供的入庫(kù)鍵值對(duì)的結(jié)構(gòu)示意圖。

圖14是本發(fā)明實(shí)施例提供的空間范圍查詢示意圖。

圖15是本發(fā)明實(shí)施例提供的和查詢矩形有交集的標(biāo)準(zhǔn)GeoHash區(qū)間的示意圖。

圖16是本發(fā)明實(shí)施例提供的和查詢矩形有交集的平衡GeoHash區(qū)間的示意圖。

圖17是本發(fā)明實(shí)施例提供的被查詢矩形覆蓋的一對(duì)多區(qū)域的示意圖。

圖18是本發(fā)明實(shí)施例提供的被查詢矩形覆蓋的多對(duì)一區(qū)域的示意圖。

圖19是本發(fā)明實(shí)施例提供的平衡GeoHash編碼列表串連拼接前后結(jié)果對(duì)比的示意圖。

具體實(shí)施方式

為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。

下面結(jié)合附圖對(duì)本發(fā)明的應(yīng)用原理作詳細(xì)的描述。

如圖1所示,本發(fā)明實(shí)施例提供的面向NoSQL數(shù)據(jù)庫(kù)的地理空間數(shù)據(jù)一維化GeoHash編碼方法包括:

S101:依據(jù)地理空間點(diǎn)要素空間分布的歷史統(tǒng)計(jì)數(shù)據(jù)將標(biāo)準(zhǔn)GeoHash編碼轉(zhuǎn)換成平衡GeoHash編碼,并得到一張兩者之間的映射表,稱為編碼映射表;

S102:需要入庫(kù)的地理空間點(diǎn)要素通過(guò)查編碼映射表綁定一個(gè)平衡GeoHash編碼,然后以平衡GeoHash編碼為關(guān)鍵字將空間點(diǎn)要素存儲(chǔ)在HBase等NoSQL數(shù)據(jù)庫(kù)中;

S103:當(dāng)對(duì)NoSQL數(shù)據(jù)庫(kù)中存儲(chǔ)的空間點(diǎn)要素?cái)?shù)據(jù)進(jìn)行空間范圍查詢時(shí),將作為查詢條件的空間范圍轉(zhuǎn)化為平衡GeoHash編碼一維空間上一系列取值區(qū)間,然后針對(duì)每個(gè)取值區(qū)間生成一個(gè)對(duì)應(yīng)的區(qū)間Scan查詢,再進(jìn)行精細(xì)過(guò)濾獲得最終查詢結(jié)果。

所述將標(biāo)準(zhǔn)GeoHash編碼轉(zhuǎn)換成平衡GeoHash編碼并生成編碼映射表的方法具體包括:

步驟1:把全球地理范圍均勻地劃分成大小相等的n*n個(gè)矩形區(qū)域,并且按照標(biāo)準(zhǔn)GeoHash規(guī)則,即Morton編碼規(guī)則,對(duì)這些區(qū)域進(jìn)行標(biāo)準(zhǔn)GeoHash編碼,如圖3所示;

步驟2:根據(jù)點(diǎn)要素空間分布的歷史統(tǒng)計(jì)數(shù)據(jù)獲得各個(gè)矩形區(qū)域的相關(guān)統(tǒng)計(jì)值,并進(jìn)一步求得每個(gè)區(qū)域的理想期望值E,其中:

E=點(diǎn)要素總個(gè)數(shù)÷(n×n);

步驟3:遍歷標(biāo)準(zhǔn)GeoHash編碼的各個(gè)區(qū)域,根據(jù)各區(qū)域的相關(guān)統(tǒng)計(jì)值與理想期望值的大小關(guān)系,對(duì)標(biāo)準(zhǔn)GeoHash編碼區(qū)域進(jìn)行或?qū)Φ?、或拆分、或聚合的處理后得到一批新的矩形區(qū)域,使得新矩形區(qū)中包含的點(diǎn)要素個(gè)數(shù)最接近于理想期望值E;

步驟4:對(duì)這些新生成的矩形區(qū)域基于原標(biāo)準(zhǔn)GeoHash編碼的先后順序重新從小到大進(jìn)行編碼,從而得到平衡GeoHash編碼,同時(shí)將從標(biāo)準(zhǔn)GeoHash編碼到平衡GeoHash編碼的映射關(guān)系也記錄到編碼映射表中。

編碼映射表表頭的主要結(jié)構(gòu)如圖4所示,各表項(xiàng)解釋如下:

StandardGeoHash表項(xiàng):代表標(biāo)準(zhǔn)GeoHash編碼;

TypeID表項(xiàng):三種映射類(lèi)型的ID號(hào),A表示對(duì)等,B表示一對(duì)多,C表示多對(duì)一;

SubGeoHash表項(xiàng):用于記錄這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域在其所對(duì)應(yīng)的平衡GeoHash區(qū)域中的相對(duì)位置信息;

BalancedGeoHash表項(xiàng):代表標(biāo)準(zhǔn)GeoHash編碼所對(duì)應(yīng)的平衡GeoHash編碼。

所述將空間點(diǎn)要素通過(guò)查編碼映射表綁定平衡GeoHash編碼的方法具體包括:

步驟1:根據(jù)待空間點(diǎn)要素的經(jīng)緯度信息計(jì)算得到其所屬的標(biāo)準(zhǔn)GeoHash編碼區(qū)域;

步驟2:查編碼映射表,根據(jù)標(biāo)準(zhǔn)GeoHash編碼得到其所對(duì)應(yīng)的平衡GeoHash編碼;

步驟3:用步驟2得到的平衡GeoHash編碼作關(guān)鍵字把空間點(diǎn)要素插入到NoSQL數(shù)據(jù)庫(kù)中。

所述對(duì)已入庫(kù)的空間點(diǎn)要素進(jìn)行空間范圍查詢的方法具體包括:

步驟1:根據(jù)查詢矩形的經(jīng)緯度范圍,計(jì)算與查詢矩形有交集的標(biāo)準(zhǔn)GeoHash編碼區(qū)域,得到一個(gè)標(biāo)準(zhǔn)GeoHash編碼列表;

步驟2:從標(biāo)準(zhǔn)GeoHash編碼列表中依次取出各個(gè)標(biāo)準(zhǔn)GeoHash編碼,然后通過(guò)查編碼映射表,得到對(duì)應(yīng)的平衡GeoHash編碼列表;

步驟3:將平衡GeoHash編碼列表中的編碼從小到大排序,然后將相鄰的編碼盡量合并,生成多個(gè)平衡GeoHash編碼區(qū)間;

步驟4:使用步驟3生成的平衡GeoHash編碼區(qū)間作為查詢條件進(jìn)行空間點(diǎn)要素的范圍查詢,一個(gè)平衡GeoHash編碼區(qū)間對(duì)應(yīng)NoSQL數(shù)據(jù)庫(kù)的一個(gè)Scan查詢;

步驟5:最后利用NoSQL數(shù)據(jù)庫(kù)的Coprocessor機(jī)制或者用戶自定義函數(shù)UDF機(jī)制對(duì)上述粗查詢所得的空間點(diǎn)要素進(jìn)行進(jìn)一步的細(xì)篩選,最終得到被查詢矩形所覆蓋的空間點(diǎn)要素。

下面結(jié)合具體附圖對(duì)本發(fā)明的應(yīng)用原理作進(jìn)一步的描述。

假定實(shí)例以人口密度分布數(shù)據(jù)作為點(diǎn)要素空間分布的歷史統(tǒng)計(jì)數(shù)據(jù),對(duì)全球范圍進(jìn)行基于人口密度分布的平衡GeoHash編碼,并以某個(gè)微博平臺(tái)發(fā)布的最近一周含地理定位信息的微博數(shù)據(jù)作為入庫(kù)數(shù)據(jù),查詢?cè)谥付ǚ秶鷥?nèi)近一周發(fā)出了哪些微博,數(shù)據(jù)庫(kù)選擇HBase。

依據(jù)人口密度分布數(shù)據(jù),將全球范圍進(jìn)行平衡GeoHash編碼的算法的具體實(shí)施步驟如下:

步驟1:假定將全球均勻劃分成8*8(64)個(gè)大小相等的矩形區(qū)域,并按照標(biāo)準(zhǔn)GeoHash規(guī)則給各個(gè)區(qū)域編碼,如圖5所示;

步驟2:根據(jù)人口密度分布數(shù)據(jù),假定人口密度分布數(shù)據(jù)如圖6所示,得到各個(gè)矩形區(qū)域內(nèi)的人口數(shù)目,比如編碼為s0的區(qū)域里的人口數(shù)目為8003,并進(jìn)一步求得每個(gè)區(qū)域的人口數(shù)目期望值(人口總數(shù)目/區(qū)域的總數(shù)目),這里求得是16248;

步驟3:按編碼從小到大的順序遍歷這64個(gè)區(qū)域,根據(jù)各區(qū)域的實(shí)際人口數(shù)與上述求得的期望人口數(shù)16248的大小關(guān)系,對(duì)該區(qū)域進(jìn)行或?qū)Φ?、或拆分、或聚合的處理后得到一批新的矩形區(qū)域,并對(duì)這些新矩形區(qū)域也進(jìn)行GeoHash編碼,從而得到一種基于人口密度分布的平衡GeoHash編碼,同時(shí)要將從標(biāo)準(zhǔn)GeoHash編碼到平衡GeoHash編碼的映射信息也記錄到一張映射表中。

這是該算法的核心部分,分析以下3種情況:

情況1:區(qū)域的相關(guān)統(tǒng)計(jì)值和理想期望值接近,在誤差允許的范圍內(nèi),這種情況下不需要對(duì)標(biāo)準(zhǔn)GeoHash編碼區(qū)域進(jìn)行特殊處理,直接“對(duì)等”過(guò)來(lái)即可,即一個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域就對(duì)應(yīng)一個(gè)新的平衡GeoHash區(qū)域,本發(fā)明稱之為“一對(duì)一”情況,如圖7所示(取圖4編號(hào)s4~s7局部做映射)。在此實(shí)例中,如果區(qū)域的實(shí)際人口數(shù)目和期望人口數(shù)目16248接近,則該標(biāo)準(zhǔn)GeoHash區(qū)域直接對(duì)應(yīng)一個(gè)新的平衡GeoHash區(qū)域;

比如編碼為s4、s5、s6、s7的區(qū)域,人口數(shù)目分別為15981、16019、15995、15974,接近人口期望值16248,因此這些區(qū)域不需要進(jìn)行特殊處理,可以直接作為新的平衡GeoHash編碼區(qū)域來(lái)使用。

情況2:區(qū)域的相關(guān)統(tǒng)計(jì)值小于理想期望值并且超出了誤差允許范圍,這種情況下本發(fā)明需要對(duì)標(biāo)準(zhǔn)GeoHash區(qū)域進(jìn)行“聚合”處理,即把其與之周?chē)木匦螀^(qū)域不斷地進(jìn)行合并,直到最終得到一個(gè)更大的新區(qū)域并且這個(gè)新區(qū)域的相關(guān)統(tǒng)計(jì)值接近理想期望值,此時(shí)多個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域?qū)?yīng)一個(gè)新的平衡GeoHash區(qū)域,本發(fā)明稱之為“多對(duì)一”情況,如圖8所示(取圖4編號(hào)s40~s43局部做映射),這種情況在記錄映射信息時(shí),還需要記錄小的標(biāo)準(zhǔn)GeoHash區(qū)域在大的平衡GeoHash區(qū)域中的相對(duì)位置信息。在此實(shí)例中,如果某個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域的實(shí)際人口數(shù)目小于期望人口數(shù)16248并且超出了人為規(guī)定的誤差允許范圍,這種情況下本發(fā)明需要對(duì)這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域進(jìn)行“聚合”處理;

比如編碼為s40的區(qū)域,人口數(shù)目為4023,小于人口期望值16248并且已經(jīng)不能把兩者近似相等,這個(gè)時(shí)候就需要合并周?chē)幋a為s41、s42和s43的區(qū)域,形成一個(gè)更大的區(qū)域,使得這個(gè)大區(qū)域的實(shí)際人口數(shù)目16025和期望人口數(shù)目16248接近。這種情況下,要把編碼為s40、s41、s42和s43的四個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域視為一個(gè)平衡GeoHash區(qū)域,并把這些映射信息記錄到一張表中,同時(shí)為了之后可以更加準(zhǔn)確地定位到平衡GeoHash區(qū)域里的標(biāo)準(zhǔn)GeoHash區(qū)域,本發(fā)明還需要額外記錄各個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域在平衡GeoHash區(qū)域里的相對(duì)位置信息,比如編碼為s40的標(biāo)準(zhǔn)GeoHash區(qū)域位于合并后的平衡GeoHash區(qū)域的“左下四分之一部分”,而編碼為s43的區(qū)域位于“右上四分之一部分”(這些相對(duì)位置信息可以用SubGeoHash值的相對(duì)大小來(lái)表示)。

情況3:區(qū)域的相關(guān)統(tǒng)計(jì)值大于理想期望值并且超出了誤差允許范圍,這種情況下本發(fā)明需要對(duì)這個(gè)標(biāo)準(zhǔn)GeoHash編碼區(qū)域進(jìn)行“拆分”處理,即把這個(gè)區(qū)域不斷均勻地二分下去,直到得到的每個(gè)新的小矩形區(qū)域中的相關(guān)統(tǒng)計(jì)值接近理想期望值為止,此時(shí)一個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域?qū)?yīng)多個(gè)新的平衡GeoHash區(qū)域,本發(fā)明稱之為“一對(duì)多”情況,如圖9所示(取圖4編號(hào)s36局部做映射)。在此實(shí)例中,如果區(qū)域的實(shí)際人口數(shù)大于期望人口數(shù)16248并且超出了人為規(guī)定的誤差允許范圍,這種情況下本發(fā)明需要對(duì)這個(gè)標(biāo)準(zhǔn)GeoHash編碼區(qū)域進(jìn)行“拆分”處理;

比如編碼為s36的區(qū)域,實(shí)際人口數(shù)目為64009,超出期望人口數(shù)16248太多了,這個(gè)時(shí)候就需要不斷均勻二分編碼為s36的區(qū)域,直到被拆成的小區(qū)域的實(shí)際人口數(shù)接近期望人口數(shù)16248。本發(fā)明發(fā)現(xiàn)將編碼為s36的區(qū)域均勻拆成4份是最合適的,被拆分成的每個(gè)小區(qū)域的人口數(shù)16002近似等于期望人口數(shù)16248,因此本發(fā)明需要將這一個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域?qū)?yīng)到四個(gè)平衡GeoHash區(qū)域上,并記錄這個(gè)映射信息到映射表中。

將64個(gè)標(biāo)準(zhǔn)GeoHash編碼區(qū)域按照如上算法遍歷完成之后,就能得到一種新的全球區(qū)域劃分,按照每個(gè)區(qū)域的地理位置關(guān)系進(jìn)行GeoHash編碼,就得到了基于人口密度分布的平衡GeoHash編碼,如圖10所示,并且還得到了一張從標(biāo)準(zhǔn)GeoHash編碼到這種平衡GeoHash編碼的映射表,如圖11所示。

其中TypeID若為A,則表示這個(gè)標(biāo)準(zhǔn)GeoHash編碼和平衡GeoHash編碼是一對(duì)一關(guān)系,若為B則表示一對(duì)多關(guān)系,若為C則表示是多對(duì)一關(guān)系;SubGeoHash僅在多對(duì)一(即TypeID為C)的時(shí)候使用,用于記錄這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域在其所對(duì)應(yīng)的平衡GeoHash區(qū)域中的相對(duì)位置信息,在其他時(shí)候用不到這個(gè)表項(xiàng)。

通過(guò)這張映射表,本發(fā)明可以很容易地將一個(gè)標(biāo)準(zhǔn)GeoHash編碼轉(zhuǎn)成其對(duì)應(yīng)的平衡GeoHash編碼。標(biāo)準(zhǔn)GeoHash編碼是有規(guī)律的,在把全球均勻地劃分成大小相等的8*8個(gè)矩形區(qū)域后,本發(fā)明可以通過(guò)經(jīng)緯度計(jì)算得到其所屬的標(biāo)準(zhǔn)GeoHash編碼;然而由于平衡GeoHash編碼是基于空間點(diǎn)要素的實(shí)際分布情況而無(wú)規(guī)律可循的,因此從標(biāo)準(zhǔn)GeoHash編碼到平衡GeoHash編碼的映射信息本發(fā)明需要記錄在一張映射表中,方便在數(shù)據(jù)的入庫(kù)以及之后的查詢算法中使用。

在完成平衡GeoHash編碼的工作之后,以這種平衡GeoHash編碼作為關(guān)鍵字開(kāi)始數(shù)據(jù)的入庫(kù)工作,以圖12所示的這些帶有地理定位信息的微博數(shù)據(jù)為例,具體數(shù)據(jù)入庫(kù)步驟如下:

步驟1:根據(jù)待入庫(kù)數(shù)據(jù)的經(jīng)緯度信息計(jì)算得到其所屬的標(biāo)準(zhǔn)GeoHash編碼區(qū)域;

第一條微博是在經(jīng)度-11.23、維度20.39的地方發(fā)送的,計(jì)算可知這個(gè)坐標(biāo)點(diǎn)位于標(biāo)準(zhǔn)GeoHash編碼為s26的區(qū)域,同理得到第二條微博的發(fā)送坐標(biāo)(經(jīng)度23.20、維度12.46)位于標(biāo)準(zhǔn)GeoHash編碼為s48的區(qū)域,第三條微博發(fā)送的坐標(biāo)(經(jīng)度-21.02、維度-10.36)位于編碼為s15的區(qū)域。

步驟2:查映射表,根據(jù)標(biāo)準(zhǔn)GeoHash編碼得到其所對(duì)應(yīng)的平衡GeoHash編碼;

這里會(huì)出現(xiàn)3種情況:

情況1:發(fā)送坐標(biāo)所屬的標(biāo)準(zhǔn)GeoHash區(qū)域和平衡GeoHash區(qū)域是“一對(duì)一”的情況時(shí),直接映射過(guò)來(lái)找到其所對(duì)應(yīng)的平衡GeoHash編碼即可,無(wú)需特殊處理;

比如第一條微博的發(fā)送坐標(biāo)位于標(biāo)準(zhǔn)GeoHash編碼為s26的區(qū)域,這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域直接映射成了編碼為b48的平衡GeoHash區(qū)域,因此編碼b48就是第一條微博所對(duì)應(yīng)的平衡GeoHash編碼。

情況2:發(fā)送坐標(biāo)所屬的標(biāo)準(zhǔn)GeoHash區(qū)域和平衡GeoHash區(qū)域是“一對(duì)多”的情況時(shí),查映射表時(shí)會(huì)發(fā)現(xiàn)這個(gè)標(biāo)準(zhǔn)GeoHash編碼會(huì)對(duì)應(yīng)多個(gè)平衡GeoHash編碼,此時(shí)還需要進(jìn)一步借助入庫(kù)數(shù)據(jù)的經(jīng)緯度信息進(jìn)行細(xì)處理,從多個(gè)平衡GeoHash編碼里計(jì)算選出入庫(kù)數(shù)據(jù)所屬的那一個(gè)平衡GeoHash編碼;

比如第三條微博的發(fā)送坐標(biāo)位于標(biāo)準(zhǔn)GeoHash編碼為s15的區(qū)域,這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域被映射成了4個(gè)平衡GeoHash區(qū)域,映射成的4個(gè)平衡GeoHash區(qū)域的編碼分別為b37、b38、b39和b40。此時(shí)本發(fā)明還需借助發(fā)送坐標(biāo)的經(jīng)緯度信息來(lái)更進(jìn)一步確定其真正所屬的平衡GeoHash區(qū)域。由于被拆分成的4個(gè)區(qū)域是大小相等的,所以本發(fā)明可以計(jì)算知道各個(gè)區(qū)域的經(jīng)緯度范圍,再和發(fā)送坐標(biāo)的經(jīng)緯度進(jìn)行比較就可最終確定平衡GeoHash編碼。由于發(fā)送坐標(biāo)的經(jīng)緯度(經(jīng)度-21.02、維度-10.36)位于平衡GeoHash編碼為b40的經(jīng)緯度范圍(經(jīng)度-22.50~0.00,維度-11.25~0.00)內(nèi),因此b40就是第二條微博所對(duì)應(yīng)的平衡GeoHash編碼。

情況3:發(fā)送坐標(biāo)所屬的標(biāo)準(zhǔn)GeoHash區(qū)域和平衡GeoHash區(qū)域是“多對(duì)一”的情況時(shí),查映射表時(shí)會(huì)發(fā)現(xiàn)這個(gè)標(biāo)準(zhǔn)GeoHash編碼和一些其他標(biāo)準(zhǔn)GeoHash編碼所對(duì)應(yīng)的平衡GeoHash編碼是一樣的,為了更加準(zhǔn)確地定位數(shù)據(jù),不能直接使用這個(gè)平衡GeoHash編碼,還需要借助映射表中之前記錄的“相對(duì)位置信息”來(lái)對(duì)這個(gè)平衡GeoHash再進(jìn)行一次細(xì)處理,得到更為準(zhǔn)確的平衡GeoHash編碼;

比如第二條微博的發(fā)送坐標(biāo)位于標(biāo)準(zhǔn)GeoHash編碼為s48的區(qū)域,這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域和一些其他的標(biāo)準(zhǔn)GeoHash區(qū)域(比如s50區(qū)域、s51區(qū)域等等)都映射成了同一個(gè)平衡GeoHash區(qū)域b65,本發(fā)明如果直接使用這個(gè)平衡GeoHash編碼b65,會(huì)使得之后的查詢算法在初始定位時(shí)不夠準(zhǔn)確,造成一些非必要的數(shù)據(jù)返回,為了讓平衡GeoHash編碼能更加準(zhǔn)確地描述定位信息,本發(fā)明還需要借助之前在映射表中填入的“相對(duì)位置信息”。查表時(shí),除了知道標(biāo)準(zhǔn)GeoHash編碼s48映射成了平衡GeoHash編碼b65外,本發(fā)明還可以知道這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域在平衡GeoHash區(qū)域中的相對(duì)位置信息00(本發(fā)明以數(shù)字的大小來(lái)記錄相對(duì)位置信息),因此第三條微博應(yīng)該得到的平衡GeoHash編碼為b65.00(前半部分代表映射成的平衡GeoHash區(qū)域,后半部分代表在平衡GeoHash區(qū)域中的相對(duì)位置)。

步驟3:將上述得到的平衡GeoHash編碼作為關(guān)鍵字(Key),經(jīng)緯度等其他信息作為值(Value),構(gòu)成Key-Values鍵值對(duì)把數(shù)據(jù)插入到NoSQL數(shù)據(jù)庫(kù)中。

比如,要把第一條微博存入到HBase數(shù)據(jù)庫(kù)中,其關(guān)鍵字(Key)是b48,其值(Value)可以有經(jīng)度-11.23、維度20.39等其他信息,這樣形成如圖13所示的鍵值對(duì)來(lái)存入HBase數(shù)據(jù)庫(kù)。

在完成全部數(shù)據(jù)的入庫(kù)工作后,還需要實(shí)現(xiàn)一種查詢算法,可以針對(duì)這些數(shù)據(jù)進(jìn)行高效快速的查詢??臻g點(diǎn)要素的查詢方式一般都是“拉框查詢”,即查詢被矩形框所框住的點(diǎn),因此輸入數(shù)據(jù)一般都是矩形框的經(jīng)緯度范圍。如圖14所示,假定要查詢?cè)诩t色矩形框內(nèi)發(fā)出的全部微博消息(也是一種點(diǎn)要素?cái)?shù)據(jù)),以此為例說(shuō)明點(diǎn)要素的空間范圍查詢算法的具體步驟:

步驟1:根據(jù)輸入的矩形框的經(jīng)緯度范圍,計(jì)算求得被矩形框所框住的標(biāo)準(zhǔn)GeoHash編碼區(qū)域;

如圖15所示,只要標(biāo)準(zhǔn)GeoHash編碼區(qū)域和矩形框有公共部分,就認(rèn)為其被矩形框所框住(圖中陰影部分表示被矩形框所框住的區(qū)域),因此這里“框住”包含“相交”和“包含”兩層意思。所以在此例中,被矩形框所框住的標(biāo)準(zhǔn)GeoHash編碼區(qū)域有:s15、s26、s37、s39、s48和s50,如圖14陰影部分所示。

步驟2:將得到的標(biāo)準(zhǔn)GeoHash編碼進(jìn)行查表,進(jìn)一步得到其所對(duì)應(yīng)的基于人口密度分布的平衡GeoHash編碼,如圖16所示;

這里又會(huì)出現(xiàn)3種情況:

情況1:如果被框住的這個(gè)標(biāo)準(zhǔn)GeoHash編碼區(qū)域和其所對(duì)應(yīng)的平衡GeoHash編碼區(qū)域是“一對(duì)一”情況,直接使用映射過(guò)來(lái)的平衡GeoHash編碼即可,不需要再進(jìn)行特殊處理;

比如上面被框住的標(biāo)準(zhǔn)GeoHash區(qū)域s26和s39,分別“一對(duì)一”地映射為平衡GeoHash區(qū)域b48和b62,可以直接使用b48和b62作為查詢條件對(duì)數(shù)據(jù)進(jìn)行查詢。

情況2:如果被框住的這個(gè)標(biāo)準(zhǔn)GeoHash編碼區(qū)域?qū)?yīng)多個(gè)平衡GeoHash編碼區(qū)域,即“一對(duì)多”情況,則還需再細(xì)分這個(gè)標(biāo)準(zhǔn)GeoHash區(qū)域,只選出被矩形框所框住的那部分平衡GeoHash編碼區(qū)域,如圖17所示;

比如此實(shí)例中被框住的標(biāo)準(zhǔn)GeoHash區(qū)域s15,它映射成4個(gè)平衡GeoHash區(qū)域b37、b38、b39和b40。本發(fā)明不能直接把這4個(gè)平衡GeoHash編碼都作為查詢條件來(lái)進(jìn)行數(shù)據(jù)的查詢,因?yàn)槠渲杏行┢胶釭eoHash區(qū)域(比如b37和b38)并不在矩形框的范圍內(nèi),為了盡量減少非必要的返回?cái)?shù)據(jù),加快查詢效率,這里還需要做額外的篩選處理,借助矩形框的經(jīng)緯度信息只選出被框住的那部分平衡GeoHash區(qū)域。此例在這種“一對(duì)多”的情況下最后應(yīng)該被選出的可作為查詢條件的平衡GeoHash編碼應(yīng)該是b39、b40,如圖16所示。

情況3:如果被框住的多個(gè)標(biāo)準(zhǔn)GeoHash編碼區(qū)域?qū)?yīng)同一個(gè)平衡GeoHash編碼區(qū)域,即“多對(duì)一”情況,為了盡量減少非必要的返回?cái)?shù)據(jù),本發(fā)明不應(yīng)該直接將整個(gè)大的平衡GeoHash區(qū)域?qū)?yīng)過(guò)來(lái),而應(yīng)該只選取其中被矩形框所框住的最小連續(xù)子區(qū)域,如圖18所示;

比如此實(shí)例中被框住的標(biāo)準(zhǔn)GeoHash編碼區(qū)域s48和s50,這兩個(gè)區(qū)域都對(duì)應(yīng)同一個(gè)平衡GeoHash區(qū)域b65,但是這里為了盡量減少非必要的返回?cái)?shù)據(jù)從而提高查詢效率,不能直接以b65作為查詢條件來(lái)查詢數(shù)據(jù),因?yàn)槠胶釭eoHash編碼b65還包含了沒(méi)有被矩形框所框住的一些標(biāo)準(zhǔn)GeoHash區(qū)域(比如s55、s61等等)。加入相對(duì)位置信息進(jìn)一步精確定位,如果只以b65.00(對(duì)應(yīng)s48)和b65.02(對(duì)應(yīng)s50)作為查詢條件,是可以最大程度上減少非必要的返回?cái)?shù)據(jù),但是由于是離散不連續(xù)的,所以HBase內(nèi)部會(huì)產(chǎn)生多個(gè)查詢過(guò)程來(lái)查詢數(shù)據(jù),這又會(huì)增加查詢時(shí)間。相互權(quán)衡利弊后,最佳的方案是以平衡GeoHash內(nèi)部被框住的最小連續(xù)子區(qū)域作為查詢條件,即本發(fā)明應(yīng)該以[b65.00,b65.02]這個(gè)平衡GeoHash編碼的連續(xù)區(qū)間作為查詢條件。這樣既減少了部分非必要的返回?cái)?shù)據(jù),也保證了只有一個(gè)查詢過(guò)程。

步驟3:還需要把得到的平衡GeoHash編碼進(jìn)行“串連”處理,即如果兩個(gè)平衡GeoHash片段是可以拼接的,則將這兩段片段拼接成一個(gè)新的片段,直到片段之間再不能相互拼接為止,如圖19所示;

具體串連步驟如下:

(1)對(duì)平衡GeoHash片段首先進(jìn)行排序處理,開(kāi)始遍歷排序好的片段序列;

(2)如果當(dāng)前片段的末尾和下一個(gè)片段的開(kāi)頭可以拼接,則連接起來(lái)作為一個(gè)新的片段,并以這個(gè)新的片段為當(dāng)前片段;如果不能拼接,則將當(dāng)前片段保存起來(lái)并且以下一個(gè)片段作為新的當(dāng)前片段繼續(xù)往后尋找可以拼接的片段;

(3)不斷地循環(huán)(2)操作直到遍歷到序列的最后一個(gè)片段為止,保存當(dāng)前片段后結(jié)束。

減少了查詢片段的數(shù)量,也就減少了HBase內(nèi)部的區(qū)間Scan查詢過(guò)程,從而減少了查詢時(shí)間,可以提高查詢效率。此實(shí)例在串連拼接處理之前得到平衡GeoHash片段如下:

{b39}、{b40}、{b48}、{b59}、{b60}、{b62}、[b65.00,b65.02]

經(jīng)過(guò)串連處理后,得到如下片段:

[b39,b40]、{b48}、[b59,b60]、{b62}、[b65.00,b65.02]

步驟4:利用上述得到的平衡GeoHash編碼片段作為查詢條件進(jìn)行空間點(diǎn)數(shù)據(jù)的查詢;

如圖16所示,紅色矩形框是本發(fā)明最開(kāi)始給定的查詢范圍,此例此時(shí)會(huì)得到在陰影區(qū)域范圍內(nèi)發(fā)送的微博消息。

步驟5:最后利用NoSQL數(shù)據(jù)庫(kù)的Coprocessor機(jī)制或者用戶自定義函數(shù)UDF機(jī)制對(duì)上述粗查詢得到的空間點(diǎn)進(jìn)行進(jìn)一步的細(xì)篩選,最終得到被矩形框所框住的空間點(diǎn)數(shù)據(jù)。

如圖16所示,陰影區(qū)域包含了紅色矩形框,但是并不能完全吻合,仍然存在一點(diǎn)多余的數(shù)據(jù),所以上述步驟得到的數(shù)據(jù)僅僅只是粗查詢的結(jié)果,最后還需要借助矩形框的經(jīng)緯度信息以及HBase數(shù)據(jù)庫(kù)的Coprocessor機(jī)制或者UDF機(jī)制對(duì)這個(gè)結(jié)果進(jìn)行細(xì)篩選,最終得到精確無(wú)誤的查詢結(jié)果。

以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1