核心原理詳解:基于二十面體的多精度六邊形離散全球網(wǎng)格)
GIS【免費下載鏈接】h3Hexagonal hierarchical geospatial indexing system項目地址https://gitcode.com/gh_mirrors/h3/h3點擊查看免費下載導讀H3 是一個十六進制層級地理空間索引系統(tǒng)Hexagonal Hierarchical Geospatial Indexing System它屬于離散全球網(wǎng)格系統(tǒng)Discrete Global Grid System, DGGS的范疇。本文以倉庫內(nèi) overview.md 為基礎(chǔ)結(jié)合源碼深入講解 H3 的網(wǎng)格構(gòu)建原理從球體外接二十面體、Dymaxion 定向、面心多面體球心投影到 aperture 7 的遞歸細分與五邊形必然存在的原因。讀完本文你將掌握 H3 網(wǎng)格為何是分層 六邊形 必須含五邊形的組合理解分辨率 0 到 15 各層級的面積、邊長與單元數(shù)量規(guī)律并能正確使用kml構(gòu)建目標可視化 H3 網(wǎng)格。一、離散全球網(wǎng)格系統(tǒng)與 H3 的設(shè)計定位H3 是一個離散全球網(wǎng)格系統(tǒng)其核心思想是把地球表面劃分成一系列盡可能等大、具有層級關(guān)系的單元并用這些單元作為空間索引的基礎(chǔ)。H3 在倉庫中的項目描述為 Hexagonal hierarchical geospatial indexing system而 README.md 進一步說明它使用六邊形網(wǎng)格并且可以近似地不斷細分出更細的六邊形網(wǎng)格從而同時具備六邊形網(wǎng)格的優(yōu)點與 S2 那樣的層級細分能力。從技術(shù)譜系上看H3 的 DGGS 設(shè)計參考了 Sahr et al. (2003) 的研究成果。與常見的經(jīng)緯度方格等經(jīng)度-緯度網(wǎng)格相比H3 的關(guān)鍵優(yōu)勢在于每個單元cell的相鄰單元數(shù)量固定且各向同性有利于距離與鄰域計算通過層級索引粗粒度到細粒度的聚合與下鉆無需重新建索引。H3 網(wǎng)格的理論定義與數(shù)據(jù)結(jié)構(gòu)對應關(guān)系可以在源碼中找到印證例如 constants.h 中定義了MAX_H3_RES 1516 個分辨率編號 0 到 15、NUM_ICOSA_FACES 20二十面體面數(shù)、NUM_BASE_CELLS 122基礎(chǔ)單元數(shù)等核心常量。二、球體外接二十面體與球心投影H3 網(wǎng)格的幾何起點H3 并不直接在地球表面鋪網(wǎng)格而是先把六邊形網(wǎng)格構(gòu)建在一個球體外接的二十面體的平面面上然后再把網(wǎng)格單元投影回球面。這一先平面、后球面的兩步策略是 H3 幾何構(gòu)建的核心。2.1 兩步構(gòu)建流程在球體外接的二十面體icosahedron的 20 個平面三角形面上建立平面六邊形網(wǎng)格使用面心多面體球心投影inverse face-centered polyhedral gnomonic projection把網(wǎng)格單元投影到球面。源碼 coordijk.h 的注釋明確記載了兩種坐標系統(tǒng)gnomonic面心多面體球心投影空間采用傳統(tǒng)縮放x 軸與面 Class II 的 i 軸對齊hex2d局部面心坐標系按指定 H3 分辨率單位長度縮放x 軸與局部 i 軸對齊。投影的核心實現(xiàn)位于 faceijk.c_vec3ToHex2d約 410 行把球面上的點映射到某個二十面體面并計算該點相對面中心的角度與距離隨后執(zhí)行g(shù)nomonic scaling對 r 取tan(r)再按分辨率縮放_hex2dToVec3約 458 行執(zhí)行逆操作通過inverse gnomonic scalingatan(r)把平面坐標還原回球面單位向量。在這兩個函數(shù)中可以看到若干關(guān)鍵幾何常量M_SQRT7/M_RSQRT7分辨率間縮放、RES0_U_GNOMONIC與INV_RES0_U_GNOMONIC從分辨率 0 的單位長度到球心投影單位長度的換算定義在 constants.h。2.2 坐標參考系與地球模型H3 使用的坐標參考系統(tǒng)CRS是球面坐標采用 WGS84/EPSG:4326 的等積半徑authalic radius。實際應用中最常見的做法就是直接使用 WGS84 CRS 數(shù)據(jù)配合 H3 庫使用。這一選擇同樣體現(xiàn)在源碼中EARTH_RADIUS_KM 6371.007180918475見 constants.h正是 WGS84 authalic radius 的千米數(shù)值用于各類球面面積、距離計算。需要注意的是這里的球面模型是等面積球并非橢球體因此面積與邊長數(shù)值與真實橢球地表存在細微差異。三、Dymaxion 定向讓 12 個二十面體頂點全部落于海洋二十面體有 12 個頂點。H3 使用巴克敏斯特·富勒R. Buckminster Fuller提出的Dymaxion 定向?qū)⑶蛎娑骟w固定到地球上。該定向的關(guān)鍵性質(zhì)是二十面體的 12 個頂點全部位于海洋中。這一性質(zhì)對網(wǎng)格系統(tǒng)的可用性意義重大頂點處是 H3 網(wǎng)格中五邊形單元的所在位置詳見下文把五邊形藏在海洋里可以避免在人口稠密的陸地地區(qū)頻繁出現(xiàn)五邊形畸變降低對空間分析與可視化應用的影響。文檔同時指出在 H3 開發(fā)之時這是已知的唯一滿足該性質(zhì)的定向后來學術(shù)界發(fā)現(xiàn)了其他可行的定向Barnes et al., 2019。H3 至今仍保留 Dymaxion 定向因此其網(wǎng)格幾何與坐標系與具體定向強綁定。從源碼看二十面體 20 個面的中心點坐標被靜態(tài)定義在 faceijk.c 的faceCenterPoint[NUM_ICOSA_FACES]數(shù)組中配合faceAxesAzRadsCII各面 Class II 的 i/j/k 軸方位角構(gòu)成面級幾何基礎(chǔ)面之間的相鄰關(guān)系則記錄在faceNeighbors查找表中。四、從二十面體到全球網(wǎng)格遞歸細分與分辨率4.1 構(gòu)建方式遞歸細分H3 網(wǎng)格通過在二十面體上遞歸地創(chuàng)建更高精度的六邊形網(wǎng)格來構(gòu)建直到達到所需分辨率。這意味著每一層分辨率都是上一層網(wǎng)格的細分結(jié)果天然形成層級索引結(jié)構(gòu)。4.2 aperture 7 與 sqrt(7) 縮放分辨率間距采用aperture 7孔徑 7即每個單元在下一級更細網(wǎng)格中對應約 7 個單元。其幾何結(jié)果是隨著分辨率增加單位長度按sqrt(7)縮放每個六邊形的面積約為下一更粗分辨率六邊形面積的1/7在二十面體平面上測量。在源碼中這一孔徑關(guān)系體現(xiàn)為多種 IJK 坐標變換函數(shù)見 coordijk.h_downAp7/_upAp7逆時針 aperture 7 細分/聚合、_downAp7r/_upAp7r順時針以及M_ONESEVENTH常量1/7的縮放運算。這些函數(shù)是實現(xiàn) cell→children / children→cell 層級操作的核心。4.3 Class II 與 Class III 的分辨率交替由于 aperture 7 的旋轉(zhuǎn)特性H3 分辨率存在Class II偶數(shù)分辨率與Class III奇數(shù)分辨率兩種網(wǎng)格取向二者軸線相差一個固定角度M_AP7_ROT_RADSasin(sqrt(3/28)) ≈ 0.3335 rad見 constants.h。源碼在 faceijk.c 的投影函數(shù)中針對 Class III 進行了角度修正_vec3ToHex2d中if (isResolutionClassIII(res)) theta ... - M_AP7_ROT_RADS_hex2dToVec3中逆修正確保奇偶分辨率網(wǎng)格在球面上正確銜接。五、12 個五邊形為什么純六邊形無法鋪滿球面一個重要的幾何事實是不可能僅用六邊形完全鋪滿球面或二十面體。這是歐拉多面體公式的必然結(jié)果——任何細分方案都會在二十面體頂點處產(chǎn)生五邊形。因此H3 在每個分辨率都必須包含恰好 12 個五邊形且每個五邊形的中心正好位于二十面體的一個頂點上。這一約束在源碼中得到嚴格保證constants.h 定義NUM_PENTAGONS 12、NUM_HEX_VERTS 6、NUM_PENT_VERTS 5基礎(chǔ)單元鄰接表baseCellNeighbors見 baseCells.c中對 12 個五邊形基礎(chǔ)單元標注了INVALID_BASE_CELL無某個方向的鄰居H3 索引定義中五邊形會跳過一個細分方向PENTAGON_SKIPPED_DIGIT K_AXES_DIGIT見 coordijk.h確保每個五邊形只有 6 個直接子單元5 個六邊形 1 個五邊形而不是 7 個。六、分辨率 0 基礎(chǔ)單元122 個單元構(gòu)成的網(wǎng)格底座第一個 H3 分辨率分辨率 0由122 個單元組成110 個六邊形 12 個以二十面體頂點為中心的五邊形這些單元被稱為base cells基礎(chǔ)單元。這 122 個基礎(chǔ)單元的選擇經(jīng)過了專門設(shè)計目標是盡量保留球面二十面體的對稱性。它們被賦予 0 到 121 的編號編號規(guī)則基于單元中心點的緯度基礎(chǔ)單元 0 的中心點緯度最高最北基礎(chǔ)單元 121 的中心點緯度最低最南。編號與鄰接關(guān)系、旋轉(zhuǎn)參數(shù)全部固化在 baseCells.c 的查找表中如baseCellNeighbors定義了每個基礎(chǔ)單元在 7 個方向上的鄰居以及baseCellNeighbor60CCWRotations等旋轉(zhuǎn)信息這些查找表構(gòu)成 H3 索引編碼/解碼的基礎(chǔ)?;A(chǔ)單元的方位與拓撲信息也可以由 generateBaseCellNeighbors.c 等生成工具復現(xiàn)。七、16 個分辨率0–15的統(tǒng)計規(guī)律H3 在分辨率 0 之上還提供15 個更細的網(wǎng)格分辨率總計 16 個分辨率0 到 15。最細的分辨率 15 的單元面積小于 1 平方米。各分辨率的詳細統(tǒng)計表單元數(shù)量、平均面積、邊長收錄在 restable.md 中核心規(guī)律如下單元數(shù)量每層恰好 12 個五邊形六邊形數(shù)量隨分辨率指數(shù)增長總單元數(shù)滿足公式c(r) 2 120 × 7^r推導過程見 restable.md 附錄基于每個六邊形 7 個子單元、每個五邊形 6 個子單元的遞歸關(guān)系。分辨率總單元數(shù)六邊形數(shù)五邊形數(shù)01221101218428301252,016,8422,016,830121033,897,029,88233,897,029,8701215569,707,381,193,162569,707,381,193,15012平均面積球面模型WGS84 authalic radius分辨率 0 的六邊形平均面積約 4,357,449.4 km2分辨率 15 約 0.895 m2同級五邊形面積約為六邊形的 0.5046 倍高分辨率下趨近該比值。同一分辨率內(nèi)六邊形面積并不完全相等靠近二十面體頂點的單元更小最小/最大面積比約為 1.99。平均邊長球面模型從分辨率 0 的約 1281.26 km 遞減到分辨率 15 的約 0.000584 km約 58 cm。注意 0–6 級邊長為精確計算更細級別為外推值。面積與邊長均基于球面模型計算與橢球地表實際數(shù)值有細微差別且同分辨率內(nèi)單元面積隨位置相對二十面體頂點的遠近而變化。八、實操用kml構(gòu)建目標可視化 H3 網(wǎng)格overview.md 提到可以通過 make 目標kml生成 KML 文件來可視化 H3 網(wǎng)格。結(jié)合 README.md 的構(gòu)建流程完整操作如下# 1. 從倉庫根目錄編譯默認最新開發(fā)版如需用發(fā)布版可先 git checkout v$(VERSION) mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease .. make # 2. 生成 KML 可視化文件 make kml運行后KML 文件會輸出到倉庫的KML子目錄。當前倉庫根目錄下已有一個示例輸出 icosa.kml可以配合 Google Earth 等工具打開查看二十面體/網(wǎng)格結(jié)構(gòu)。kml目標的定義與依賴可以在根目錄 CMakeLists.txt 中查閱。提示kml目標依賴make已成功構(gòu)建 H3 庫若需要生成不同分辨率或不同區(qū)域的網(wǎng)格可參考 filters 文檔與KML目錄內(nèi)現(xiàn)有產(chǎn)物結(jié)合使用。九、從幾何原理到 H3 索引層級結(jié)構(gòu)的工程落地H3 網(wǎng)格的分層結(jié)構(gòu)最終編碼為 64 位整數(shù)索引H3Index其位布局定義在 h3Index.h最高位bit 63保留位H3_HIGH_BIT_MASK4 位 modebit 59–62標識索引類型H3_CELL_MODE 1、H3_DIRECTEDEDGE_MODE 2、H3_EDGE_MODE 3、H3_VERTEX_MODE 4見 constants.h4 位 resolutionbit 52–55分辨率 0–157 位 base cellbit 45–51基礎(chǔ)單元編號 0–121之后每 3 位為一個分辨率 digitbit 0–44 共 15 個 digit表示該單元在對應層級沿 i/j/k 軸方向的細分位置0–6 有效7 表示超出當前分辨率的填充位。因此H3 索引天然攜帶分辨率 基礎(chǔ)單元 逐級細分方向三層信息從索引中可以直接解析出單元所在層級與位置——這正是層級索引在工程上的實現(xiàn)讀取索引即可判斷分辨率與基礎(chǔ)單元遍歷 digit 即可沿層級上溯或下鉆。而前文所述12 個五邊形的幾何約束、base cell 編號規(guī)則、aperture 7 的細分方向均被固化在這套位布局與 baseCells.c 的查找表中。十、常見問題辨析Q1H3 網(wǎng)格能只用六邊形嗎不能。歐拉公式?jīng)Q定每個分辨率必須恰好有 12 個五邊形五邊形中心位于二十面體頂點。Q2分辨率 0 與更高分辨率是什么關(guān)系分辨率 0 是 122 個基礎(chǔ)單元更高分辨率通過 aperture 7 遞歸細分每層六邊形面積約為上一層 1/7邊長按 sqrt(7) 遞減。Q3為什么面積表要區(qū)分六邊形與五邊形五邊形面積約為同級六邊形的 0.5046 倍不能混為一談且同分辨率內(nèi)六邊形面積隨相對二十面體頂點的位置波動最大/最小約 1.99 倍。Q4H3 的面積/邊長數(shù)值是基于橢球還是球面基于球面模型WGS84 authalic radius見 restable.md 的說明若需要橢球模型需另行換算。Q5KML 文件如何生成在構(gòu)建完成后于build目錄執(zhí)行make kml產(chǎn)物位于倉庫根目錄KML/子目錄??偨Y(jié)H3 是一個球體外接二十面體 面心多面體球心投影 aperture 7 遞歸細分構(gòu)成的離散全球網(wǎng)格系統(tǒng)。其核心設(shè)計要點可以概括為四件事一是用 Dymaxion 定向把 12 個頂點也是五邊形所在位置放到海洋中二是以 122 個基礎(chǔ)單元110 六邊形 12 五邊形作為分辨率 0 底座三是通過 aperture 7 實現(xiàn) 0–15 共 16 個分辨率的分層四是把每層恰好 12 個五邊形的幾何約束固化進索引位布局與查找表。理解了這四件事就掌握了 H3 索引為什么能同時做到分層、可聚合、空間近鄰一致。延伸閱讀各分辨率統(tǒng)計表單元數(shù)量、面積、邊長、推導公式restable.md源碼級坐標系統(tǒng)定義gnomonic / hex2d / IJKcoordijk.h球心投影與面間坐標變換實現(xiàn)faceijk.c基礎(chǔ)單元鄰接與旋轉(zhuǎn)查找表baseCells.c索引位布局與模式定義h3Index.h、constants.hKML 可視化示例輸出icosa.kml贊分享GIS【免費下載鏈接】h3Hexagonal hierarchical geospatial indexing system項目地址https://gitcode.com/gh_mirrors/h3/h3點擊查看免費下載相關(guān)推薦H3 六邊形層級地理空間索引系統(tǒng)全景解析從二十面體剖分到 16 級分辨率網(wǎng)格H3 六邊形層級地理空間索引系統(tǒng)全景解析從二十面體剖分到 16 級分辨率網(wǎng)格 H3 是一套基于六邊形網(wǎng)格的離散全球網(wǎng)格系統(tǒng)Discrete Global GGISH3-JS基于六邊形的地理網(wǎng)格系統(tǒng)H3 JS基于六邊形的地理網(wǎng)格系統(tǒng) 項目簡介 H3 JS 是一個基于 JavaScript 語言的開源項目它為 H3 核心庫提供了一個純 JavaScripGIS解密六邊形網(wǎng)格H3地理空間索引系統(tǒng)的終極架構(gòu)解析解密六邊形網(wǎng)格H3地理空間索引系統(tǒng)的終極架構(gòu)解析 在當今數(shù)據(jù)驅(qū)動的世界中 H3地理空間索引系統(tǒng) 作為Uber開源的六邊形分層地理空間索引工具正在徹底改變我GIS上一篇如何快速調(diào)整vim-airline終端透明度終極配置指南下一篇終極指南autojump v22.4.0 發(fā)布讓你的文件導航速度提升10倍創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考