基于空间连接的geohash字典查询及不匹配值补全实现方案
可用于查找邻近geohash的库
- pygeohash:纯Python实现的轻量geohash工具库,内置相邻geohash查询、经纬度与geohash互转等核心功能,接口简单易调用,兼容全版本Python3
- geohash2:基于经典python-geohash项目优化的分支版本,功能覆盖pygeohash所有常用能力,无额外编译依赖
- python-geohash:老牌geohash处理库,底层带C扩展实现,计算性能更高,部分环境安装时需要编译依赖
需求实现代码
首先安装所需依赖:pip install pygeohash pandas
基础实现版本
import pygeohash as pgh import pandas as pd # 配置项 geo_dict = {'9q5dx': 10, '9q9hv': 15, '9q5dv': 20} k = 3 # 最多取k个邻近geohash计算平均值 default_value = 0 # 无任何匹配的邻近geohash时的兜底默认值 df = pd.DataFrame({'geohash': ['9q5dx','9qh0g','9q9hv','9q5dv'], 'label': ['a', 'b', 'c', 'd']}) def get_geo_value(geo_code): # 优先匹配字典中存在的geohash if geo_code in geo_dict: return geo_dict[geo_code] # 获取当前geohash的8个相邻格子编码 neighbors = pgh.neighbors(geo_code) # 筛选出字典中存在的有效相邻编码 valid_neighbors = [g for g in neighbors if g in geo_dict] if not valid_neighbors: return default_value # 取最多k个有效值计算平均值 take_count = min(k, len(valid_neighbors)) return sum(geo_dict[g] for g in valid_neighbors[:take_count]) / take_count df['value'] = df['geohash'].apply(get_geo_value)
大数据量优化版本
如果DataFrame数据量较大,可先完成直接匹配,仅处理匹配失败的行,减少冗余计算:
# 先做全量直接匹配,匹配失败的位置为NaN df['value'] = df['geohash'].map(geo_dict) # 仅对匹配失败的行计算邻近值 df.loc[df['value'].isna(), 'value'] = df.loc[df['value'].isna(), 'geohash'].apply(get_geo_value)
扩展说明
如果需要严格按照物理距离取最近的k个邻近geohash,可先将geohash转为经纬度,通过haversine公式计算目标点与所有相邻点的距离,排序后取top k再计算平均值。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

