R语言实战——一些批量对地理数据进行操作的方法

各位朋友在进行数据处理时,当有多张栅格影像时,如果我们都要进行同一操作时,一张一张做很繁琐,用ArcGIS模型构建器是一种比较好的方法。当然,今天小编新学了R语言上面进行批量裁剪,一起来学习一下吧!

一、批量裁剪

当我们有一张栅格数据时,需要按照特定的空间范围进行矢量数据裁剪时,应该怎么办?

话不多说,直接上代码:

裁剪
library(terra)
# 定义栅格文件和矢量数据路径
raster_file <- "H:/TEMData/Result/mean_output.tif"  # 栅格文件路径
vector_file <- "H:/shpfile"  # 矢量数据路径
output_file <- "H:/TEMData/Result/cropped_output.tif"    # 输出文件路径# 读取栅格数据
raster_data <- rast(raster_file)# 读取矢量数据
vector_data <- vect(vector_file)# 设置栅格数据的坐标系(如果需要)
if (is.na(crs(raster_data))) {crs(raster_data) <- crs(vector_data)
}# 使用 crop 和 mask 函数进行裁剪
masked_data <- crop(raster_data, vector_data) %>% mask(., vector_data)# 写入裁剪后的数据到输出文件
writeRaster(masked_data, output_file, overwrite = TRUE)cat("Cropped raster saved to:", output_file, "\n")# 可选:显示裁剪后的栅格
plot(masked_data, main = "Cropped Raster", col = terrain.colors(20))

 上面是单张栅格影像的处理,那如果我有20张,有50张呢?那我们来写个循环吧。

library(terra)
library(magrittr)  # 加载管道操作符# 批量读取tif
folder <- "F:/shiyan1/"
# 输出文件夹路径,保存裁剪后的数据
output_folder <- "F:/result1/"# 创建输出文件夹
if (!dir.exists(output_folder)) { dir.create(output_folder)
}# 获取所有TIF文件
tiff_files <- list.files(path = folder, pattern = "\\.tif$", full.names = TRUE)# 读取 Shapefile 数据
shp_data <- vect("F:/hlbe")# 循环处理每个TIF文件
for (tiff_file in tiff_files) { # 从文件名中提取文件名(不包括路径和扩展名) output_name <- tools::file_path_sans_ext(basename(tiff_file)) # 读取 GeoTIFF 数据raster_data <- rast(tiff_file) # 使用 mask 函数进行按照 Shapefile 进行的遮罩masked_data <- crop(raster_data, shp_data) %>% mask(., shp_data) # 构建输出文件路径output_path <- file.path(output_folder, paste0(output_name, ".tif")) # 写入裁剪后的数据到输出文件 writeRaster(masked_data, output_path, overwrite = TRUE) cat("File", tiff_file, "processed and saved to", output_path, "\n")
}# 加载显示裁剪后的数据
output_rasters <- list.files(path = output_folder, pattern = "\\.tif$", full.names = TRUE)
if (length(output_rasters) > 0) {plot(rast(output_rasters))
} else {cat("No raster files found in the output folder.\n")
}

上面写了一个for循环,用mask函数进行掩膜处理,这样子就可以实现批量裁剪啦。

不过大家要注意,在进行代码梳理的时候,一定要注意,矢量空间范围和栅格数据的坐标系要统一,不然可能因为空间范围不同,没有重叠,或者坐标系冲突,从而产生错误结果。代码可以直接用,要改的地方就是文件夹的读取和导出,大家要复制自己所在数据地址哈!

二、定义坐标系

既然上面讲到了坐标系要统一,那么我们想到,怎么样对一张栅格影像进行坐标系定义呢?

我们上代码:

library(terra)# 定义输入文件夹和输出文件夹
folder <- "F:/shiyan1/"
output_folder <- "F:/result1/"# 创建输出文件夹
if (!dir.exists(output_folder)) {dir.create(output_folder)
}# 获取所有TIF文件
tiff_files <- list.files(path = folder, pattern = "\\.tif$", full.names = TRUE)# 循环处理每个TIF文件
for (tiff_file in tiff_files) {# 读取 GeoTIFF 数据raster_data <- rast(tiff_file)# 设置坐标系为 WGS 1984crs(raster_data) <- "EPSG:4326"# 构建输出文件路径output_path <- file.path(output_folder, basename(tiff_file))# 写入设置坐标系后的数据到输出文件 writeRaster(raster_data, output_path, overwrite = TRUE) cat("File", tiff_file, "processed and saved with WGS 1984 coordinate system to", output_path, "\n")
}

