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.rhkb.cn/news/340356.html

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

相关文章

如何在自己的电脑上添加静态路由

1.任务栏搜索powershell 选择以管理员身份运行 2.输入 route add -p (永久) 目的网络地址例如192.168.10.0 mask 255.255.255.0(子网掩码)192.168.20.1(下一跳地址)。回车即可生效

性能测试学习-基本使用-元件组件介绍(二)

jmeter优点是:开源免费,小巧,丰富的学习资料和扩展组件 缺点是:1.不支持IP欺骗,分析和报表能力相对于LR欠缺精确度(以分钟为单位) 工具用户量分析报表IP欺骗费用体积扩展性Loadrunner多(万)精…

day4 数1 隐函数

基础知识 隐函数 :一个方程里边 使x有1个y与之对应 函数的有界性 f(X) 的值大于-M并小于M 单调性 可以用定义发判断单调性 定义法 奇函数 奇函数关于原点对称,偶关于x对称 定义域要关于原点对称 任何一个函数可以写成奇函数偶函数的形式 复合函数的…

【MySQL】MySQL 图形化界面 - 使用说明(MySQL Workbench)

一、安装软件 Navicat,SQLyog 这些软件都不错,不过都需要收费,当然也有破解版。下面用 MySQL Workbench,它是官方提供的工具。 二、使用操作 这个软件本质是一个客户端,现在要让数据库能够远程登录。不过一般不会远程…

SPME2024开幕在即,深兰科技商用清洁机器人新品推介会蓄势待发

6月5日~7日,以“跨界融合洞见未来”为主题的“2024 SPME第六届上海国际物业管理产业博览会”(以下简称“物博会”)将在上海世博展览馆举行。应主办方邀请,深兰科技携多款AI清洁机器人亮相本届展会,向来自全球各地的观展企业家、经…

C++第二十三弹---深入理解STL中list的使用

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、list的介绍 2、list的使用 2.1、构造函数 2.2、赋值操作符重载 2.3、迭代器使用 2.4、容量操作 2.5、元素访问 2.6、修改操作 2.7、其…

Docker 环境下 3D Guassian Splatting 的编译和配置

Title: Docker 环境下 3D Guassian Splatting 的编译和配置 文章目录 前言I. 宿主系统上的安装配置1. 安装 nvidia driver2. 安装 docker3. 安装 nvidia-container-toolkit II. Docker 容器安装配置1. 拉取 ubuntu 22.042. 创建容器3. 进入容器4. 容器中安装 cuda SDK5. 容器中…

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景: 在提供了数据查看和修改的表格视图中(如table、a-table等…),允许用户自行选择多行数据,依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时,页面会即时反…

FASTGPT:可视化开发、运营和使用的AI原生应用

近年来,随着人工智能(AI)技术的迅猛发展,AI的应用逐渐渗透到各行各业。作为一种全新的开发模式,AI原生应用正逐步成为行业的焦点。在这方面,FASTGPT无疑是一款颇具代表性的产品。本文将详细介绍FASTGPT的设…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置,实现 vscode 中的代码的自动跳转。完成头文件路径配置后,可以避免代码头部导入头文件部分出现波浪线,警告说无法正确找到头文件。 步骤 需要在 vscode 中…

k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…

顺序表的讲解与实现

顺序表的讲解与实现 一、顺序表的概念及结构二、顺序表分类(C语言实现)顺序表和数组的区别顺序表分类静态顺序表动态顺序表 三、动态顺序表的实现(使用VS2022)1.初始化、销毁、打印内容2.检查扩容3.尾部插入、尾部删除、头部插入、头部删除尾部插入尾部删除头部插入头部删除 4.…

【AIoT-Robot】3d hand pose

手语是聋哑人士的主要沟通工具,它是利用手部和身体的动作来传达意义。虽然手语帮助它的使用者之间互相沟通,但聋哑人士与一般人的沟通却十分困难,这个沟通障碍是源于大部分人不懂得手语。 1. 手势&&手语 手势:手的姿势 ,通常称作手势。它指的是人在运用手臂时,所…

Monaco Editor系列(六)Range详解、Uri 自动匹配语言模型、缩略图 miniMap 配置

前情回顾: 一鼓作气,再鼓,再鼓!!哈哈哈。争取早日占领 Monaco 领地。 上一篇文章讲到的三个功能分别是 Position 类型、设置 markers、指定位置插入或替换内容 涉及到的知识点: ⛈️ 获取光标位置&#x…

有哪些好用的ai工具,可以提升科研、学习、办公等效率?

最近,Sora的诞生为AI再添了一把火。 据介绍,这款“文生视频”的Sora可以直接输出长达60秒的视频,并且包含高度细致的背景、复杂的多角度镜头,以及富有情感的多个角色。 不仅能准确呈现细节,还能理解物体在物理世界中…

threadX 消息队列

1、 使用消息列的目的 在ThreadX操作系统下使用消息队列的目的主要有以下几点: 提高CPU利用率: 消息队列是RTOS(实时操作系统)中常用的一种数据通信方式,常用于任务与任务之间或是中断与任务之间的数据传递。相比裸机…

Centos 报错 One of the configured repositories failed

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用yum update更新命令就出现下面问题,系统是刚安装的,然后修改了一下IP变成手动。(排查问题前,先回顾自己做了哪些操作,方便进一步排错&a…

PX4 ROS2 真机

如果仿真跑通了。 真机遇到问题,可参考此文章。 ubuntu22 px4 1.14.3 ros2 humble 硬件接线。 先找两个usb - ttl串口,分别接到两台主机上,保证串口通信正常。 图中是个六合一的。浪费一天时间,发现是串口设置错误&#xff…

小红书前端2轮面试期望22K,全程问低代码设计

一面(通过) 1、好,那我们开始把,先简单介绍一下自己的一个经历,以及自己有亮点的项目?balabala 2、你可以这样介绍:在这里边主要负责哪几个项目,哪些项目是比较有亮点的&#xff0…

如何让Google收录网站?

Google收录网站的前提条件是确保网站可以公开访问,并且页面加载速度需要快,这样Google爬虫才可以访问到你的网站,并且索引你网站中的内容。实现了上面的前提条件,可以通过优化数据结构、创建站点地图、使用Google Search Console、…