【WRF数据准备】地形-SRTM的3s高分辨率地形数据集

news2024/10/24 17:11:07

【WRF数据准备】地形-SRTM的3s高分辨率地形数据集

  • 数据概述
    • 数据下载
  • 数据处理
    • 合并多个SRTM 数据-GDAL库
    • 转为geogrid二进制格式
    • WPS 中的设置
  • 数据对比
  • 海洋区域缺省值
  • 参考

WRF中地形数据(海拔高度)分辨率最高为30s,差不多就是900 m,当模型空间分辨率较高时,比如在低于1 km的情况下,经常会考虑增加地形高度的分辨率。

数据概述

SRTM(Shuttle Radar Topography Mission),是由美国 NASA 主导的全球遥感探测计划,全球的采样间隔为3弧秒(约90m),美国本土的采样间隔为1弧秒(约30m),覆盖全球80%的范围。数据的具体介绍与下载可参考-SRTM 90m DEM Digital Elevation Database。
在这里插入图片描述
SRTM 的数据为 Geotiff 或 Esri ASCII 格式,瓦片形式(5°×5°或30°×30°),而 geogrid 所需的静态数据也为瓦片形式存放,不过使用的是二进制格式,因此需要将 Geotiff 转为 geogrid 的二进制格式。

数据下载

下载SRMT 30m地形数据,下载地址:SRTM Data
在这里插入图片描述

替代地址:SRTM Tile Grabber
在这里插入图片描述
选取中国地区瓦片数据,进行下载:
在这里插入图片描述
选中需要下载的瓦片,点击【Search】,会出现以下界面:
在这里插入图片描述
可采用插件(Downthemall)批量下载所有瓦片数据,如下:
在这里插入图片描述
注意: 由于 geogrid 的二进制数据维度(x或y轴)最大为99999,而分辨率太高所以一次制作的区域不能太大

本次研究合并的瓦片数据如下:共9个瓦片数据
在这里插入图片描述

数据处理

打开下载的压缩包,其中有readme.txt和后缀为 .hdr、.tfw、.tif的4个文件,根据readme.txt说明,这里下载的是4.1版本,.hdr,.tfw存储了投影信息。
在这里插入图片描述

合并多个SRTM 数据-GDAL库

由于下载的 SRTM 数据为多个分散瓦片,因此需要将它们合成一个文件,使用 GDAL 库完成合并(如果只下载一个瓦片数据则不需要合并,可跳过此步骤)。GDAL(Geospatial Data Abstraction Library) 是一个在 X/MIT 许可协议下的开源栅格空间数据转换库。

(1)GDAL 的安装和使用说明

# conda安装gdal,时间较久
conda install -c conda-forge gdal -y 
# gdal_merge.py是gdal自带的命令(不是自己写的脚本)
# gdal_merge.py: https://gdal.org/programs/gdal_merge.html
gdal_merge.py [-o out_filename] [-of out_format] [-co NAME=VALUE]*
              [-ps pixelsize_x pixelsize_y] [-tap] [-separate] [-q] [-v] [-pct]
              [-ul_lr ulx uly lrx lry] [-init "value [value...]"]
              [-n nodata_value] [-a_nodata output_nodata_value]
              [-ot datatype] [-createonly] input_files

详细安装步骤可参见另一博客-【Python库安装】Python环境安装GDAL库。

(2)GDAL 合并数据

在win10上合并.tif文件,键入命令(在cmd窗口下运行)如下:

#将下载的srtm合并成一个
# srtm/srtm_china/*tif 下载的srtm的路径
# -o 输出文件,得到srtm_china.tif
# -a_nodata 缺省值,srtm缺省值为-32678
python D:\Anaconda\Scripts\gdal_merge.py -o srtm_GBA.tif -a_nodata -32768 --optfile D:\SRTM_DEM\tif_list.txt

conda activate myenv
python D:\Anaconda\envs\myenv\Scripts\gdal_merge.py -o srtm_GBA.tif -a_nodata -32768 --optfile D:\SRTM_DEM\tif_list.txt

gdal_merge.py文件路径在执行环境键入gdal_merge.py以后就会自动出现了,照着复制一下就好。

最后的参数–optfile D:\SRTM_DEM\tif_list.txt是指定输入的合并.tif文件,tif_list.txt内容如下:

D:\SRTM_DEM\srtm_58_07\srtm_58_07.tif
D:\SRTM_DEM\srtm_58_08\srtm_58_08.tif
D:\SRTM_DEM\srtm_58_09\srtm_58_09.tif
D:\SRTM_DEM\srtm_59_07\srtm_59_07.tif
D:\SRTM_DEM\srtm_59_08\srtm_59_08.tif
D:\SRTM_DEM\srtm_59_09\srtm_59_09.tif
D:\SRTM_DEM\srtm_60_07\srtm_60_07.tif
D:\SRTM_DEM\srtm_60_08\srtm_60_08.tif
D:\SRTM_DEM\srtm_60_09\srtm_60_09.tif

