应使用geopandas替代pandas进行空间聚合:先将经纬度转为point并设置crs(如epsg:4326),再投影到平面坐标系(如epsg:3857)计算距离;避免apply循环,改用sjoin_nearest或向量化distance;超百万数据推荐h3索引;务必验证crs是否生效。

用 geopandas 代替纯 pandas 做空间聚合
纯 pandas 没有内置地理语义,对经纬度列直接 groupby 只能按数值分组,无法处理“某半径内所有点”这类空间关系。必须升维到几何对象层面。
实操建议:
- 把
latitude和longitude列转成Point几何对象,用geopandas.GeoDataFrame管理 - 设置 CRS(如
EPSG:4326),否则后续距离计算全是错的——单位是度,不是米 - 聚合前先用
gdf.to_crs("EPSG:3857")或更合适的投影(如EPSG:32633)转为平面坐标系,再算距离或做缓冲区
避免在 apply 中逐行调用 shapely.distance
常见错误:写 df.apply(lambda x: point.distance(x.geometry), axis=1) 计算每个点到中心点的距离。这会触发 Python 层循环,10 万点可能卡住数分钟。
正确做法:
- 用
geopandas.sjoin_nearest批量找最近邻(支持max_distance参数限定范围) - 对小规模参考点集(比如几千个商圈中心),用
sklearn.metrics.pairwise_distances+pyproj.Transformer投影后批量算欧氏距离,比 shapely 快 10–50 倍 - 若必须用
shapely,改用gdf.geometry.distance(other_point)向量化调用,不进apply
h3 索引适合千万级点的快速格网聚合
当数据量超过百万,geopandas 的矢量操作开始吃力,尤其要做“每 500 米格网内计数”这类操作时,h3 是更轻量的选择。
关键点:
- 用
h3.geo_to_h3(lat, lng, resolution=9)把坐标转为六边形索引(resolution=9≈ 500 米边长) -
h3索引是字符串,可直接pandas.groupby,无需 GIS 库加载 - 注意:不要用
resolution=10处理全国级数据——索引数量爆炸,内存占用陡增;优先测8~9 - 聚合后想回查原始点?保留原始
h3_index列,别只存聚合结果
距离单位陷阱:distance 返回值未必是米
shapely.geometry.Point.distance 在 WGS84(EPSG:4326)下返回的是“度”,不是米——赤道 1 度≈111km,高纬度地区严重失真。
务必确认:
- 是否已用
to_crs()转到投影坐标系(如 UTM)?投影后.distance()才是米 - 用
geopy.distance.geodesic更准,但慢;适合校验或小批量 - 如果只是排序(比如“找最近 10 个”),用球面余弦公式(
haversine)比转投影更快,且结果可比
最常被忽略的是 CRS 转换后没检查 gdf.crs 是否真的变了——打印一下,别信代码写得对。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











