空间索引之Uber H3
H3是一种基于网格的空间索引,但跟普通的矩形网格索引不同的是,他的每一个网格都是正六边形。为啥要选正六边形呢,因为在基于网格的空间索引中,使用的多边形的边数越多,则一个网格越近似圆形,做缓冲区查询、kNN查询什么的也就越方便。而做网格索引又要求空间能够被网格铺满,不能有缝隙。
GitHub地址:https://github.com/uber/h3
官网使用文档:Joining | H3
Java操作
引⼊依赖
<dependency>
<groupId>com.uber</groupId>
<artifactId>h3</artifactId>
<version>4.0.0</version>
</dependency
索引应⽤
获得h3
long stringToH3(String h3Address);
点所在的区块
H3Core h3 = H3Core.newInstance();
//参数分别为坐标xy,以及区块对应的级别
h3.latLngToCellAddress(33.24564,108.334266,8);
⾯覆盖的区块
H3Core h3 = H3Core.newInstance();
//根据覆盖的⾯构造点集合
List<LatLng> list =new ArrayList<>();
//获取集合覆盖的区块(这⾥需要注意,被⾯包含了区块中⼼才可以返回,仅跟区块有交集的不返回)
h3.polygonToCellAddresses(list,null,8);
区块间的距离
H3Core h3 = H3Core.newInstance();
//传⼊两个区块的编号
h3.gridDistance("86318c22fffffff","86318c22fffffff");
区块周边
H3Core h3 = H3Core.newInstance();
//判断两个区块是否相邻
h3.areNeighborCells("86318c22fffffff","86318c22fffffff");
//获取两个区块中间的区块
h3.gridPathCells("86318c22fffffff","86318c22fffffff");
//区块⾯积
h3.cellArea("86318c22fffffff", AreaUnit.m2);
在官方文档中还有很多关于的使用介绍,大家可以进入使用文档去查看,这里只是例举了几种使用