执行成功屏幕会出现以下信息:
在这里插入图片描述
并在当前目录下生成了srtm_GBA.tif。

说明: 由于需要GDAL库的安装,我是在Anaconda环境下运行的,还需要下载numpy库,在尝试多个版本后,修改为1.24.0版本(适配Python3.8-3.11版本)后运行成功
在这里插入图片描述

转为geogrid二进制格式

(1)安装依赖库 GeoTIFF and LibTIFF

sudo apt-get install libgeotiff-dev

(2)安装 convert_geotiff
convert_geotiff安装步骤可参见另一博客-【WRF工具】服务器上安装convert_geotiff。

(3)将 Geotiff 格式转成 geogrid 所需的二进制格式
新建一个 topo_3s 文件夹,使用 convert_geotiff 进行格式转换。

WPS 中的设置

(1)修改 GEOGRID.TBL.ARW
在 GEOGRID.TBL.ARW 文件中找到 name = HGT_M 部分,加入以下语句:

# GEOGRID.TBL.ARW
interp_option = gtopo_3s:average_gcell(4.0)+four_pt+average_4pt
rel_path      = gtopo_3s:topo_3s

(2)namelist.wps中的设置
geog_fata_res 设置中,对应的 domain 的列加入 gtopo_3s。

# namelist.wps
geog_data_res = 'default','default','gtopo_3s+default'

数据对比

下图可以看到,相比于使用30弧秒的数据(左图),使用3弧秒(右图)的数据对模拟区域的地形刻画更加细致。

海洋区域缺省值

SRTM 数据在海洋区域,取缺省值(-32768),按照以上步骤操作,最终生成的 geo_em.d0x 文件中,海洋区域的地形高度值为32768,说明这个错误出现和缺省值有关。

解决方案如下:因为 geogrid 的地形数据为距海平面高度的值,海面上应该为0。在使用 convert_geotiff 之前,先将 tif 数据中的缺省值改为0,也就是将海洋部分的值修改为0,然后在运行 convert_geotiff 时将缺省值 -m 设置为0(虽然缺省值默认为0,但是运行命令 -m 0 也不能省略,原因未知,不过不设置亲测会发生错误)。

如果不涉及海洋区域,可以忽略此问题,以下为更改缺省值为0的脚本:


from osgeo import gdal
import numpy as np

def read_tiff(inpath):
  ds=gdal.Open(inpath, gdal.GA_ReadOnly)
  row=ds.RasterXSize
  col=ds.RasterYSize
  band=ds.RasterCount
  geoTransform = ds.GetGeoTransform()
  proj = ds.GetProjection()
  data=np.zeros([row,col,band])
  for i in range(band):
   dt=ds.GetRasterBand(1)
   data[:,:,i]=dt.ReadAsArray(0,0,col,row)
  return data[:,:,0], geoTransform, proj
  
def array2raster(outpath,array,geoTransform,proj):
 cols=array.shape[1]
 rows=array.shape[0]
 driver=gdal.GetDriverByName('Gtiff')
 #outRaster=driver.Create(outpath,cols,rows,1,gdal.GDT_Byte) # 0-255
 outRaster=driver.Create(outpath,cols,rows,1, gdal.GDT_Float32)
 outRaster.SetGeoTransform(geoTransform)#参数2,6为水平垂直分辨率,参数3,5表示图片是指北的
 outband=outRaster.GetRasterBand(1)
 outband.WriteArray(array)
 outRaster.SetProjection(proj)#将几何对象的数据导出为wkt格式
 outRaster.FlushCache()
 
if __name__=="__main__":
    data, geoTransform, proj = read_tiff('srtm_china.tif')
    data[data==np.min(data)] = 0.0
    array2raster("srtm_china2.tif",data,geoTransform, proj)

参考

1、知乎-WRF中如何使用SRTM的3s高分辨率地形数据集
2、WRF中使用SRTM高分辨率的地形资料

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

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

相关文章

CST光子晶体微谐振腔分析和Q值提取

本期介绍基于文献[1]的一种二维光子晶体波导结构,利用路径上加微谐振腔来实现一些特殊的滤波功能。一般是要看谐振频率的变化和Q值变化,因为工艺误差或任何造成结构不规则的因素对这样细小的结构谐振来说影响非常大。下图为文献中提到的硅薄膜结构&#…

使用Jenkins持续集成的一些经验总结!

01、Performance插件兼容性问题 自由风格项目中,有使用 Performance 插件收集构建产物,但是截至到目前最新版本(Jenkins v2.298,Performance:v3.19),此插件和Jenkins都存在有兼容性问题&#x…

业余时间试一试利用AI 人工智能赚钱

内容创作与写作: 撰写文章:许多网站、博客和企业都需要大量的优质内容。利用 AI 工具如 ChatGPT 等,获取文章的思路、框架甚至初稿,然后根据自己的知识和经验进行修改、润色和完善。你可以在一些自由撰稿人平台、内容创作平台上承…

autumn是 “秋天”,year是 “年”,那autumn years是什么意思?柯桥商务剑桥英语学习外贸口语