这里我们将栅格数据定义为WGS1984坐标系,大家找到要定义的坐标系的EPSG代码,改一改就行啦。

三、批量转换数据格式

在进行数据处理时,tif格式的数据是常用的数据格式,我们从一些网站下面下载的数据可能是GRID格式或者其他格式,小编在处理多年风速数据的时候就遇到了这个问题,如果你需要将多张其他格式的数据转换成tif格式,应该怎么做?

我们上代码:

# 加载必要的包
library(terra)# 设置输入和输出文件夹
input_folder <- "H:/VData/"  # 输入 ADF 文件夹路径
output_folder <- "H:/tem/output/"  # 输出 TIFF 文件夹路径# 创建输出文件夹(如果不存在)
if (!dir.exists(output_folder)) {dir.create(output_folder)
}# 获取所有 ADF 文件夹
adf_dirs <- list.dirs(path = input_folder, full.names = TRUE, recursive = FALSE)# 循环处理每个 ADF 文件夹
for (adf_dir in adf_dirs) {# 检查是否存在 ADF 文件adf_files <- list.files(adf_dir, pattern = "\\.adf$", full.names = TRUE)if (length(adf_files) > 0) {# 读取 ADF 数据raster_data <- rast(adf_dir)# 从文件夹名中提取输出 TIFF 文件名output_name <- tools::file_path_sans_ext(basename(adf_dir))  # 不包括后缀output_file <- file.path(output_folder, paste0(output_name, ".tif"))# 将 ADF 数据保存为 TIFF 格式writeRaster(raster_data, output_file, overwrite = TRUE)  # 不需要指定 formatcat("Converted:", adf_dir, "to", output_file, "\n")} else {cat("No ADF files found in:", adf_dir, "\n")}
}

通过上述代码,我们可以实现对数据的格式转换,中间我们用if函数检查了一下我们的文件夹里面是否存在我们需要转换的数据格式文件,如果没有会报出,这时我们需要对文件夹重新整理。小编在处理的时候,一开始有info文件夹在里头,R语言读不了,后面吧info文件删除之后,就能够开始读取了。

四、栅格计算

当我们有连续20年的数据,如果需要进行均值计算时,怎么办?

library(terra)# 定义输入文件夹
input_folder <- "H:/TEMData/Data"# 获取所有 TIF 文件
tiff_files <- list.files(path = input_folder, pattern = "\\.tif$", full.names = TRUE)# 读取第一个栅格数据以获取参考范围和分辨率
reference_raster <- rast(tiff_files[1])# 创建一个空的列表来存储对齐后的栅格数据
aligned_rasters <- list(reference_raster)# 循环处理其他栅格文件
for (tiff_file in tiff_files[-1]) {# 读取栅格数据raster_data <- rast(tiff_file)# 对齐栅格数据到参考栅格的范围和分辨率aligned_raster <- project(raster_data, reference_raster)# 添加对齐后的栅格到列表aligned_rasters <- c(aligned_rasters, list(aligned_raster))
}# 将对齐后的栅格合并为一个栅格堆栈
raster_stack <- rast(aligned_rasters)# 计算均值
mean_raster <- app(raster_stack, fun = mean, na.rm = TRUE)# 构建输出文件路径
output_path <- "H:/TEMData/Result/mean_output.tif"# 写入均值栅格数据到输出文件
writeRaster(mean_raster, output_path, overwrite = TRUE)# 显示均值栅格
plot(mean_raster, main = "Mean Raster", col = terrain.colors(20))cat("Mean raster saved to:", output_path, "\n")

这里是结果:

如果是要进行求和呢?

我们以逐月日照数据为例,来看看怎么实现?

