Uber H3简单介绍

一、什么是H3?

将地球空间划分成可是识别的单元。将经纬度H3编码成六边形的网格索引。

二、为什么用H3?

2.1 GEOHASH存在一些不足

  • 不同精度下网格的形状不一且精度的变化幅度时小时大
  • 在不同维度的地区会出现地理单元单位面积差异较大的情况
  • 存在8邻域到中心网格的距离不相等问题

2.2 H3的映射原理简述

基于正多边形内角和公式( θ = ( x − 2 ) ∗ 180 \theta=(x-2)*180 θ=(x2)180 ), 和顶点和为360计算出, 360 y = ( x − 2 ) ∗ 180 x \frac{360}{y} = \frac{(x-2)*180}{x} y360=x(x2)180 ,所有y(正多边形个数), x的组合
六边形因为边数最多,最接近圆,所以理论上来说在某些场景下是最优的选择。H3干脆摒弃传统的地图投影,直接在地球上铺满六边形。采用多层网格映射

三、H3的主要应用是什么?

  • 优化乘车价格和调度(动态定价)
  • 地图空间数据可视化和挖掘
  • 用于整个市场的分析和优化

四、Uber H3实战: 英国交通事故点聚类

脚本在notebook里运行即可

import numpy as np
import pandas as pd
import folium
from h3 import h3
from sklearn.cluster import DBSCAN
from folium.plugins import HeatMap
def creat_map(cluster):
    map_fig = folium.Map(zoom_start=12)
    def color_choose(cnt):
        color_list = ['#FFC1C1', '#EEB4B4', '#FF6A6A', '#EE6363', '#CD5555', '#8B3A3A']
        if cnt <= 14:
            return color_list[0]
        elif cnt <= 17:
            return color_list[1]
        elif cnt <= 21:
            return color_list[2]    
        elif cnt <= 25:
            return color_list[3]   
        elif cnt <= 30:
            return color_list[4]   
        else:
            return color_list[5]  

    
    for cluster in cluster.values():
        points = cluster['geom']
        ac_cnt = cluster['count']
        tooltip = f'{ac_cnt} accidents'
        map_fig.add_child(
        folium.vector_layers.Polygon(
            locations=points,
            tooltip=tooltip,
            fill=True,
            fill_color='#ff0000',
            fill_opacity=0.4,
            weight=2,
            opacity=0.7
        ))
    # 边界设置
    max_lat = df.Latitude.max()
    min_lat = df.Latitude.min()
    max_lon = df.Longitude.max()
    min_lon = df.Longitude.min()
    map_fig.fit_bounds([[min_lat, min_lon], [max_lat, max_lon]])
    return map_fig
   
file = './dftRoadSafety_Accidents_2016.csv'
column_types = {'Accident_Index': np.string_, 'LSOA_of_Accident_Location': np.string_}
uk_acc = pd.read_csv(file, dtype=column_types)

# 将经纬度转换成H3s
global H3_LEVEL
H3_LEVEL = 7
def lat_lng_2_h3(row):
    return h3.geo_to_h3(row['Latitude'], row['Longitude'], H3_LEVEL)
uk_acc['h3'] = uk_acc.apply(lat_lng_2_h3, axis=1)
# DBSCAN 聚类
## 角度 -> 弧度  1 * np.pi / 180
uk_acc['rad_lng'] = np.radians(uk_acc['Longitude'].values)
uk_acc['rad_lat'] = np.radians(uk_acc['Latitude'].values)
eps_in_meter = 50.0
EARTH_R = 6370996.8 # 地球半径
dbscan = DBSCAN(eps=eps_in_meter/EARTH_R, min_samples=10, metric='haversine')
uk_acc = uk_acc.loc[~uk_acc['rad_lat'].isna(), :].reset_index(drop=True)
uk_acc['cluster'] = dbscan.fit_predict(uk_acc[['rad_lat', 'rad_lng']])
df = uk_acc[(uk_acc.cluster != -1)].reset_index(drop=True).copy()
uk_acc['cluster'].value_counts()

# 绘制聚合后的数据
clusters = dict()
for idx, row in df.iterrows():
    key = row['h3']
    if key in clusters:
        clusters[key]['count'] += 1
    else:
        clusters[key] = {'count' : 1, 'geom': h3.h3_to_geo_boundary(h=key)}
relevat_clusters = {
    k : v for (k, v) in clusters.items() if v['count'] >= 10
}
creat_map(relevat_clusters)

在这里插入图片描述

# 热力图
from folium.plugins import HeatMap
map_hooray = folium.Map(location=df.loc[0,  ['Latitude', 'Longitude']].tolist(), zoom_start=14)
HeatMap(df[['Latitude', 'Longitude']]).add_to(map_hooray)
for idx in range(df.shape[0]):
    folium.Marker(
        df.loc[idx, ['Latitude', 'Longitude']].tolist(),
        tooltip=df.loc[idx,  'cluster'].tolist()
    ).add_to(map_hooray)
map_hooray

在这里插入图片描述

参考:
https://www.biaodianfu.com/uber-h3.html

  • 参考链接中部分脚本进行了修改
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Uber Golang规范是Uber专门为其Golang代码库制定的一套代码编写指南和规范。以下是Uber Golang规范的主要特点: 命名规范:采用驼峰命名法,遵循Go语言的命名约定。使用有意义且描述性强的名称,避免使用缩写。 包和依赖管理:使用Go的标准工具go mod来管理包和依赖。在代码库的根目录下创建go.mod文件,明确定义需要使用的外部依赖。 代码布局:代码文件应按照功能逻辑进行组织,每个文件夹下应包含一个独立的Go模块。避免使用过深的嵌套文件夹结构。 错误处理:在函数签名中使用`error`类型,以便清晰地表示可能出现的错误。避免使用panic来处理错误,而是使用返回错误信息来处理。 并发:使用Go语言提供的并发原语,如goroutine和channel,来编写并发代码。避免使用传统的同步原语,如互斥锁。 测试:为每个包编写相应的测试代码,测试代码应放在与源代码相同的包中,以便方便进行单元测试。使用`go test`来运行测试。 文档:代码应有清晰的注释,包括每个公共函数和方法的文档注释。注释应使用规范的格式,方便生成文档。 性能优化:在编写代码时要考虑性能,并进行必要的性能优化。可以使用Go的性能分析工具来找出性能瓶颈并进行优化。 此外,Uber Golang规范还提供了关于代码风格、错误处理、日志记录、版本管理和代码重用等方面的指导。遵循这些规范可以使代码更易于理解、维护和扩展,并提高代码库的整体质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值