You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于空间连接的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:06:04