library(terra)# 设置输入文件夹路径
input_folder <- "H:/ssd/2013"
output_file <- "H:/ssd/result/annual_sum_raster.tif"# 获取所有 TIF 文件
raster_files <- list.files(path = input_folder, pattern = "\\.tif$", full.names = TRUE)if (length(raster_files) == 0) {stop("No TIF files found in the specified folder.")
}annual_sum_raster <- NULL# 循环处理每个栅格影像
for (raster_file in raster_files) {current_raster <- rast(raster_file)if (is.null(annual_sum_raster)) {annual_sum_raster <- current_raster} else {annual_sum_raster <- annual_sum_raster + current_raster}gc()  # 垃圾回收
}writeRaster(annual_sum_raster, output_file, overwrite = TRUE)
cat("Annual sum raster saved to:", output_file, "\n")
plot(annual_sum_raster, main = "Annual Sum Raster")

需要注意的是年度合成数据因为计算量比较大,如果你的栅格有多张,可能算不出来,我们就需要设计一个垃圾回收的机制,来减少不必要的内存消耗,这里是月日照数据合成年总和数据的结果:

好了,今天我们的学习就到这里结束了,希望对大家有帮助!

我们是梧桐GIS,致力于分享数据处理的优质教程,谢谢大家关注!

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

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

相关文章

TEMU测评:在挑战与机遇中寻求突破

近年来&#xff0c;TEMU&#xff08;由拼多多推出的海外电商平台&#xff09;在全球范围内迅速崛起&#xff0c;特别是在美国市场&#xff0c;其以极具竞争力的价格和丰富的商品种类吸引了大量海外消费者。然而&#xff0c;随着市场竞争的加剧和外部环境的变化&#xff0c;TEMU…

BIM 地铁站智能可视化应用

运用图扑数字孪生结合建筑信息建模&#xff08;BIM&#xff09;技术&#xff0c;提供地铁站结构和设施的全方位三维可视化展示。支持施工方案优化、进度管理及协同操作&#xff0c;提高设计精度和施工效率&#xff0c;保障地铁项目的全生命周期管理。

C++研发笔记12——C语言程序设计初阶学习笔记10

本篇笔记是一篇练习文章&#xff0c;是对第二部分《初识C语言》的一个回顾&#xff0c;从而结束第二部分的学习。 题目一 关于C语言关键字说法正确的是&#xff1a;( ) A.关键字可以自己创建 B.关键字不能自己创建 C.关键字可以做变量名 D.typedef不是关键字 【参考答案…

【论文笔记】SparseRadNet: Sparse Perception Neural Network on Subsampled Radar Data

原文链接&#xff1a;https://arxiv.org/abs/2406.10600 简介&#xff1a;本文引入自适应子采样方法和定制网络&#xff0c;利用稀疏性模式发掘雷达信号中的全局和局部依赖性。本文的子采样模块选择 RD谱中在下游任务贡献最大 像素 的子集。为提高子采样数据的特征提取&#xf…

【IEEE出版|连续5年稳定EI检索|易中稿!近距离交流院士、Fellow!】第六届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA 2024)

第六届国际科技创新学术交流大会暨机械工程与自动化国际学术会议&#xff08;MEA 2024&#xff09; 2024 6th International Conference on Mechanical Engineering and Automation 重要信息 会议官网&#xff1a;mea2024.iaecst.org&#xff08;会议关键词&#xff1a;MEA 2…

计算机图形学论文 | 木工设计与制造计划的共同优化

&#x1f98c;&#x1f98c;&#x1f98c;读论文 我们的系统共同探索离散设计变量和制造计划的空间&#xff0c;以生成&#xff08;设计&#xff0c;制造计划&#xff09;对的帕累托前沿&#xff0c;使制造成本最小化。在该图中&#xff0c;(a)是椅子的输入设计和仅探索该设计的…

Kubernetes-ArgoCD篇-02-安装

1、安装 1.1 Argo CD CLI mac安装&#xff1a; brew install argocd通用安装&#xff1a; # 查看os go env GOOS # 查看架构 go env GOARCHargoCdName"argocd-darwin-arm64" # 此步骤也可以手动下载 wget https://github.com/argoproj/argo-cd/releases/latest/d…

【Ant Design Pro】框架入门的起手式及架构的分析

