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.mzph.cn/diannao/59933.shtml

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

相关文章

【时间之外】IT人求职和创业应知【31】

目录 新闻一&#xff1a;2024年“秦创原沣东杯”陕西省科技工作者创新创业大赛颁奖仪式暨沣东新城机器人产业发展大会盛大启幕 新闻二&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 新闻三&#xff1a;“5G工业互联网”融合应用试点城市名单…

使用ThorUi

摘要&#xff1a; 官网 今天遇到一个老项目&#xff0c;使用的是ThorUi组件库&#xff01;之前没有用过这组件库&#xff0c;所以记录一下不同框架是使用情况&#xff01; ThorUI 是一个基于 Thorium 的 UI 框架&#xff0c;用于构建跨平台的桌面应用程序。如果你打算使用 Thor…

科研绘图系列:R语言文章组合图形(barplot scatterplot)

文章目录 介绍加载R包数据下载清理环境设置计算资源数据处理图1图2图3图4图5图6图7图8图9系统信息介绍 R语言组合图形 加载R包 library(xlsx) library(reshape2) library(ggplot2) library(ggh4x) library(wbstats

内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?

相关技术 要实现“内网部署&#xff0c;外网访问”&#xff0c;可以使用内网穿透、VPN技术、DMZ主机、端口映射等方法。以下是对这些方法的详细解释&#xff1a; 一、内网穿透 内网穿透是一种技术&#xff0c;它通过将内网设备映射到公网上的方式&#xff0c;实现外网访问内…

从零开始训练一个大语言模型需要多少天?

一&#xff0c;前言 在AI领域&#xff0c;训练一个大型语言模型&#xff08;LLM&#xff09;是一个耗时且复杂的过程。几乎每个做大型语言模型&#xff08;LLM&#xff09;训练的人都会被问到&#xff1a;“从零开始&#xff0c;训练大语言模型需要多久和花多少钱&#xff1f;”…

Halcon resistor.hedv 使用多个对焦级别提取深度

depth_from_focus * Extract depth using multiple focus levels * 使用多个对焦级别提取深度 Names : [] * 初始化一个空数组&#xff0c;用于存储图像名称 dev_close_window () * 关闭当前打开的图像窗口 for i : 1 to 10 by 1 * 循环开始&#xff0c;从1到10 …

C语言 | Leetcode C语言题解之第546题移除盒子

题目&#xff1a; 题解&#xff1a; int dp[100][100][100];int calculatePoints(int* boxes, int l, int r, int k) {if (l > r) {return 0;}if (dp[l][r][k] 0) {int r1 r, k1 k;while (r1 > l && boxes[r1] boxes[r1 - 1]) {r1--;k1;}dp[l][r][k] calcu…

玩的花,云产品也能拼团了!!!

说起拼单大家都不陌生&#xff0c;电商一贯的营销手段&#xff0c;不过确实可以给消费者省下一笔钱。双11到了&#xff0c;腾讯云产品也玩起了拼团&#xff0c;这明显是对开发人员和各企业的福利。 对于有云产品需求的个人或企业&#xff0c;这次绝对是难得的一次薅羊毛机会。…

win10@win10 配置openssh服务

1.下载离线包&#xff1a;https://github.com/PowerShell/Win32-OpenSSH/releases 2.然后管理员打开powershell&#xff0c;cd到这个安装包放置的目录中来&#xff0c;输入以下命令&#xff1a;powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 此时要注意pow…

全面解析:网络协议及其应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 全面解析&#xff1a;网络协议及其应用 文章目录 网络协议概述定义发展历程主要优势 主要网络协议应用层协议传输层协议网络层…

webWorker基本用法

我们都知道js是一个单线程的语言&#xff0c;当线程堵塞时&#xff0c;可能会导致页面无法正常交互&#xff0c;如一些复杂的可视化处理。即使是异步处理&#xff0c;也只是将其暂存到任务队列中去&#xff0c;等主线程执行完后依然会从任务队列中取过去。 为此&#xff0c;js提…

【1】虚拟机安装

1.安装VMware WorkStation Pro VMware下载地址&#xff1a; 2.新建虚拟机 centos7下载地址&#xff1a;centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云

2-149 基于matlab的LDPC译码性能分析

基于matlab的LDPC译码性能分析&#xff0c;LDPC&#xff08;Low-Density Parity-Check&#xff09;码作为编码技术&#xff0c;具有优秀的纠错性能和较低的编解码复杂度。为保证可靠的数据传输&#xff0c;对传输过程中可能出现的信道噪声、干扰等进行模拟和分析。分析对比了误…

游戏开发--C#面试题

游戏开发--C#面试题 C#1. 值类型和引用类型的区别2. 重载和重写的区别3. ArrayList和List的区别4. List底层是什么实现的&#xff1f;5. 抽象类和接口的区别6. 静态成员和⾮静态成员的区别7. 装箱和拆箱是指什么&#xff1f;8. 值和引用类型在变量赋值时的区别是什么&#xff1…

DAY23|回溯算法Part02|LeetCode: 39. 组合总和 、40.组合总和II 、131.分割回文串

目录 LeetCode: 39. 组合总和 基本思路 C代码 LeetCode: 40.组合总和II 基本思路 C代码 LeetCode: 131.分割回文串 基本思路 C代码 LeetCode: 39. 组合总和 力扣代码链接 文字讲解&#xff1a;LeetCode: 39. 组合总和 视频讲解&#xff1a;带你学透回溯算法-组合总和…

【linux】再谈网络基础(二)

8. 再谈端口号 &#xff08;一&#xff09;与协议之间的关系 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识…

OpenCV视觉分析之目标跟踪(12)找到局部的最大值函数meanShift()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在反向投影图像上找到一个对象。 meanShift 是一种用于图像处理和计算机视觉领域的算法&#xff0c;特别适用于目标跟踪、图像分割等任务。该算…

VS2022配置OpenGL

下载地址&#xff1a; https://download.csdn.net/download/hgaohr1021/89974202 1、下载后&#xff0c;直接把OpenGL文件&#xff0c;全部放在 D:\Program Files这里&#xff0c;OpenGL这个名字也不要改&#xff01;&#xff01;&#xff01; 2、把文件PropertySheetOpenGL.p…

革命性AI搜索引擎!ChatGPT最新功能发布,无广告更智能!

文章目录 零、前言一、ChatGPT最新AI搜索引擎功能操作指导实战1:搜索新闻实战2:搜索天气实战3:搜索体育消息 二、感受 零、前言 大人&#xff0c;时代变了。 最强 AI 助力下的无广告搜索引擎终于问世。我们期待已久的这一刻终于到来了&#xff0c;从今天起&#xff0c;ChatGPT…

微积分复习笔记 Calculus Volume 1 - 4.10 Antiderivatives

4.10 Antiderivatives - Calculus Volume 1 | OpenStax