美文网首页
Uber H3使用

Uber H3使用

作者: Tcpieg | 来源:发表于2020-06-09 15:16 被阅读0次

    Uber H3地理索引

    正六边形优点

    首先正六边形相邻单元距离相等,且近似圆,不仅自身近似圆形,贴合密度概念,很适合大多数的汇总分析场景,而且周围相近近似圆形且等距,方便附近查找,阶梯分析等等。

    全球怎么划分成正六边形

    如果光是正六边形是没办法构成一个球体的,所以将全球分为正二十面体,每个交点有五条边,所以交点处有五边形。


    整体划分
    基本单元

    并且H3支持逐级拆分


    逐级拆分
    分辨率

    H3使用

    H3 Core Library由C写成,但是绑定其他语言,Java也可以调用核心的API。具体参考使用文档:https://h3geo.org/docs
    1、引入依赖

    <dependency>
        <groupId>com.uber</groupId>
        <artifactId>h3</artifactId>
        <version>3.6.3</version>
    </dependency>
    

    或者

    compile("com.uber:h3:3.6.3")
    

    2、根据H3文档,调用API
    https://h3geo.org/docs/api/indexing
    Java示例:

    public class test {
    
        public static void main(String[] args) throws IOException, DistanceUndefinedException, PentagonEncounteredException, LineUndefinedException {
            //将经纬度编码为六边形地址
            H3Core h3 = H3Core.newInstance();
            double lat = 31.920523;
            double lng = 119.168182;
            //H3分辨率
            int res = 6;
            String hexAddr = h3.geoToH3Address(lat, lng, res);
            System.out.println("H3地址:" + hexAddr);
    
            //H3地址转换为经纬度
            List<GeoCoord> geoCoords = h3.h3ToGeoBoundary(hexAddr);
            System.out.println("六边形顶点经纬度:" + geoCoords);
    
            //geoToH3:经纬度转换成H3索引
            System.out.println("H3索引Long类型:" + h3.geoToH3(lat, lng, 6));
    
            //查找索引的质心
            System.out.println("H3索引质心,经纬度坐标类型:" + h3.h3ToGeo(617847554087583743L));
    
            //查找索引的边界
            System.out.println("六边形顶点经纬度:" + h3.h3ToGeoBoundary(604336920381620223L));
    
            //根据提供的起点和终点返回单向边缘H3索引
            //起点镇江市
            double originLat = 31.977022;
            double originLng = 119.160861;
    
            //起终点经纬度转换为H3索引
            Long originH3Index = h3.geoToH3(originLat, originLng, 9);
            Long destH3Index = h3.geoToH3(lat, lng, 9);
    
            //查找相邻索引,将k=1定义为所有相邻索引
            System.out.println("origin相邻索引:" + h3.kRing(originH3Index, 1));
    
            //两索引是否为邻居
            boolean isNeighbors = h3.h3IndexesAreNeighbors(originH3Index, 617847554084700159L);
            System.out.println("两索引是否为邻居:" + isNeighbors);
    
            //计算单向边缘H3索引,单向边缘允许对从一个小区到相邻小区的有向边缘进行编码
            System.out.println("单向边缘H3索引:" + h3.getH3UnidirectionalEdge(originH3Index, 617847554084700159L));
    
            //返回两个索引之间的网格单元格距离
            System.out.println("两个索引之间的网格单元格距离:" + h3.h3Distance(originH3Index, destH3Index));
    
            //返回空心六角环
            System.out.println("周围相邻空心六角环:" + h3.hexRing(originH3Index, 1));
    
            //返回两个索引之间的索引行
            System.out.println("两个索引之间的索引行:" + h3.h3Line(originH3Index, destH3Index));
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Uber H3使用

          本文链接:https://www.haomeiwen.com/subject/oxistktx.html