框架千千万万&#xff0c;换个公司换个样&#xff01;umijs官网地址在这里&#xff0c;都要喊它father!! 作为笔记&#xff0c;了解框架结构。官网地址:Ant Design Pro。 项目环境 node 版本18依赖安装淘宝镜像&#xff0c;npm i大概要2~3分钟&#xff0c;感觉这种框架很重 安…

【数据分享】2024年我国省市县三级的生活服务设施数量(46类设施/Excel/Shp格式)

人才市场、售票处、旅行社等生活服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市生活服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、…

采用 EtherCAT 的磁场定向控制 (FOC) 伺服运动控制器 IC-TMC8670-BI

这款芯片是小型去中心化机器人的理想解决方案&#xff0c;还十分适合机器人和工业自动化、实验室自动化、工业物联网应用以及嵌入式运动控制系统中的典型编码器&#xff0c;使其更加全能。 TMC8670是用于工业自动化、嵌入式伺服控制和其他自动化设备应用的单轴伺服电机控制器。…

【Melty是一款开源的AI编程助手,基于codellama,媲美cusor】

https://github.com/meltylabs/melty.git 对话进行代码重构

今日力扣:3235. 判断矩形的两个角落是否可达

给你两个正整数 xCorner 和 yCorner 和一个二维整数数组 circles &#xff0c;其中 circles[i] [xi, yi, ri] 表示一个圆心在 (xi, yi) 半径为 ri 的圆。 坐标平面内有一个左下角在原点&#xff0c;右上角在 (xCorner, yCorner) 的矩形。你需要判断是否存在一条从左下角到右上…

HCIP-HarmonyOS Application Developer 习题(二十)

1、&#xff08;判断题&#xff09;在使用 EventHandler 实现线程问通信时如果 EventRurner取出的是InnerEvent事件&#xff0c;则 EventRunner 会直接在新线程上处理该事件。 答案&#xff1a;错误 分析&#xff1a;如果EventRunner取出的事件为InnerEvent事件&#xff0c;则触…

恭喜!2024年度大连市科技人才创新、科技人才创业项目拟立项公示!

精选SCI/SSCI/EI SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 …

CSS3中动画的使用animation

1.基本使用 2.其他属性 3.复合属性

C语言多维数组抽象理解:切格子思维

其实早在两年前我就写过一篇关于多维数组的文章&#xff1a;详解多维数组与指针之间的关系&#xff0c;随着时间的推移&#xff0c;我的工作与学习逐渐深入&#xff0c;对C语言有了更深入的理解&#xff0c;觉得之前写的文章里关于多维数组部分有些复杂&#xff0c;不能以最简单…

超越Axure:探索新一代原型设计工具

Axure RP是一款被广泛认可的快速原型设计工具&#xff0c;专为专业设计师打造&#xff0c;用于创建高效的产品原型图&#xff0c;包括APP和网页的原型图、框架图和结构图等。Axure RP制作的原型图能够实现与实际APP相似的交互效果&#xff0c;便于向用户或客户展示&#xff0c;…

PVE纵览-从零开始:了解Proxmox Virtual Environment

PVE纵览-从零开始&#xff1a;了解Proxmox Virtual Environment 文章目录 PVE纵览-从零开始&#xff1a;了解Proxmox Virtual Environment摘要引言什么是Proxmox Virtual EnvironmentPVE的核心功能PVE 优势如何开始使用PVEPVE应用案例总结 关键字&#xff1a; PVE、 虚拟机、…

装杯 之 Linux指令【补充篇】

“生活就像海洋&#xff0c;只有意志坚强的人&#xff0c;才能到达彼岸” ---马克思 目录 1.grep指令 ​编辑 2.zip/unzip指令 3.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 4.bc指令 5.uname 指令 1.grep…

AI自动直播软件之直播任务模块开发!

AI自动直播软件&#xff0c;作为现代科技与传统直播行业的完美结合&#xff0c;正在逐步改变我们的生活方式&#xff0c;它不仅能够帮助主播们实现24小时不间断的直播&#xff0c;还能通过智能算法分析观众喜好&#xff0c;推送定制化的内容&#xff0c;极大地提升了用户体验。…