如何在Python中基于Excel/CSV坐标绘制世界地图矩形网格?
用Python绘制世界地图上的矩形网格
下面提供两种实用方案,分别对应交互式网页地图和静态图片地图的需求:
方法一:Folium 绘制交互式地图
适合生成可交互的网页地图,支持点击查看网格编号,操作门槛低。
1. 安装依赖库
pip install pandas folium
2. 读取并处理坐标数据
先从CSV/Excel文件读取数据,拆分每个坐标点的纬度和经度(以坐标格式为"纬度, 经度"为例,可根据实际格式调整拆分逻辑):
import pandas as pd # 读取CSV,读取Excel替换为pd.read_excel("你的文件.xlsx") df = pd.read_csv("grid_coords.csv") # 拆分坐标字符串为纬度、经度数值 def split_coord(coord_str): lat, lon = coord_str.strip().split(",") return float(lat), float(lon) # 批量拆分所有坐标列 df["tl_lat"], df["tl_lon"] = zip(*df["Top left coordinate"].apply(split_coord)) df["tr_lat"], df["tr_lon"] = zip(*df["Top right coordinate"].apply(split_coord)) df["bl_lat"], df["bl_lon"] = zip(*df["Bottom left coordinate"].apply(split_coord)) df["br_lat"], df["br_lon"] = zip(*df["Bottom right coordinate"].apply(split_coord))
3. 绘制网格并导出地图
import folium # 创建世界地图实例,中心定位到赤道,初始缩放级别2 m = folium.Map(location=[0, 0], zoom_start=2) # 遍历每个网格绘制矩形 for _, row in df.iterrows(): # 构造矩形闭合坐标点 coords = [ [row["tl_lat"], row["tl_lon"]], [row["tr_lat"], row["tr_lon"]], [row["br_lat"], row["br_lon"]], [row["bl_lat"], row["bl_lon"]], [row["tl_lat"], row["tl_lon"]] ] # 添加多边形到地图 folium.Polygon( locations=coords, color="#ff4500", fill=True, fill_color="#ff4500", fill_opacity=0.2, popup=f"Box No.: {row['Box Number']}" # 点击显示网格编号 ).add_to(m) # 保存为HTML文件,直接打开即可查看交互地图 m.save("grid_interactive_map.html")
方法二:Matplotlib + Cartopy 绘制静态地图
适合生成可用于报告、论文的静态图片地图,支持自定义地图投影和样式。
1. 安装依赖库
pip install pandas matplotlib cartopy
2. 读取数据
和Folium方案的坐标处理代码完全一致,直接复用即可。
3. 绘制静态网格地图
import matplotlib.pyplot as plt import cartopy.crs as ccrs # 创建带地图投影的画布,PlateCarree为等距圆柱投影,适合世界地图展示 fig, ax = plt.subplots(figsize=(12, 8), subplot_kw={'projection': ccrs.PlateCarree()}) # 添加基础地图元素:海岸线、陆地、海洋 ax.coastlines(linewidth=0.8) ax.add_feature(ccrs.cartopy.feature.LAND, facecolor="#f0f0f0") ax.add_feature(ccrs.cartopy.feature.OCEAN, facecolor="#cce7ff") # 遍历绘制每个网格 for _, row in df.iterrows(): # 提取矩形的经度、纬度序列 lons = [row["tl_lon"], row["tr_lon"], row["br_lon"], row["bl_lon"], row["tl_lon"]] lats = [row["tl_lat"], row["tr_lat"], row["br_lat"], row["bl_lat"], row["tl_lat"]] # 绘制边框和填充 ax.plot(lons, lats, color="#dc143c", linewidth=1, transform=ccrs.PlateCarree()) ax.fill(lons, lats, color="#dc143c", alpha=0.2, transform=ccrs.PlateCarree()) # 设置标题和布局 plt.title("World Grid Boxes", fontsize=14) plt.tight_layout() # 显示或保存图片 plt.show() # plt.savefig("grid_static_map.png", dpi=300, bbox_inches='tight')
关键注意事项
- 坐标格式适配:如果你的坐标不是
"纬度, 经度"格式,需要修改split_coord函数的拆分逻辑(比如按空格、分号分隔)。 - 性能优化:300个网格属于小数据量,两种方案都能流畅处理;若网格数量过万,可考虑批量绘制或简化样式。
- 投影选择:Cartopy支持
Robinson、Mercator等多种投影,可根据需求替换ccrs.PlateCarree()为对应投影类。
内容的提问来源于stack exchange,提问作者Harsh Srivastava
相关产品推荐
相关产品推荐

