网易首页 > 网易号 > 正文 申请入驻

基于 Python 的地理空间绘图详细教程

0
分享至

大部分情况下,地理绘图可使用 Arcgis 等工具实现。但正版的 Arcgis 并非所有人可以承受。本文基于 Python 的 cartopy 和 matplotlib 等库,为地理空间绘图的代码实现提供参考。

所有所需库如下:

gma、cartopy、matplotlib、numpy

Part1绘图目标

基于 Python 的地理空间绘图目标实现以下效果(包含比例尺、指北针、经纬网、图例等):

Part2绘图思路

制图流程图

Part3数据处理

本例以 ESA 2020 陆表覆盖河南省地物分类数据为例,通过gma.rasp.AddColorTable 更新色彩映射表,形成三个与原始文件不同的副本栅格(仅配色不同)。并对四个栅格进行绘制。这四个文件分别为:

"地表覆盖_河南_ESA_2020.tif" ----原始数据"地表覆盖_河南_ESA_2020 - 副本.tif" "地表覆盖_河南_ESA_2020 - 副本 (2).tif" "地表覆盖_河南_ESA_2020 - 副本 (3).tif"

底图以我国省、地级市边界以及1-5级河流和湖泊为主。

import gma
# 1.根据定义更新——第一个副本
## 待更新的色彩映射表
ColorTable = { 10:( 0, 112, 255, 255),
20:( 255, 211, 127, 255),
30:( 76, 230, 0, 255),
40:( 123, 104, 238, 255),
50:( 230, 230, 0, 255),
60:( 205, 245, 122, 255),
70:( 156, 200, 121, 255),
80:( 245, 162, 122, 255),
90:( 190, 210, 255, 255),
95:( 109, 150, 178, 255),
100:( 223, 198, 142, 255)}
## 将定义的色彩映射表更新到 副本
gma.rasp.AddColorTable( "地表覆盖_河南_ESA_2020 - 副本.tif",
ColorTable = ColorTable)
# 2.根据模板栅格更新——第二个副本
## 将 副本 的色彩映射表更新到 副本(2)
gma.rasp.AddColorTable( "地表覆盖_河南_ESA_2020 - 副本 (2).tif",
"地表覆盖_河南_ESA_2020 - 副本.tif")
# 3.根据模板栅格和定义更新——第三个副本
## 将 副本 以及定义的色彩映射表更新到 副本 (3)
gma.rasp.AddColorTable( "地表覆盖_河南_ESA_2020 - 副本 (3).tif",
"地表覆盖_河南_ESA_2020 - 副本.tif",
ColorTable = { 10:( 100, 100, 100, 255), 40:( 200, 200, 200, 255)})

Part4绘制栅格

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib.colors as cor
import numpy as np
import gma.extend.mapplottools as mpt
PAR = { 'font.sans-serif': 'Times New Roman',
'axes.unicode_minus': False,
}
plt.rcParams.update(PAR)

1读取色彩映射表信息(若不包含,可自行定义色带)

InFiles = [ "地表覆盖_河南_ESA_2020.tif", "地表覆盖_河南_ESA_2020 - 副本.tif",
"地表覆盖_河南_ESA_2020 - 副本 (2).tif", "地表覆盖_河南_ESA_2020 - 副本 (3).tif"]
#### 读取四组数据色彩信息
CMap = []
Colors = []
for InFile in InFiles:
DataSet = gma.Open(InFile)
Color = DataSet.GetGDALDataset().GetRasterBand( 1).GetColorTable()
ColorTable = [Color.GetColorEntry(i) for i in range(Color.GetCount())]
# 转换 色彩映射表 为 Matplotlib 可识别的格式
CMapV = tuple(tuple(np.array(CT) / 255) for CT in ColorTable)
# 生成色带
CMap.append(cor.ListedColormap(CMapV))
Colors.append([CMapV[i] for i in range( 10, 110, 10)] + [CMapV[ 95]])
#### 为四组数据分配名称
Method = [ '原始配色', '根据定义更新', '根据模板栅格更新', '根据模板栅格和定义更新']
#### 为颜色值定义含义
ColorName = [ '林地', '灌木', '草地', '耕地', '建筑', '裸地/稀疏植被区', '雪和冰', '开阔水域',
'草本湿地', '红树林', '苔藓和地衣']

