前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于 Python 的地理空间绘图指南

基于 Python 的地理空间绘图指南

作者头像
自学气象人
发布于 2023-06-20 09:17:53
发布于 2023-06-20 09:17:53
54000
代码可运行
举报
文章被收录于专栏:自学气象人自学气象人
运行总次数: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级河流和湖泊为主。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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绘制栅格

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 读取色彩映射表信息(若不包含,可自行定义色带)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 定义数据分块——用于数据分块绘制(节约内存)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 配置制图范围

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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绘制数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

制图效果对比

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么!?现在连这个地理学术可视化工具还不知道?!速度学!!
最近很多小伙伴私信小编关于地理空间可视化相关数据可视化的绘制。怎么说呢?小编本身对地理空间可视化了解的还蛮多的。但是,要让大家实现对地理相关的数据进行处理、可视化等操作还是蛮难的~~ 所以小编今天就推荐一个超赞的绘图工具-「gma」 绝对的地理相关同学的福音!,下面小编就简单介绍一下,内容如下:
DataCharm
2022/10/25
1.6K0
什么!?现在连这个地理学术可视化工具还不知道?!速度学!!
(数据科学学习手札83)基于geopandas的空间数据分析——geoplot篇(下)
在上一篇文章中我们详细学习了geoplot中较为基础的三种绘图API:pointplot()、polyplot()以及webmap(),而本文将会承接上文的内容,对geoplot中较为实用的几种高级绘图API进行介绍。
Feffery
2020/05/21
1.9K0
(数据科学学习手札83)基于geopandas的空间数据分析——geoplot篇(下)
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
  通过前面的文章,我们已经对geopandas中的数据结构、坐标参考系以及文件IO有了较为深入的学习,在拿到一份矢量数据开始分析时,对其进行可视化无疑是探索了解数据阶段重要的步骤。
Feffery
2020/03/04
3.7K0
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
Python空间绘图绘图——Cartopy 进阶
在前面一节中,我们已经介绍了cartopy的大致用法——全球地图的绘制、范围的设定以及更改地理信息的精度。但是,有时候这并不能满足我们的需求,比如我作为某地级市的预报员,绘制该市降水图时,为使图片整洁,一般不希望多出其他市县。还有进行地区级别的研究,比如青藏高原地理区划将包含尼泊尔与不丹,cartopy的基础地理信息添加暂时无法做到,但是该库包已经准备了额外的接口以满足这种需求,并且比NCL更加灵活。
DataCharm
2021/02/22
3.7K0
Python空间绘图绘图——Cartopy 进阶
利用python绘制EC数据全国降水图
Python的绘图功能非常强大,在大气和海洋常常用来绘制一些有关地理方面的图。本片主要介绍python绘制EC数据(grib格式)的的全国降水分布图。
郭好奇同学
2021/11/10
6.3K9
利用python绘制EC数据全国降水图
Python 空间绘图 - 等值线绘制
等值线是气象上比较常用的一种图形,特别是分析天气形势时,常用的地面气压、位势高度、气温等以等值线展示效果最好;在某些时候,我们还需要对等值线填色图进行进一步的美化。兹分别介绍之。
DataCharm
2021/02/22
6.1K2
Python 空间绘图 - 等值线绘制
Python气象绘图教程(十三)—Cartopy_4
本节提要:关于子图的一些问题、使用path添加示意框线、Cartopy台风实例本土化
气象学家
2020/06/17
9.8K2
Python气象绘图教程(十三)—Cartopy_4
Python可视化 | WRF模式模拟数据后处理(二)
导入模块 import numpy as np from netCDF4 import Dataset import matplotlib.pyplot as plt from matplotlib.cm import get_cmap from matplotlib.colors import from_levels_and_colors import cartopy.crs as crs import cartopy.feature as cfeature from cartopy.feature i
郭好奇同学
2021/08/26
4K0
Python可视化 | WRF模式模拟数据后处理(二)
气象编程 | Python基础地图构建
---- Python-basemap-中国南海小地图:‍ import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap import cmaps import shapefile from matplotlib.path import Path from matplotlib.patches import PathPatch import os import maskout2 f
气象学家
2020/12/18
2.2K0
气象编程 | Python基础地图构建
地图1-图例式地图
  图例式地图往往是论文中的第一张图片,用来展示研究区域的某种特征。一般有讲述研究地区的地貌图、展示数据站点分布的站点图、展示某些特定图注信息的地图,或者这些地图的叠加形式。而这些图片往往在文章的前部,画好这种介绍性图片,可以起到首先抓住眼球的作用。   接下来的几个章节,我们来介绍几种地理科学上常用的地图的绘制方法。希望帮助到大家。
