如何在Python中创建地理网格分区并统计坐标点数量?
嘿,这个需求用 Pandas 就能高效搞定,完全不用费劲写循环~我平时处理这种网格分区统计的需求,都是用向量化操作+分组统计的思路,既简洁又高效,尤其适合大数据量的场景。下面一步步给你讲怎么实现:
核心实现步骤
1. 先定义网格参数
首先得确定你的网格大小,比如你想把区域分成 0.1°×0.1° 的网格,那就设定对应的步长。这个参数可以根据你的需求随便调:
# 自定义网格步长,比如0.1度(可根据实际需求修改) lat_step = 0.1 lon_step = 0.1
如果你的目标是特定区域,还可以先筛选出该区域内的坐标,避免处理无关数据:
# 假设目标区域是纬度30°-40°,经度100°-120°,先过滤数据 min_lat, max_lat = 30.0, 40.0 min_lon, max_lon = 100.0, 120.0 filtered_df = df[(df['Latitude'].between(min_lat, max_lat)) & (df['Longitude'].between(min_lon, max_lon))]
2. 给每个坐标分配网格ID
接下来用向量化计算,给每个坐标打上所属网格的标签。这里用向下取整的方式,确保每个网格是左闭右开的区间,避免坐标点重复统计:
# 计算每个坐标对应的网格基准点 filtered_df['lat_grid'] = (filtered_df['Latitude'] // lat_step) * lat_step filtered_df['lon_grid'] = (filtered_df['Longitude'] // lon_step) * lon_step # 把网格的经纬度合并成一个唯一ID(也可以直接用两个列分组,看你需求) filtered_df['grid_id'] = filtered_df.apply(lambda row: f"({row['lat_grid']:.1f}, {row['lon_grid']:.1f})", axis=1)
💡 小技巧:如果担心浮点数精度问题(比如0.1在二进制里是无限循环小数),可以把坐标转成整数计算:
# 比如保留1位小数,转成整数后再处理 precision = 1 filtered_df['lat_grid'] = (filtered_df['Latitude'] * 10**precision).astype(int) filtered_df['lat_grid'] = (filtered_df['lat_grid'] // 10**precision) / 10**precision # 经度同理 filtered_df['lon_grid'] = (filtered_df['Longitude'] * 10**precision).astype(int) filtered_df['lon_grid'] = (filtered_df['lon_grid'] // 10**precision) / 10**precision
3. 统计每个网格的坐标点数量
最后用Pandas的groupby分组统计,一步得到结果:
# 方式1:按grid_id分组统计 grid_point_count = filtered_df.groupby('grid_id').size().reset_index(name='point_count') # 方式2:按lat_grid和lon_grid分组(更方便后续做空间可视化) grid_point_count = filtered_df.groupby(['lat_grid', 'lon_grid']).size().reset_index(name='point_count')
为什么这是最优方法?
- 性能拉满:全程用Pandas的向量化操作,比你循环处理
zip(lat, lon)快N倍,尤其是数据量上万甚至百万级的时候,差距特别明显; - 灵活可调:改个步长参数就能切换网格大小,适配不同的需求;
- 结果易用:统计后的DataFrame可以直接用来做热力图、散点图等可视化,或者导出成其他格式。
内容的提问来源于stack exchange,提问作者E. Lutins
相关产品推荐
相关产品推荐