2定义数据分块——用于数据分块绘制(节约内存)

当数据过大时,直接绘制可能失败。若想精确绘制,可采用此方法(若涉及到投影,大数据耗时较久)。否则,可以缩放数据,减小分辨率(类似栅格金字塔构建规则)进行绘制。

BlockSize = 8000
Columns = DataSet.Columns
Rows = DataSet.Rows
Blocks = [(r, c) for r in range( 0, Rows, BlockSize) for c in range( 0, Columns, BlockSize)]

3配置制图范围

GEOT = DataSet.GeoTransform
Columns = DataSet.Columns
Rows = DataSet.Rows
# 数据边界
ExtentData = [GEOT[ 0], GEOT[ 0] + GEOT[ 1] * Columns, GEOT[ 3] + GEOT[ -1] * Rows, GEOT[ 3]]
# 绘图边界(以数据边界为基础确定)
EL, ER, EB, ET = 0.2, 0.1, 0.15, 0.05 # 左右、下上边界的扩展比例
ExtentPLT = [ExtentData[ 0] - (ExtentData[ 1] - ExtentData[ 0]) * EL,
ExtentData[ 1] + (ExtentData[ 1] - ExtentData[ 0]) * ER,
ExtentData[ 2] - (ExtentData[ 3] - ExtentData[ 2]) * EB,
ExtentData[ 3] + (ExtentData[ 3] - ExtentData[ 2]) * ET]

4绘制数据

WKTCRS = DataSet.Projection
DataCRS = mpt.GetCRS(WKTCRS)
fig = plt.figure(figsize = ( 10, 10), dpi = 600)

# 定义一个标准中国区 ALBERS 投影
Alberts_China = ccrs.AlbersEqualArea(central_longitude = 105, standard_parallels = ( 25.0, 47.0))

for i in range( 4):
ax = plt.subplot( 2, 2, i + 1, projection = Alberts_China)

# 0.控制数据显示范围
ax.set_extent(ExtentPLT, crs = DataCRS)

# 1.绘制底图图层(应用自有高精度数据做底图)
## 1.1 添加行政边界
mpt.AddGeometries(ax, r"Region\VTD_PG_PLCity_China.shp", EdgeColor = 'LightGrey', LineWidth = 0.1)
mpt.AddGeometries(ax, r"Region\VTD_PG_Province_China.shp", EdgeColor = 'Gray', LineWidth = 0.2)
## 1.2 添加河流湖泊
mpt.AddGeometries(ax, r"river\1级河流.shp", EdgeColor = 'RoyalBlue', LineWidth = 0.4)
mpt.AddGeometries(ax, r"river\2级河流.shp", EdgeColor = 'DodgerBlue', LineWidth = 0.3)
mpt.AddGeometries(ax, r"river\3级河流.shp", EdgeColor = 'DeepSkyBlue', LineWidth = 0.2)
mpt.AddGeometries(ax, r"river\4级河流.shp", EdgeColor = 'SkyBlue', LineWidth = 0.15)
mpt.AddGeometries(ax, r"river\5级河流.shp", EdgeColor = 'LightSkyBlue', LineWidth = 0.05)
mpt.AddGeometries(ax, r"river\主要湖泊.shp", EdgeColor = 'none', LineWidth = 0, FaceColor = '#BEE8FF')

# 2.绘制数据图层
## 分块绘制(节约内存)
for Block in Blocks:
# 数据都一样,读取一个文件的数据即可
DrawData = DataSet.ToArray(*Block, BlockSize, BlockSize)
ExtentBlock = [GEOT[ 0] + Block[ 1] * GEOT[ 1], GEOT[ 0] + (DrawData.shape[ 1] + Block[ 1]) * GEOT[ 1],
GEOT[ 3] - (DrawData.shape[ 0] + Block[ 0]) * GEOT[ 1], GEOT[ 3] - Block[ 0] * GEOT[ 1]]
im = ax.imshow(DrawData, transform = DataCRS, cmap = CMap[i], extent = ExtentBlock, zorder = 2,
interpolation = 'none', vmin = 0, vmax = 255)

