如何对落入同一10km边界框的DataFrame经纬度行分组累加并去重
问题原因
你之前使用固定步长0.1进行经纬度分箱,和你自定义的10km×10km边界框对应的经纬度偏移量不匹配,是分组未达预期的核心原因。
实现方案
步骤1:计算10km对应的经纬度分箱步长
和你提供的create_space逻辑保持一致,先算出10km距离对应的纬度偏移量,再根据你的数据纬度范围计算经度偏移量:
import math import numpy as np import pandas as pd # 地球半径(单位:米) EARTH_RADIUS = 6378137 # 10km对应的纬度差(固定值,约0.0898度) lat_step = (180 / math.pi) * (500 / EARTH_RADIUS) * 10 # 计算经度偏移量:根据数据的平均纬度做修正,保证经度方向也是10km avg_lat = df['lat'].mean() lon_step = lat_step / math.cos(math.radians(avg_lat))
步骤2:经纬度分箱
按照上面计算得到的步长对经纬度做分箱处理:
df['lat_bin'] = np.floor(df['lat'] / lat_step) * lat_step df['lon_bin'] = np.floor(df['lon'] / lon_step) * lon_step
步骤3:分组聚合
将同一个分箱内的行归为一组,累加occurrence字段,其余字段可根据需求选择保留第一个值/平均值等:
# 按分箱分组 group_df = df.groupby(['lat_bin', 'lon_bin'], as_index=False) # 聚合规则可根据你的实际字段调整,这里示例保留组内第一个经纬度,累加occurrence result_df = group_df.agg( lat = ('lat', 'first'), lon = ('lon', 'first'), occurrence = ('occurrence', 'sum') # 其余需要保留的字段可在这里补充对应聚合规则 ) # 可选:删除不需要的分箱字段 result_df = result_df.drop(columns=['lat_bin', 'lon_bin'])
补充说明
如果你的数据纬度跨度极大,对精度要求极高,可以按每个纬度分箱的中心纬度单独计算对应经度步长,避免跨纬度区域的经度偏移误差。如果数据量较小,也可以引入R树空间索引做精确的边界包含判断,避免分箱边界的点误判。
内容的提问来源于stack exchange,提问作者Nickey
相关产品推荐
相关产品推荐

