您好,登录后才能下订单哦!
# matplotlib Basemap中如何加载shp文件
## 前言
在地理信息可视化领域,Shapefile(.shp)是最常见的矢量数据格式之一。matplotlib的Basemap工具包作为经典的地理绘图库,支持对Shapefile文件的加载和渲染。本文将详细介绍如何利用Basemap读取、处理和可视化shp文件数据,包含完整代码示例和常见问题解决方案。
---
## 一、环境准备
### 1.1 安装必要库
确保已安装以下Python库:
```bash
pip install matplotlib basemap pyshp
由于Basemap已停止维护,官方推荐使用Cartopy作为替代。但若需兼容旧项目,仍可参考本文方法:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
一个完整的Shapefile通常包含以下文件:
- .shp
:几何图形主体数据
- .shx
:几何图形索引
- .dbf
:属性数据表
- .prj
:坐标系统定义(可选)
示例文件结构:
china_boundary/
├── china.shp
├── china.shx
├── china.dbf
└── china.prj
# 创建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()
参数 | 说明 |
---|---|
path |
shp文件路径(不含扩展名) |
name |
自定义图层名称 |
drawbounds |
是否绘制边界(默认True) |
linewidth |
边界线宽 |
color |
边界颜色 |
# 获取几何图形和属性
shapes = m.china_boundary # 几何对象
info = m.china_boundary_info # 属性字典
# 打印前5条属性
for i, attr in enumerate(info[:5]):
print(f"Record {i}: {attr}")
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)
# 加载省界
m.readshapefile('province_boundary', 'provinces', color='gray')
# 加载河流
m.readshapefile('rivers', 'rivers', color='blue', linewidth=0.8)
# 加载城市点
m.readshapefile('cities', 'cities', marker='o', color='red')
解决方案1:指定字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
解决方案2:使用Unicode编码
title = "中国地图".encode('unicode-escape').decode()
plt.title(title)
通过Basemap
参数强制指定:
m = Basemap(
# ...其他参数...
epsg=4326 # WGS84坐标系统
)
使用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)
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()
np.save('processed_data.npy', {'shapes': shapes, 'info': info})
虽然Basemap已逐步被Cartopy取代,但其成熟的API和丰富的文档仍使其成为处理Shapefile的可靠选择。建议新项目优先考虑Cartopy,而历史项目可参考本文方法维护。掌握Shapefile的加载技巧,将极大拓展地理数据可视化的可能性。
注意:本文示例代码需配合实际Shapefile文件使用,测试数据可从Natural Earth等公开GIS数据源获取。 “`
该文档包含: - 完整的Markdown结构 - 代码块与表格混合排版 - 实际可运行的代码示例 - 常见问题解决方案 - 从基础到进阶的内容梯度 - 约1800字篇幅(实际字符数需根据排版调整)
可根据需要补充具体案例数据或增加可视化效果说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。