# 3.为绘制区域增加经纬网
gl = ax.gridlines(draw_labels = True, dms = False, x_inline = False, y_inline = False,
linestyle = ( 0, ( 10, 10)),
linewidth = 0.2,
color = 'Gray',
rotate_labels = False,
xlabel_style = { 'fontsize': 8},
ylabel_style = { 'fontsize': 8})
## 3.1忽略相邻轴的经纬网标签
if i % 2 == 0:
gl.right_labels = False
else:
gl.left_labels = False
if i < 2:
gl.bottom_labels = False
else:
gl.top_labels = False

ax.set_title(Method[i], fontsize = 10, y = 0.92, fontdict = { 'family': 'SimSun'})

# n.其他优化设置
## n.1 添加指北针
mpt.AddCompass(ax, LOC = ( 0.2, 0.85), SCA = 0.04, FontSize = 10)
## n.2 添加比例尺
mpt.AddScaleBar(ax, LOC = ( 0.8, 0.08), SCA = 0.1, FontSize = 6, PROJType = 'PROJCS', UnitPad = 0.25, BarWidth = 0.6)
## n.3 添加图例并修饰
mpt.AddLegend(ax, Colors[i], LegendName = '分类', LengedInterval = 0.4, LabelList = ColorName,
LegendSize = 8, TextInterval = 0.1, LOC = ( 0.05, 0.32), SCA = 0.03, AspectRatio = 1.5,
Columns = 2, ColumnWide = 0.15, RowInterval = 0.015, FontSize = 6, EdgeColor = 'k', EdgeWidth = 0.1)
plt.subplots_adjust(wspace = 0.05, hspace = -0.05)
plt.show()

制图效果对比

文章转自:锐多宝的空间

点击关键词 ↓↓ 品往期精选

进阶手册!学习+考证

测绘师继续教育20学时

最后欢迎来稿

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
西安赛格事件最新!网传当地通知各家专柜,提交2020年-2025年专柜合同及商场每月对账单结款单,开始逐步推进核查工作

西安赛格事件最新!网传当地通知各家专柜,提交2020年-2025年专柜合同及商场每月对账单结款单,开始逐步推进核查工作

火山詩话
2026-07-09 17:07:01
“凌晨在北京逝世、交往8任男友”75岁的刘晓庆私生活谣言太荒唐

“凌晨在北京逝世、交往8任男友”75岁的刘晓庆私生活谣言太荒唐

TVB的四小花
2026-07-09 08:28:18
北大复旦联合调查:00后性活跃度不如80后,中年人才是真危机

北大复旦联合调查:00后性活跃度不如80后,中年人才是真危机

玛丽姬丝
2026-07-09 16:51:03
微信视频通话会有监控吗?网友在对话时使用机械声,马上收到微信警告

微信视频通话会有监控吗?网友在对话时使用机械声,马上收到微信警告

回旋镖
2026-07-09 10:02:20
湖北一家三口被大风卷走身亡,14岁大儿子成唯一幸存者!锋面评论:大风将窗户“连根拔起”,天灾还是人祸?

湖北一家三口被大风卷走身亡,14岁大儿子成唯一幸存者!锋面评论:大风将窗户“连根拔起”,天灾还是人祸?

新民晚报
2026-07-09 15:35:00
韩红的事,已经彻底失控了……

韩红的事,已经彻底失控了……

麦杰逊
2026-07-09 12:54:16
突发!阿根廷足协被FBI调查,涉3亿美元经济大案:趁阿足协主席随球队督战世界杯期间展开取证行动、传唤关键人物

突发!阿根廷足协被FBI调查,涉3亿美元经济大案:趁阿足协主席随球队督战世界杯期间展开取证行动、传唤关键人物

