如何用Python关联.shp网格与.csv数据并实现栅格值可视化?
别担心,用GeoPandas完全能搞定这个需求,我给你一步步拆解实现方法,代码都写好了,跟着来就行~
实现步骤详解
1. 先安装必要的库
首先得确保你装了处理空间数据和绘图的核心库,打开终端执行:
pip install geopandas matplotlib
2. 加载并关联数据
我们需要把shp网格和csv数据通过cell_id合并到一起,先分别加载两个文件,再做关联:
import geopandas as gpd import pandas as pd import matplotlib.pyplot as plt # 加载shp网格文件,替换成你的文件路径 grid_gdf = gpd.read_file("你的网格文件路径.shp") # 加载csv数据,替换成你的文件路径 csv_df = pd.read_csv("你的csv文件路径.csv") # 通过cell_id合并数据:inner模式只保留两边都存在的cell_id # 如果想保留所有网格(哪怕csv里没对应数据),可以把how改成"left" merged_gdf = grid_gdf.merge(csv_df, on="cell_id", how="inner")
小提示:解决cell_id匹配失败的问题
如果合并后发现数据少了很多,大概率是cell_id的类型不匹配(比如shp里是字符串,csv里是整数),可以统一类型:
# 把csv里的cell_id转成字符串,和shp保持一致 csv_df["cell_id"] = csv_df["cell_id"].astype(str)
3. 可视化:数值越高颜色越暗
接下来就是绘图了,我们用反向的灰度色系(Greys_r)来实现“数值越高颜色越暗”的效果,也可以换成OrRd_r这类反向的暖色系,看你偏好:
# 创建绘图画布,调整尺寸让显示更清晰 fig, ax = plt.subplots(figsize=(10, 10)) # 绘制网格,用csv里的数值列映射颜色 merged_gdf.plot( column="你的数值列名称", # 替换成csv里存储数值的列名,比如"traffic_count" cmap="Greys_r", # 反向灰度图,数值越高颜色越暗 ax=ax, edgecolor="white", # 用白色边框区分每个单元格 legend=True, # 显示颜色图例 legend_kwds={"label": "单元格数值", "orientation": "horizontal"} # 自定义图例样式 ) # 去掉坐标轴,让图形更整洁 ax.set_axis_off() # 显示最终图形 plt.show()
额外注意事项
- 确保shp的附属文件(.shx、.dbf等)和主shp文件在同一个文件夹里,不然GeoPandas会加载失败
- 如果csv里有缺失的数值,可以用
merged_gdf.dropna(subset=["你的数值列名称"])删除空值行,或者用fillna(0)填充默认值
内容的提问来源于stack exchange,提问作者AlketCecaj
相关产品推荐
相关产品推荐

