H3出現背景
在不同緯度的地區使用等面積、等形狀的六邊形地理單元可以減少指標和特征 normalization的成本。另一方面,在常用的地理范圍查詢中,基於矩形的查詢方法,存在 8 鄰域到中心網格的距離不相等的問題,四邊形存在兩類長度不等的距離,而六邊形的周圍鄰居到中心網格的距離卻是有且僅有一個,從形狀上來說更加接近於圓形。
所以,基於 hexagon 的地理單元已經成為各大廠家的首選,比如 Uber 和 Didi 的峰時定價服務。
生成和填充幾何體
使用turf.js計算一個500m的近似圓,然后取出圓的坐標,使用H3填充幾何體
var point = turf.point([109.54040527300003,18.755681992000063]);
var buffered = turf.buffer(point, 0.5, {units: 'kilometers'});
let data=buffered.geometry.coordinates[0]
let length=data.length;
let newdata=[]
for(let i=0;i<length;i++){
let lon=data[i][0]
let lat=data[i][1]
newdata.push([lat,lon])
}
const hexagons = h3.polyfill(newdata, 12);
搜索相鄰
通過已知的六邊形H3字符串搜索周邊的六邊形
h3.kRing(h3index, 2);
壓縮H3索引集合
有時我們會覺得產生的六邊形太多,可以使用壓縮,這樣能大大減少六邊形數量,本例中H3索引數量壓縮前2110,但是壓縮后只有208
hexagons=h3.compact(hexagons)
合並索引集合
合並h3索引集返回geojson的ring
h3.h3SetToMultiPolygon(hexagons, true);
參考資料:
https://zhuanlan.zhihu.com/p/60861179
https://blog.csdn.net/allenlu2008/article/details/103029132
https://www.sohu.com/a/294377304_326074
https://github.com/uber/h3-js
http://lihuia.com/h3:優步的六邊形層級空間索引/
https://cosx.org/2019/01/deck-gl-and-h3/