当前位置:首页 > Python > 正文

Python Basemap库地图绘制教程 - 从入门到精通

Python Basemap库地图绘制完全指南

什么是Basemap?

Basemap是Matplotlib的一个扩展工具包,用于在Python中绘制2D地图。它能够:

  • 绘制大陆、国家和行政区划边界
  • 添加经纬度网格和标签
  • 使用多种地图投影方式
  • 在地图上叠加数据点和轨迹
  • 创建专业级地理可视化效果

注意:Basemap目前处于维护模式,官方推荐使用Cartopy作为替代。但Basemap仍被广泛使用,且拥有丰富的示例和文档。

安装Basemap

使用Anaconda安装(推荐):

conda install -c conda-forge basemap

使用pip安装:

pip install basemap

安装依赖库:

pip install matplotlib numpy pillow

绘制基础世界地图

以下代码创建一个简单的世界地图:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# 创建地图实例
plt.figure(figsize=(12, 8))
m = Basemap(projection='mill', llcrnrlat=-60, urcrnrlat=80, 
            llcrnrlon=-180, urcrnrlon=180, resolution='c')

# 绘制海岸线、国家边界等
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawmapboundary(fill_color='#c6e0ff')
m.fillcontinents(color='#f0e6d2', lake_color='#c6e0ff')

# 添加经纬度网格
m.drawparallels(range(-60, 81, 30), labels=[1,0,0,0])
m.drawmeridians(range(-180, 181, 60), labels=[0,0,0,1])

# 添加标题
plt.title("Basemap基础世界地图", fontsize=16)

# 显示地图
plt.show()

代码解析:

  • projection='mill': 使用米勒圆柱投影
  • llcrnrlat/urcrnrlat: 设置纬度范围
  • llcrnrlon/urcrnrlon: 设置经度范围
  • resolution='c': 使用粗糙分辨率(其他选项:'l'低, 'i'中, 'h'高, 'f'全)
  • drawcoastlines(): 绘制海岸线
  • drawcountries(): 绘制国家边界

高级地图绘制技巧

1. 使用不同投影方式

Basemap支持30多种投影方式,常见的有:

  • 'ortho': 正射投影(类似地球仪)
  • 'robin': 罗宾森投影(平衡投影)
  • 'merc': 墨卡托投影(常见于导航)
  • 'lcc': 兰伯特圆锥投影(适合中纬度地区)

2. 在地图上添加数据

将数据点添加到地图上:

# 定义城市坐标(经度,纬度)
cities = {
    '北京': (116.4, 39.9),
    '上海': (121.47, 31.23),
    '广州': (113.26, 23.12),
    '成都': (104.06, 30.67)
}

# 创建中国地图
plt.figure(figsize=(10, 8))
m = Basemap(projection='lcc', lat_0=35, lon_0=105, 
            width=5e6, height=5e6, resolution='h')
m.drawcoastlines()
m.drawcountries(linewidth=1.5)
m.drawmapboundary(fill_color='#c6e0ff')
m.fillcontinents(color='#f0e6d2', lake_color='#c6e0ff')

# 添加城市标记
for city, (lon, lat) in cities.items():
    x, y = m(lon, lat)
    m.plot(x, y, 'ro', markersize=8)
    plt.text(x, y, city, fontsize=12, color='#c0392b')

plt.title("中国主要城市分布图", fontsize=16)
plt.show()

3. 绘制轨迹和路径

连接点形成轨迹:

# 台风路径坐标
path = [
    (125.0, 15.0), (123.0, 16.5), (121.0, 18.0),
    (119.0, 20.0), (118.0, 22.5), (118.5, 25.0)
]

# 创建地图
plt.figure(figsize=(10, 8))
m = Basemap(projection='merc', llcrnrlat=10, urcrnrlat=30, 
            llcrnrlon=110, urcrnrlon=130, resolution='h')
m.drawcoastlines()
m.drawcountries()
m.drawmapboundary(fill_color='#c6e0ff')
m.fillcontinents(color='#f0e6d2', lake_color='#c6e0ff')

# 绘制路径
lons, lats = zip(*path)
x, y = m(lons, lats)
m.plot(x, y, 'b-', linewidth=2)  # 路径线
m.plot(x, y, 'ro', markersize=6)  # 路径点

# 添加起点和终点标签
plt.text(x[0], y[0], '起点', fontsize=10, color='#27ae60')
plt.text(x[-1], y[-1], '终点', fontsize=10, color='#c0392b')

plt.title("台风路径模拟图", fontsize=16)
plt.show()

常见问题与解决方法

1. 安装问题

问题: 安装时出现依赖错误

解决: 使用Anaconda安装或尝试:

pip install basemap --only-binary :all:

2. 地图显示空白

问题: 地图显示空白或只有轮廓

解决: 检查坐标范围设置,确保在合理范围内:

# 中国地图合理范围示例
llcrnrlon=70, urcrnrlon=140, 
llcrnrlat=15, urcrnrlat=55

3. 标签重叠

问题: 经纬度标签重叠显示

解决: 调整网格间距和标签位置:

# 每30度绘制一条纬线,只在左侧显示标签
m.drawparallels(range(-90, 91, 30), 
                labels=[1,0,0,0])

总结

Basemap是一个强大的地理数据可视化工具,通过本教程你学会了:

  • Basemap库的安装与环境配置
  • 创建不同投影和范围的地图
  • 自定义地图样式和颜色
  • 在地图上添加标记点和轨迹
  • 解决常见问题

虽然Basemap已被Cartopy取代,但它仍然是地理数据可视化的重要工具。掌握Basemap能为学习更先进的地理可视化库打下坚实基础。

发表评论