python下用cartopy绘制地形晕染(shading)图

python可以利用rasterio,cartopy,matplotlib等库绘制地形晕染图。

1.获取高程数据

高程数据可以从GEBCO网站下载:(https://www.gebco.net/data_and_products/gridded_bathymetry_data/)。

选择raster(栅格)格式。下面以南海为例。
具体下载地址如下:https://download.gebco.net/。
这里选择最新的GEBCO2023数据库(这是15秒的全球高程数据),然后选择经纬度范围,Grid的GeoTIFF格式。
选择完后,可以直接下载。

在这里插入图片描述
在这里插入图片描述

2. 高程图

首先显示高程图。
rasterio用于读取tiff格式的地理高程图。
高程图色标为bwr。
在这里插入图片描述

import rasterio
from rasterio.plot import show
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np
from matplotlib.colors import Normalize# 加载地理高程数据
file_path = 'gebco_2023_n25.0_s5.0_w105.0_e125.0.tif'with rasterio.open(file_path) as src:elevation = src.read(1)  # 读取第一个波段transform = src.transform# 获取地理边界
bounds = src.bounds
extent = [bounds.left, bounds.right, bounds.bottom, bounds.top]# 创建图形和子图
fig = plt.figure(figsize=(10, 8))
ax = plt.axes(projection=ccrs.PlateCarree())# 设置地图范围
ax.set_extent(extent, crs=ccrs.PlateCarree())
norm=Normalize(vmin=-6000,vmax=6000)
# 显示地理高程数据
img = ax.imshow(elevation, extent=extent, transform=ccrs.PlateCarree(), cmap='bwr',norm=norm)
cbar = plt.colorbar(img, orientation='vertical', pad=0.05, aspect=50,extend='both')
cbar.set_label('Elevation (meters)', fontsize=12)# 添加海岸线和地理特征
ax.coastlines(resolution='10m',linewidth=0.2)
# ax.add_feature(cartopy.feature.BORDERS, linestyle=':')# 添加经纬网
gl = ax.gridlines(draw_labels=True, linewidth=1, color='gray', alpha=0.5, linestyle='-')
gl.top_labels = False
gl.right_labels = False
gl.xlocator = plt.FixedLocator(np.arange(int(bounds.left), int(bounds.right) + 1, 4))
gl.ylocator = plt.FixedLocator(np.arange(int(bounds.bottom), int(bounds.top) + 1, 5))
gl.xlabel_style = {'size': 12, 'color': 'gray'}
gl.ylabel_style = {'size': 12, 'color': 'gray'}# 显示图形
plt.title('Elevation Map of SCS')outname='SCS_Elev'
plt.title('SCS_Elev')
plt.savefig(outname+'.png', format='png', dpi=600)
# plt.savefig(outname+'.pdf', format='pdf', dpi=600)
plt.show()

3.获取地形梯度图

然后计算地形的水平梯度(lon方向和lat方向)。
以梯度图为底图,使地形图更加立体。然后上覆高程图。
梯度地图色标为gray_r。
对于不同区域,色标范围可能需要调整。南海用[0, 100]比较合适。
在这里插入图片描述

# -*- coding: utf-8 -*-import rasterio
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from matplotlib.colors import Normalize# 读取地理高程数据
file_path = './gebco_2023_n25.0_s5.0_w105.0_e125.0.tif'
with rasterio.open(file_path) as src:elevation = src.read(1)transform = src.transformbounds = src.bounds# 获取地理边界
extent = [bounds.left, bounds.right, bounds.bottom, bounds.top]# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': ccrs.PlateCarree()})# 设置地图范围
# ax.set_extent(extent, crs=ccrs.PlateCarree())# 设置地形梯度增强立体感
grad_x, grad_y = np.gradient(elevation)
gradient_magnitude = np.sqrt(grad_x**2 + grad_y**2)# 绘制地形数据
# norm = Normalize(vmin=-6000, vmax=6000)
shade_img = ax.imshow(gradient_magnitude, extent=extent, transform=ccrs.PlateCarree(), cmap='gray_r', alpha=1, vmin=0, vmax=100)cbar = plt.colorbar(shade_img, ax=ax, orientation='vertical', pad=0.05, aspect=30,extend='both')
cbar.set_label('Slope', fontsize=12)
cbar.ax.tick_params(labelsize=10)# 添加海岸线和地理特征
ax.coastlines(resolution='10m',linewidth=0.2)
# ax.add_feature(cartopy.feature.BORDERS, linestyle=':')# 添加经纬网
gl = ax.gridlines(draw_labels=True, linewidth=1, color='gray', alpha=0.5, linestyle='-')
gl.top_labels = False
gl.right_labels = False
gl.xlocator = plt.FixedLocator(np.arange(int(bounds.left), int(bounds.right) + 1, 4))
gl.ylocator = plt.FixedLocator(np.arange(int(bounds.bottom), int(bounds.top) + 1, 5))
gl.xlabel_style = {'size': 12, 'color': 'black'}
gl.ylabel_style = {'size': 12, 'color': 'black'}# 显示图形
outname='SCS_Elev_slope'
# outname='SCS_Elev_shading'
plt.title(outname)
plt.savefig(outname+'.png', format='png', dpi=600)
# plt.savefig(outname+'.pdf', format='pdf', dpi=600)
plt.show()

4. 叠加高程图和梯度图

以梯度图为底图,使地形图更加立体。然后上覆高程图。
梯度图色标为gray_r,高程图色标为bwr。注意设置色标范围。
在这里插入图片描述

# -*- coding: utf-8 -*-import rasterio
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from matplotlib.colors import Normalize# 读取地理高程数据
file_path = './gebco_2023_n25.0_s5.0_w105.0_e125.0.tif'
with rasterio.open(file_path) as src:elevation = src.read(1)transform = src.transformbounds = src.bounds# 获取地理边界
extent = [bounds.left, bounds.right, bounds.bottom, bounds.top]
# extent = [118,122,20,25]# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': ccrs.PlateCarree()})# 设置地图范围
# ax.set_extent(extent, crs=ccrs.PlateCarree())# 设置地形梯度增强立体感
grad_x, grad_y = np.gradient(elevation)
gradient_magnitude = np.sqrt(grad_x**2 + grad_y**2)# 绘制地形数据
norm = Normalize(vmin=-6000, vmax=6000)
shade_img = ax.imshow(gradient_magnitude, extent=extent, transform=ccrs.PlateCarree(), cmap='gray_r', alpha=1, vmin=0, vmax=100)terrain_img = ax.imshow(elevation, extent=extent, transform=ccrs.PlateCarree(), cmap='bwr', norm=norm, alpha=0.8)# 添加颜色条并设置范围
cbar = plt.colorbar(terrain_img, ax=ax, orientation='vertical', pad=0.05, aspect=30,extend='both')
cbar.set_label('Elevation (meters)', fontsize=12)
cbar.ax.tick_params(labelsize=10)# 添加海岸线和地理特征
ax.coastlines(resolution='10m',linewidth=0.2)
# ax.add_feature(cartopy.feature.BORDERS, linestyle=':')# 添加经纬网
gl = ax.gridlines(draw_labels=True, linewidth=1, color='gray', alpha=0.5, linestyle='-')
gl.top_labels = False
gl.right_labels = False
gl.xlocator = plt.FixedLocator(np.arange(int(bounds.left), int(bounds.right) + 1, 4))
gl.ylocator = plt.FixedLocator(np.arange(int(bounds.bottom), int(bounds.top) + 1, 5))
gl.xlabel_style = {'size': 12, 'color': 'black'}
gl.ylabel_style = {'size': 12, 'color': 'black'}# 显示图形
outname='SCS_Elev_shading'
plt.title(outname)
plt.savefig(outname+'.png', format='png', dpi=600)
# plt.savefig(outname+'.pdf', format='pdf', dpi=600)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈一些AIGC赚钱赛道

前段时间,做过一期关于AIGC的分享。 ​缘起于近两年看到 DELL E 到 Stable Diffusion 多模态文本可控图像生成的大火,让AIGC概念涨了一大波流量。百度等一些头部大厂,以及关注元宇宙、web3.0领域的很多媒体和公司,都蹭上了这波热…

el-table动态配置显示表头

在实际工作中,会遇到动态配置e-table表头的情况,如下方法可以实现: // 要展示的列 column: [{prop: name, name: 名称 }, {prop: age, name: 年龄 }, {prop: sex, name: 性别 }, {prop: address, name: 地址 }, {prop: city, name: 城市 }]…

生活旅游数据恢复:全国违章查询

【步骤一:备份数据】 在开始数据恢复之前,首先要做的是备份现有的数据。虽然这一步不直接涉及到数据恢复,但万一在恢复过程中出现问题,您还可以回滚到备份,以避免数据丢失。 打开全国违章查询app。在主界面上找到并点…

量化投资分析平台 迅投 QMT(二)

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用如何获取数据上代码历史帖子 迅投 QMT 我目前在使用 两个月前(2024年4月)迅投和CQF有一个互动的活动,进行了平台的一个网上路演,刚…

数据隐私重塑:Web3时代的隐私保护创新

随着数字化时代的不断深入,数据隐私保护已经成为了人们越来越关注的焦点之一。而在这个数字化时代的新篇章中,Web3技术作为下一代互联网的代表,正在为数据隐私保护带来全新的创新和可能性。本文将深入探讨数据隐私的重要性,Web3时…

WSDM 2023 推荐系统相关论文整理(二)

WSDM 2023的论文录用结果已出,推荐系统相关的论文方向包含序列推荐,点击率估计等领域,涵盖图学习,对比学习,因果推断,知识蒸馏等技术,累计包含近四十篇论文,下文列举了部分论文的标题…

STM32H750外设ADC之外部触发和注入管理

目录 概述 1 外部触发转换和触发极性 1.1 外部触发条件 1.2 忽略硬件触发条件 1.3 触发框图 1.4 常规通道的外部触发 1.5 注入通道的外部触发 2 注入通道管理 2.1 触发注入模式 2.2 自动注入模式 2.3 注入转换延迟 概述 本文主要介绍STM32H750外设ADC之外部触发和注…

Win10 TiKV单机单节点Docker部署测试

1. 环境 环境:Windows10、WSL2、Ubuntu20.04、Docker Desktop目标:单节点单机部署,测试用 2. 前置操作 docker pull pingcap/tikv:latest docker pull pingcap/pd:latestmkdir -p /mnt/tikv/pd mkdir -p /mnt/tikv/tikvip a 命令查看虚拟…

PROFINET转CANOPEN(WL-ABC3033)连接台达伺服驱动器ASDA-B3

在工业自动化领域这片广阔天地中,通信协议的转换犹如一道横亘在工程师们面前的难题。特别是在将众多采用不同通信协议的设备汇聚一堂,共同协作完成任务的场景中,如何确保数据如丝般顺滑地穿梭于各个节点之间,确保每台设备都能心领…

智慧社区信息化建设整体解决方案(PPT原件获取及软件各类建设方案)

智慧社区信息化系统建设要点可以归纳为以下几个方面: 一、社区基础设施建设 网络设施:建设高速网、城域网、校内网等网络,以满足社区信息传输和管理所需。信息终端设备:建设各种类型的智能终端设备,包括智能手机、智能…

【GD32F303红枫派使用手册】第八节 TIMER-RGB彩灯实验

8.1 实验内容 通过本实验主要学习以下内容: RGB彩灯控制原理 TIMER PWM输出原理 8.2 实验原理 本例程中使用的RGB彩灯采用共阳极驱动方式,使用三路PWM进行驱动,对应引脚输出低电平的时候对应RGB灯珠点亮,调节不同路的PWM占空…

FPGA新起点V1开发板(八-语法篇)——状态机

文章目录 一、两个状态机模型二、状态机设计(四段论)2.1 状态空间定义2.2 状态跳转(时序逻辑)2.3 下个状态判断(组合逻辑)2.4 各个状态下的动作2.5 三段式 一、两个状态机模型 二、状态机设计(四…

用户投诉对旅行社复购率有什么影响?该如何分析投诉数据?

随着在线旅游市场的不断扩大,旅游平台的用户基数和交易量持续增长,用户投诉作为服务质量的反馈机制,其重要性日益凸显。用户投诉不仅反映了旅游服务中存在的问题,也是推动平台中的旅行社改进服务、提升用户体验的重要动力。然而&a…

接口自动化-预期值和实际值怎么写?

测试类当中 怎么做接口自动化,返回值校验,就是需要返回值的预期值和实际值进行对比 实际值如下 怎么拿到预期值$.msg?用正则表达式-提取值 建新的类-来编写用正则表达式拿到预期值 源码pattern 使用的compile的方法,传入的是字符串正则表…

短剧cps系统搭建开发,热门短剧推广分销系统。短剧分销是怎么操作的?

目录 前言: 二、短剧是怎么推广分销的? 二、 短剧分销系统有什么功能? 三、怎么搭建? 总结: 前言: 短剧分销项目目前的现状是多元化且充满活力的。随着短剧市场的快速发展和观众接受度的提高&#xff0…

大功率LED照明芯片OC6781输入5V~36V,PWM升压型LED恒流驱动器

概述 OC6781是一款高效率、高精度的升压型LED恒流驱动控制芯片。OC6781内置高精度误差放大器,振荡器,恒流驱动电路等,特别适合大功率、多个高亮度LED灯串恒流驱动。OC6781采用固定频率的PWM控制方式,工作频率可通过外部电阻进行设…

MySQL的组成与三种log

MySQL由几块组成 连接器分析器优化器执行器 MySQL的三大log blog 作用&#xff1a; 用于主从同步与数据恢复 记录内容&#xff1a; 已经完成的 DML(数据操作语句)&#xff0c;主要是用于数据备份 redolog<重试日志> 作用&#xff1a; 崩溃恢复&#xff0c;用于事…

跟着AI学AI_02, 时域频域和MFCC

AI&#xff1a;ChatGPT4o 时域和频域是信号处理中的两个基本概念&#xff0c;用于描述信号的不同特性。 时域 时域&#xff08;Time Domain&#xff09; 是对信号随时间变化的描述。在时域中&#xff0c;信号是作为时间的函数来表示的。 时域表示&#xff1a;例如&#xff0…

双指针解题

验证回文数&#xff08;验证回文数-CSDN博客&#xff09;和判断在子序列&#xff08;判断子序列-CSDN博客&#xff09;已经在之前进行了计算&#xff0c;今天有三个新的双指针问题&#xff1a; 两数之和II—输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0…

堆的认识和堆的操作

一.堆的认识: ① 也就是说它取出的顺序是需要搜索的,查找特定性质。 ② 数组:总是插入尾部(1),查找(n)移动元素删除特性(n) 链表:头插或尾插(1),查找(n)删特性(1) 所以为什么要调整顺序?就是为了查找特性方便。 有序数组:找到合适位置(n)移动元素插入(n),删除最…