如何基于boundaries GeoDataFrame计算落入边界的移动订阅总量?
解决方法
步骤1:将订阅数据转换为点要素GeoDataFrame
你的订阅数据目前只有经纬度列,需要先把它们转换成shapely.Point类型的几何对象,才能进行空间计算:
import geopandas as gpd from shapely.geometry import Point # 假设你的订阅数据GeoDataFrame名为 subs_gdf subs_gdf['geometry'] = subs_gdf.apply(lambda row: Point(row['X'], row['Y']), axis=1) # 确保订阅数据的坐标参考系(CRS)与boundaries完全一致 subs_gdf = subs_gdf.set_crs(boundaries.crs, allow_override=True)
步骤2:空间连接匹配边界与订阅点
用空间连接将每个订阅点匹配到对应的边界中:
# 左连接保留所有边界,用contains判断点是否落入边界内 joined_data = gpd.sjoin(boundaries, subs_gdf, how='left', predicate='contains')
步骤3:按边界分组计算订阅总数
根据边界的唯一标识(优先用边界自带的ID列,比如boundary_id;没有的话用索引)分组,对订阅数量求和:
# 这里假设用边界的索引分组,若有专属ID列,替换成 groupby('boundary_id') subs_total = joined_data.groupby(joined_data.index)['移动订阅数量'].sum().reset_index(name='订阅总数')
步骤4:合并结果回原边界GeoDataFrame
把计算好的总数合并到boundaries中,并处理无订阅点的边界(填充0):
boundaries = boundaries.merge(subs_total, left_index=True, right_on='index', how='left') # 为空的边界填充0,表示该区域没有订阅点 boundaries['订阅总数'] = boundaries['订阅总数'].fillna(0)
注意事项
- 必须确保两个GeoDataFrame的CRS完全一致,否则空间判断会失效,可通过
boundaries.crs查看坐标系统,用subs_gdf.to_crs(boundaries.crs, inplace=True)转换。 - 如果边界数据有唯一标识列(比如行政区代码),用该列分组比索引更可靠,避免因索引重复导致计算错误。
内容的提问来源于stack exchange,提问作者Izzat Kamaruddin
相关产品推荐
相关产品推荐