autumn是“秋天”,year是“年”, 那你知道 autumn years 是什么意思? autumn years是什么意思? autumn years 直译为“秋天的15857575376*年”,但这样的理解并不准确,《剑桥辞典》中对这个词组的英文解释…

如何评估检索增强型生成(RAG)应用

RAG,也就是检索增强型生成,是现在大型语言模型(LLMs)时代里的一个超火的AI框架,比如你知道的ChatGPT。它通过把外面的知识整合进来,让这些模型变得更聪明,能给出更准确、更及时的回答。详见前篇…

[WiFi] Wi-Fi HaLow: IEEE 802.11ah 无线网络协议介绍

参考链接 802.11ah(HaLow)协议解析1:协议简介 - 知乎 802.11ah(HaLow)协议解析3:物理层改进 - 知乎 Wi-Fi HaLow: IEEE 802.11ah Wireless Networking Protocol - IoTEDU Wi-Fi CERTIFIED HaLow | Wi-F…

实现iOS Framework生成全流程详解

引言 在iOS开发中,Framework是实现代码复用和模块化开发的有效手段。它不仅可以将复杂的功能封装为独立的组件,还能提升代码的可维护性和可扩展性。Framework的广泛应用使得我们可以轻松地集成第三方库,或将自己的功能打包分发给团队成员使用…

CF351E Jeff and Permutation 题解

#1024程序员节|征文# 人生中的第一道紫题。。。 ​​​​​​题目传送门 解题思路 首先我们可以得到读入时 的正负不影响答案,因为我们可以进行一次操作将它们变成它们的相反数,从而使其变成原数,因此,我们可以将…

项目篇--Maven+Idea+ PrimeFaces+Jsf--项目搭建

文章目录 前言一、PrimeFaces 和 Jsf:1.1 JSF 基础:1.2 PrimeFaces 扩展: 二、项目搭建:2.1 Maven 项目的创建:2 xml 配置:2.1 pom.xml 配置2.2web.xml 配置: 2.3 代码:2.3.1 页面&a…

(六)STM32F407 cubemx MPU6050通讯硬件寄存器配置部分(2)

这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列MPU6050通讯硬件寄…

Redis学习笔记(六)--Redis底层数据结构之集合的实现原理

文章目录 一、两种实现的选择二、ziplist1、head2、entries3、end 三、listPack1、head2、entries3、end 四、skipList1、skipList原理2、存在的问题3、算法优化 五、quickList1、检索操作2、插入操作3、删除操作 六、key与value中元素的数量 本文参考: Redis学习汇…

从天边的北斗到身边的北斗 —— 探索北斗导航系统的非凡之旅

引言:穿越时空的导航奇迹 在浩瀚的夜空之中,北斗七星以其独特的排列,自古以来便是指引方向的天文坐标。而今,这份古老的智慧与现代科技完美融合,化作了覆盖全球的卫星导航系统——中国北斗。从遥远的星河到触手可及的…

不考虑光影、背景、装饰,你的可视化大屏摆脱不了平淡。

如果在可视化大屏的设计中不考虑光影、背景和装饰,确实难以摆脱平淡。光影效果可以为大屏增添立体感和层次感,吸引观众的注意力。 合适的背景能营造出特定的氛围,使数据展示更具情境感。而装饰元素则可以起到点缀和美化的作用,提…

【无标题】unity, 在编辑界面中隐藏公开变量和现实私有变量

1.unity, 在编辑界面中隐藏公开变量 [HideInInspector]public int Num; 2.[SerializeField]反序列化显示私有变量 SerializeField是Unity引擎中的一个特性,用于使私有变量在Inspector中可见并可编辑 [SerializeField] private int time; 实例效果如下图示&…

Xshell删除键不好使:删除显示退格^H

1、问题: Xshell不能删除,删除时出现 退格^H 2、解决方案: 点击上方:文件→属性→终端→键盘,把 delete 和 backspace 序列改为 ASCII 127即可。如下所示: 3、重启Xshell,即可以删除了。

UE5 射线折射

这个判断是否有标签是需要带有此标签的Actor来反射

基础知识 main函数形参 C语言

main函数完整的函数头:int main(int argc,char *argv[]) 或 int main(int argc,char **argv)arg-----argument参数c -----count个数v -----value值、内容 假设命令行上运行一个程序的命令如下:./test abc def 123 则test这个程序的main函数第一个…

论当前的云计算

随着技术的不断进步和数字化转型的加速,云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算,作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…

【AIGC】优化长提示词Prompt:提升ChatGPT输出内容的准确性与实用性

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯长提示词的挑战💯谷歌的优化长提示词技术关键因素分析 💯长提示词的设计原则💯优化长提示词的新框架方法💯实验结果分析不…

PostgreSQL的前世今生

PostgreSQL的起源可以追溯到1977年的加州大学伯克利分校(UC Berkeley)的Ingres项目。该项目由著名的数据库科学家Michael Stonebraker领导,他是2015年图灵奖的获得者。以下是PostgreSQL起源的详细概述: 一、早期发展 Ingres项目…