動(dòng)態(tài)空間劃分(R-tree)
靜態(tài)空間劃分(GeoHash景埃、S2、H3)
????空間劃分知識(shí):http://www.cocoachina.com/cms/wap.php?action=article&id=20309
????GeoHash
????????四叉樹
????????????????????經(jīng)度璧函、緯度的二分來分塊辱姨,邏輯最簡單。
????????Z-行空間遍歷
????????編碼方式
????????????????所在層級(jí)經(jīng)緯度二分下標(biāo)(0部凑、1),先經(jīng)后緯碧浊,逐層排列涂邀。
????Google S2
????????正方體投影
????????????以正方體投影作為基準(zhǔn),六個(gè)面逐級(jí)緯度二分箱锐。
????????希爾伯特曲線
????????????????相鄰相近
????????????????等距連續(xù)比勉?
????????編碼方式
????????????????六面ID+ 所在層級(jí)經(jīng)緯度二分下標(biāo)(0、1)驹止,受曲線旋轉(zhuǎn)影響浩聋,逐層排列。
????????映射修正
????????????????使面積差距小
????????????????線性變換:s = 0.5 * (1 + u)
????????????????tan變換:s = 2 / pi * (atan(u) + pi / 4) = 2 * atan(u) / pi + 0.5
? ??????????????二次變換(Uber選擇):u >= 0臊恋,s = 0.5 * sqrt(1 + 3*u)?
? ??????????????????????????????????????????????????????????u < 0, s = 1 - 0.5 * sqrt(1 - 3*u)
????Uber H3
????????官網(wǎng)
????????????????https://uber.github.io/h3/#/documentation/overview/introduction
????????怎么劃分空間
????????????????假設(shè)正x多邊形衣洁,y個(gè)頂點(diǎn)相接:360 / y = ((x-2)*180) / x?
????????????????????????正整數(shù)解只有(3,6、4,4抖仅、6,3)
????????????????正六多邊形優(yōu)點(diǎn)
? ? ? ? ? ? ? ? ? ? ? ? 相鄰單元距離相等
????????????????????????近似圓
????????????????????????????????自身近似圓形坊夫,貼合密度概念,很適合大多數(shù)的匯總分析場(chǎng)景撤卢。
????????????????????????????????周圍相近近似圓形且等距环凿,方便附近查找,階梯分析等
????????????????Uber怎么做放吩?
? ? ? ? ? ? ? ? ? ? ? ? ?想要的一個(gè)優(yōu)點(diǎn)智听,分割后面積相同。
????????????????????????面積相同的正六邊形不能構(gòu)建成球形屎慢。
????????????????????????正二十面體
????????????????????????基本單元
????????????????????????????????正二十面體瞭稼,交點(diǎn)有五個(gè)邊。每一個(gè)基本單元做上圖圖示的分割腻惠。
? ??????????????????????????????全球被劃分為12個(gè)正五邊形和110個(gè)正六邊形的基本單元环肘。
? ??????????????????????Dymaxion map
? ??????????????????????????????戴美克森氏地圖(Dymaxion map)或稱富勒地圖(Fuller map),由Richard Buckminster Fuller發(fā)明。建筑師集灌。
????????????????????????????????dymaxion(最大限度利用能源的,以最少結(jié)構(gòu)提供最大強(qiáng)度的)悔雹,這個(gè)詞來源于三個(gè)單詞:Dynamic,意思是動(dòng)力欣喧,Maximum腌零,意思是最多、最大唆阿,還有ion益涧,是一個(gè)原子或是一個(gè)電極中一組原子。
????????????????????????????????選擇二十面體的頂點(diǎn)在水中驯鳖,盡量避免常規(guī)應(yīng)用中同時(shí)使用五邊形和六邊形闲询。
????????????????????????逐級(jí)等分
????????????????????????????????可支持16級(jí)拆分
????????????????????????????????第一層基礎(chǔ)單元格久免,15級(jí)(編碼方式?jīng)Q定)的等面積拆分。
????????基本元素
????????????單元格(cell)
????????????????????普通的各級(jí)分裂的結(jié)果
????????????有向格
????????????????????單元格增加一個(gè)以六條邊為基礎(chǔ)的維度扭弧,可以表示從一個(gè)單元格到另一個(gè)共邊單元格的意向阎姥,相當(dāng)于記錄兩個(gè)有共邊的單元格,當(dāng)需要時(shí)鸽捻,可以將邊緣轉(zhuǎn)換回原始索引或目標(biāo)索引呼巴。
????????????????????分為單向格(Unidirectional Edge)和雙向格(bidirectional edge)。
????????????IJK坐標(biāo)系
????????????????????一種平面六邊形網(wǎng)絡(luò)中的三軸坐標(biāo)系御蒲。為六邊形網(wǎng)絡(luò)中的每一個(gè)元素提供唯一路徑衣赶。
????????????FaceIJK坐標(biāo)系
????????????????????H3 核心運(yùn)算使用的坐標(biāo)系。
????????????????????由二十面體基本單元ID + IJK坐標(biāo)系構(gòu)成删咱。有兩種類型(R. Buckminster Fuller定義):
????????????????????0層使用ClassII屑埋;逐層搖擺,交替使用痰滋。
????????????其他坐標(biāo)系
????????????????????https://uber.github.io/h3/#/documentation/core-library/coordinate-systems
????????編碼方式
????????????????使用64位摘能,一個(gè)Long值的長度來記錄一個(gè)基本類型。
? ? ? ? ? ? ? ? ·· 前4位表示索引模式:0:無效敲街;1:單元格团搞;2:單向格;3:雙向格多艇。
? ? ? ? ? ? ? ? ·· 3位表示共邊ID(模式2和模式3有效)逻恐。
? ? ? ? ? ? ? ? ·· 4位表示當(dāng)前索引級(jí)別(0-15)。
? ? ? ? ? ? ? ? ·· 7位表示基本單元格ID(0-121)峻黍。
? ? ? ? ? ? ? ? ·· 每3位一個(gè)層級(jí)复隆,逐層排列(3*15)。
? ? ? ? ? ? ? ? ·· 隊(duì)尾未被使用的位置1姆涩。
????????????????拆分編碼:(?五邊形拆分中廢棄下標(biāo)1)
????????????應(yīng)用場(chǎng)景
????????????????????普通索引
????????????????????????????高精度的數(shù)據(jù)挽拂,模糊到選定的H3粒度,作為數(shù)據(jù)的索引使用骨饿。
????????????????????附近搜
????????????????????????????K環(huán)(kRing):
????????????????????????????????????根據(jù)指定中心點(diǎn)亏栈,得到指定單位距離內(nèi)(K)的其他單元格,非常方便的實(shí)現(xiàn)附近的需要宏赘。發(fā)揮近似圓的優(yōu)勢(shì)绒北。
????????????????????多邊形索引
? ? ? ? ? ? ? ? ? ? ? ? ? ? 指定粒度切分指定多邊形,得到多邊形覆蓋的單元格察署,并且提供壓縮功能闷游。
????????jar使用
????????????????groupId:com.uber
????????????????artifactId:h3
????????????????version:
? ??????????????H3Core h3 = H3Core.newInstance();
? ??????????????h3.xxx();
? ??? ??性能
????????????????普通應(yīng)用場(chǎng)景和geohash的使用場(chǎng)景并無實(shí)質(zhì)性的區(qū)別,但是等面積、近圓的特性脐往,在一些場(chǎng)景俱济,會(huì)降低實(shí)現(xiàn)算法的難度。
????????????????多邊形索引的場(chǎng)景钙勃,需要圍欄預(yù)處理工作,然后做兩個(gè)Btree的關(guān)聯(lián)運(yùn)算聂喇,具體性能對(duì)比辖源,待測(cè)試。
????????缺點(diǎn)
????????????????上下級(jí)的不完全覆蓋(藍(lán)色區(qū)域舉例)希太,一些應(yīng)用場(chǎng)景要注意克饶。
????????????編碼方式對(duì)普通索引不友好
如下:同一個(gè)經(jīng)緯度,在不同層級(jí)的索引值
000100000000011000111111111111111111111111111111111111111111111
8031fffffffffff
000100000010011000110111111111111111111111111111111111111111111
8131bffffffffff
000100000100011000110011111111111111111111111111111111111111111
82319ffffffffff
000100010010011000110011101101010101001110000111111111111111111
89319daa9c3ffff
000100011110011000110011101101010101001110000011101000000110011
8f319daa9c1d033
如果使用壓縮算法誊辉,上級(jí)(壓縮后)的索引值和下級(jí)(壓縮前)的索引值矾湃,沒有辦法命中普通數(shù)據(jù)庫之類的的普通索引,大大的限制了壓縮算法的使用場(chǎng)景堕澄。
解決方式:
擦除索引層級(jí)標(biāo)記
000100000100011000110011111111111111111111111111111111111111111&111111100001111111111111111111111111111111111111111111111111111
000100010010011000110011101101010101001110000111111111111111111&111111100001111111111111111111111111111111111111111111111111111
-->
000100000000011000110011111111111111111111111111111111111111111
000100000000011000110011101101010101001110000111111111111111111
截?cái)嗪竺鏌o效的1
000100000000011000110011111111111111111111111111111111111111111
000100000000011000110011101101010101001110000111111111111111111
-->
000100000000011000110011
000100000000011000110011101101010101001110000
base8編碼邀跃?
就可以在使用壓縮算法節(jié)省存儲(chǔ)空間的同時(shí),又可以命中普通Btree索引蛙紫。
跨Base區(qū)怎么辦拍屑?
????????分割(投影)算法不完美
不只有概念描述中的五邊形、六邊形坑傅;???
會(huì)有七邊形僵驰,甚至十邊形(出現(xiàn)在正二十面體的交線上);