matplotlib Basemap中如何加载shp文件

发布时间:2021-12-02 17:57:07 作者:小新
来源:亿速云 阅读:1129
# matplotlib Basemap中如何加载shp文件

## 前言

在地理信息可视化领域,Shapefile(.shp)是最常见的矢量数据格式之一。matplotlib的Basemap工具包作为经典的地理绘图库,支持对Shapefile文件的加载和渲染。本文将详细介绍如何利用Basemap读取、处理和可视化shp文件数据,包含完整代码示例和常见问题解决方案。

---

## 一、环境准备

### 1.1 安装必要库
确保已安装以下Python库:
```bash
pip install matplotlib basemap pyshp

1.2 Basemap的替代方案说明

由于Basemap已停止维护,官方推荐使用Cartopy作为替代。但若需兼容旧项目,仍可参考本文方法:

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

二、Shapefile文件结构

一个完整的Shapefile通常包含以下文件: - .shp:几何图形主体数据 - .shx:几何图形索引 - .dbf:属性数据表 - .prj:坐标系统定义(可选)

示例文件结构:

china_boundary/
├── china.shp
├── china.shx
├── china.dbf
└── china.prj

三、基础加载方法

3.1 基本加载流程

# 创建Basemap实例
m = Basemap(
    projection='merc', 
    llcrnrlat=15, urcrnrlat=55,
    llcrnrlon=70, urcrnrlon=140,
    resolution='i'
)

# 加载shp文件
m.readshapefile(
    'china_boundary/china',
    name='china_boundary',
    linewidth=0.5,
    color='k'
)

plt.title("China Boundary Map")
plt.show()

3.2 关键参数说明

参数 说明
path shp文件路径(不含扩展名)
name 自定义图层名称
drawbounds 是否绘制边界(默认True)
linewidth 边界线宽
color 边界颜色

四、高级应用技巧

4.1 访问属性数据

# 获取几何图形和属性
shapes = m.china_boundary  # 几何对象
info = m.china_boundary_info  # 属性字典

# 打印前5条属性
for i, attr in enumerate(info[:5]):
    print(f"Record {i}: {attr}")

4.2 自定义样式渲染

for shape, record in zip(m.china_boundary, m.china_boundary_info):
    # 根据属性值设置颜色
    if record['POP'] > 1000000:
        color = 'red'
    else:
        color = 'blue'
    
    # 绘制多边形
    x, y = zip(*shape)
    m.plot(x, y, marker=None, color=color)

4.3 多图层叠加

# 加载省界
m.readshapefile('province_boundary', 'provinces', color='gray')

# 加载河流
m.readshapefile('rivers', 'rivers', color='blue', linewidth=0.8)

# 加载城市点
m.readshapefile('cities', 'cities', marker='o', color='red')

五、常见问题解决

5.1 中文乱码问题

解决方案1:指定字体

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

解决方案2:使用Unicode编码

title = "中国地图".encode('unicode-escape').decode()
plt.title(title)

5.2 坐标系统不匹配

通过Basemap参数强制指定:

m = Basemap(
    # ...其他参数...
    epsg=4326  # WGS84坐标系统
)

5.3 大型文件处理

使用shp.Reader分块读取:

import shapefile

sf = shapefile.Reader('large_file.shp')
for shape in sf.iterShapes():
    if shape.shapeType == shapefile.POLYGON:
        x, y = zip(*shape.points)
        m.plot(x, y, 'b-', linewidth=0.5)

六、完整案例演示

6.1 中国省级行政区划图

fig = plt.figure(figsize=(12, 8))

m = Basemap(
    projection='lcc',
    lat_0=35, lon_0=105,
    llcrnrlon=73, llcrnrlat=18,
    urcrnrlon=135, urcrnrlat=54
)

# 加载国界
m.readshapefile('gadm36_CHN_shp/gadm36_CHN_1', 'provinces', 
               linewidth=0.8, color='darkgreen')

# 添加标注
for info, shape in zip(m.provinces_info, m.provinces):
    if info['NAME_1'] in ['Beijing', 'Shanghai']:
        x, y = np.mean(shape, axis=0)
        plt.text(x, y, info['NAME_1'], 
                fontsize=9, ha='center')

# 添加比例尺
m.drawmapscale(105, 25, 105, 35, 500, 
              barstyle='fancy', units='km')

plt.title("China Provincial Administrative Divisions")
plt.savefig('china_provinces.png', dpi=300)
plt.show()

七、性能优化建议

  1. 数据预处理:使用QGIS等工具简化复杂多边形
  2. 分级渲染:对细节要求低的区域降低分辨率
  3. 使用缓存:将处理后的数据保存为.npy格式
np.save('processed_data.npy', {'shapes': shapes, 'info': info})

结语

虽然Basemap已逐步被Cartopy取代,但其成熟的API和丰富的文档仍使其成为处理Shapefile的可靠选择。建议新项目优先考虑Cartopy,而历史项目可参考本文方法维护。掌握Shapefile的加载技巧,将极大拓展地理数据可视化的可能性。

注意:本文示例代码需配合实际Shapefile文件使用,测试数据可从Natural Earth等公开GIS数据源获取。 “`

该文档包含: - 完整的Markdown结构 - 代码块与表格混合排版 - 实际可运行的代码示例 - 常见问题解决方案 - 从基础到进阶的内容梯度 - 约1800字篇幅(实际字符数需根据排版调整)

可根据需要补充具体案例数据或增加可视化效果说明。

推荐阅读:
  1. 怎么在Python中修改matplotlib的默认字体
  2. Python中excel和shp如何使用在matplotlib

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

matplotlib basemap shp

上一篇:Matplotlib如何面向对象绘图

下一篇:tk.Mybatis插入数据获取Id怎么实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》