用户11172986
2025/03/06
1280
地图1-图例式地图
Python可视化 | WRF模式模拟数据后处理(一)
动画在公众号中不太好放,感兴趣的大家可以去和鲸社区上手玩儿一下。代码获取在好奇心Log公众号后台回复wrf绘图
郭好奇同学
2021/08/26
6.7K2
Python可视化 | WRF模式模拟数据后处理(一)
捍卫祖国领土从每一张地图开始
地图是表达国家版图最常用、最主要的形式。但在影视剧《亲爱的,热爱的》中出现了明显的错误,从上至下引起了极大的关注度。
MeteoAI
2019/08/09
6.1K2
捍卫祖国领土从每一张地图开始
python绘图 | salem一招解决所有可视化中的掩膜(Mask)问题
对于空间数据,我们感兴趣的往往是其中的某一部分,对于不需要的部分需要做一些掩膜(Mask)。 比如只关注海洋的数值变化,那么陆地上的数值对我其实是一种干扰,就要想办法掩盖掉。又比如我有全国的数据变量,但是只想研究其中某几个省份,那也需要对非相关省份进行掩盖。
气象学家
2020/09/22
12.5K57
python绘图 | salem一招解决所有可视化中的掩膜(Mask)问题
用Python绘制《天气学原理和方法》插图
最近天气学原理需要绘制课本插图来做 翻转课堂,因此整理了课本第四章几个典型图片的画法和代码,共需要的人使用。
气象学家
2022/01/18
1.8K0
用Python绘制《天气学原理和方法》插图
Python气象绘图教程特刊(二)等值线
在气象研究领域,限制于世界的地貌和人文地理,大部分的气象原始资料是站点分布的。气象站的分布的特点是北多南少(有闲钱建设气象站的国家基本在北半球,陆地基本集中于北半球,世界人口集中于北半球),陆多海少(陆地易于永久和半永久观测站建设,海上的漂浮测站和轮船的观测不稳定)。中国的气象站密度基本与人口密度的漠河-腾冲县线吻合,表现在东多西少,中间多南北少(河北县级气象局的密度比长江以南任何一个省都高,中原地区又高于其他地区,这些牵扯到历史自然地理和人文地理)。
气象学家
2020/06/17
7.8K0
python可视化 | 地理桑基图的绘制方法
我回答目前常用的库包不能直接绘制这样的桑基图,我错了,应该回答是目前常用的库包不能绘制这样漂亮些的桑基图。
郭好奇同学
2021/05/28
1.8K0
python可视化 | 地理桑基图的绘制方法
气象绘图——3D图形迁移
在前面推送中我们提到了通过collection功能而在3D地图中添加地图的方法,也短暂提到了栅格与填色两种图形样式的降维方法。但是从matplotlib这两个函数的底层有一定的局限性,比如下面这两张图的侧面填色就无法绘出:
自学气象人
2023/06/21
4280
气象绘图——3D图形迁移
读者答疑 | python怎么计算流函数
由于可视化代码过长隐藏,可点击运行Fork查看 若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可
用户11172986
2024/08/29
3000
读者答疑 | python怎么计算流函数
Python空间绘图-Colorbar详解
在我们绘制有色阶的图片时,多会用到colorbar这个关联利器,色条可以直接将数值与颜色连接在一起。常用的scatter、contourf是非常适合使用的。第一节我们来简要谈谈常用的colorbar参数,以后例子都基于contourf命令。
DataCharm
2021/02/22
21K0
Python空间绘图-Colorbar详解
气象绘图cmap、cbar超详细版(附示例)
在matplotlib和cartopy中,其常见的绘图命令,若是带有颜色映射的collection(s)类,则基本都可以引入cmap与colorbar功能来分析数据。cmap即是颜色映射表,colorbar即是颜色分析色条,前者只起到对绘图对象上色的功能,后者实现色阶与数值的对应。
自学气象人
2022/11/02
18.7K0
气象绘图cmap、cbar超详细版(附示例)
相关推荐
什么!?现在连这个地理学术可视化工具还不知道?!速度学!!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验