每日经济新闻
2026-07-09 16:00:54
葡媒痛批葡萄牙七宗罪!曝更衣室撕破脸,C罗的眼泪到底骗了谁?

葡媒痛批葡萄牙七宗罪!曝更衣室撕破脸,C罗的眼泪到底骗了谁?

许三岁
2026-07-09 18:35:58
高善文绝笔:一个经济学家用最后一丝理性,写完了自己的病历

高善文绝笔:一个经济学家用最后一丝理性,写完了自己的病历

互联网大观
2026-07-09 15:19:14
陈皮搭一物,堪称“祛湿高手”,痰没了湿气散了,清爽轻快!

陈皮搭一物,堪称“祛湿高手”,痰没了湿气散了,清爽轻快!

江江食研社
2026-07-08 15:30:10
冯小刚这下老实了,坐头等舱脑袋全是斑块,养女徐朵脸肿原因曝光

冯小刚这下老实了,坐头等舱脑袋全是斑块,养女徐朵脸肿原因曝光

阿绐聊社会
2026-07-08 13:03:13
韩红给广西捐款400万,怎么就被骂翻天?

韩红给广西捐款400万,怎么就被骂翻天?

凤眼论
2026-07-09 16:41:40
麻木了!生涯8次被交易!

麻木了!生涯8次被交易!

柚子说球
2026-07-10 01:52:05
长沙占车位女车主身份确认为公职人员,23年刚考试上岸,短短2年就升任副处长

长沙占车位女车主身份确认为公职人员,23年刚考试上岸,短短2年就升任副处长

可达鸭面面观
2026-07-09 17:14:05
世界杯4强精准预测:四大冠军队全进八强,这一队最可能爆冷出局

世界杯4强精准预测:四大冠军队全进八强,这一队最可能爆冷出局

林子说事
2026-07-09 03:18:53
小米正式官宣:7月14日,正式亮相

小米正式官宣:7月14日,正式亮相

科技堡垒
2026-07-09 00:50:39
世界杯8强出炉!最新夺冠概率:法国27.62%居首 阿根廷跌第4

世界杯8强出炉!最新夺冠概率:法国27.62%居首 阿根廷跌第4

新英体育
2026-07-09 11:19:33
这条消息要炸锅,似乎和红十字有关,和韩红有关,事情闹大了…

这条消息要炸锅,似乎和红十字有关,和韩红有关,事情闹大了…

慧翔百科
2026-07-09 17:28:56
国足重大损失!卡塔尔正式归化前中超巨星:冲击2030世界杯

国足重大损失!卡塔尔正式归化前中超巨星:冲击2030世界杯

邱泽云
2026-07-09 20:26:38
一家四口澳门食物中毒靠布洛芬强上飞机回上海,一路喷射……飞机座位全是!

一家四口澳门食物中毒靠布洛芬强上飞机回上海,一路喷射……飞机座位全是!

六子吃凉粉
2026-07-09 12:01:46
2026-07-10 02:04:49
中国测绘网
中国测绘网
中国测绘网 官方网易号
2912文章数 1951关注度
往期回顾 全部

科技要闻

字节杀回来了!深度实测Seedream 5.0 Pro

头条要闻

洪水卷来眼镜蛇广西60岁老人被咬去世 全村仍然在搜蛇

头条要闻

洪水卷来眼镜蛇广西60岁老人被咬去世 全村仍然在搜蛇

体育要闻

王楚谈埃及判罚争议:足球没有绝对公平

娱乐要闻

陈翔发文“苍天饶过谁”登热搜,旧事再引关注

财经要闻

中国房地产十年

汽车要闻

悦己更悦人 阿维塔07L加长了更加上了豪华

态度原创

教育
旅游
本地
健康
公开课

教育要闻

孩子只够专科线?这组数据看完你可能不慌了

旅游要闻

深耕文脉创新业态,这场论坛解码运河文旅消费升级“长红密码”

本地新闻

重庆人有自己的避暑桃花源 | 夏天就去「酉」风的地方!

三高、肥胖人群能吃粘食吗?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版