本文介绍基于R语言中的raster包,读取单张或批量读取多张栅格图像,并对栅格图像数据加以基本处理的方法。

1 包的安装与导入

  首先,我们需要配置好对应的R语言包;前面也提到,我们这里选择基于raster包来实现栅格图像数据的读取与处理工作。首先,如果有需要的话,我们可以先到raster包在R语言的官方网站中,查阅raster包的基本情况,比如其作者信息、当前的版本、所依赖的其他包等等;如下图所示。

  当然,这些内容看不看都不影响我们接下来的操作。接下来,我们开始安装raster包;这里我是在RStudio中进行代码的撰写的。

  首先,我们输入如下的代码,从而开始raster包的下载与自动配置。

install.packages("raster")

  随后,按下回车键,运行代码,如下图所示。

  可以看到,我们在安装raster包时,会自动将其所需依赖的其他包(如果在此之前没有配置过)都一并配置好,非常方便。

  接下来,输入如下的代码,从而将刚刚配置好的raster包导入。

library(raster)

随后,按下回车键,运行代码,如下图所示。

  此时,在RStudio右下方的“Packages”中,可以看到raster包以及其所依赖的sp包都处于选中的状态,表明二者都已经配置成功,且完成导入。

2 单一栅格图像读取与处理

  接下来,我们首先开始读取、处理单独一景栅格图像数据。

  首先,我们输入如下的代码;其中第一句是指定接下来要打开的栅格图像的路径与文件名,第二句则是通过raster()函数打开这一栅格图像。

tif_file_name <- r"(E:\02_Project\01_Chlorophyll\ClimateZone\Split\A_LCC0.TIF)"
tif_file <- raster(tif_file_name)

  运行上述代码。此时,我们可以在RStudio中右上方的“Environment”中看到我们刚刚新建的两个变量,以及其对应的值。

  接下来,我们可以直接通过plot()函数,对刚刚读取到的栅格图像数据加以绘制。

plot(tif_file)

  运行代码后,可以在RStudio中右下方的“Plots”看到绘制完毕的图像。可以说,这一绘制栅格图像的方式,相较于PythonC++等语言都更为方便。

  随后,我们简单介绍一下对这一栅格图像数据的处理操作。例如,我们可以通过mean()函数与sd()函数,计算栅格图像全部像元数值的平均值和标准差;这里我们用到了na.rm = TRUE参数,具体含义稍后会提到。

tif_mean <- mean(tif_file[], na.rm = TRUE)
tif_std <- sd(tif_file[], na.rm = TRUE)

  运行上述代码,随后输入如下的代码,即可查看我们刚刚计算得到的平均值与标准差。

tif_mean
tif_std

  结果图下图所示。

  前面我们提到了na.rm = TRUE参数,这一参数表示是否消除数据集中无效值NA的影响;如果我们不将其设置为TRUE,那么就表示不消除数据集中的无效值;而如果我们的栅格图像中出现无效值(NoData值),那么就会使得平均值、标准差等计算结果同样为无效值NA;如下图所示。

3 大量栅格图像读取与处理

  接下来,我们介绍一下基于raster包批量读取大量栅格图像的方法。

  首先,我们需要将存放有大量栅格图像的文件夹明确,并将其带入list.files()函数中;这一函数可以对指定路径下的文件加以遍历。其中,pattern是对文件名称加以匹配,我们用".tif$"表示只筛选出文件名称是以.tif结尾的文件;full.names表示是否将文件的全名(即路径名称加文件名称)返回,ignore.case表示是否不考虑匹配文件名称时的大小写差异。

tif_file_path <- list.files(r"(E:\02_Project\01_Chlorophyll\ClimateZone\Split\0)", pattern = ".tif$", full.names = TRUE, ignore.case = TRUE)

  运行上述代码,并将这一变量打印出来,结果如下图所示。可以看到,此时我们已经将指定路径下的.tif格式的栅格图像全部提取出来了。

  接下来,我们通过stack()函数,将全部栅格图像的数据放入同一个变量中;随后,我们可以打印一下这个变量,查看其中的内容。这里需要注意,如果通过这种方法批量读取栅格图像,需要保证每一景图像的空间参考信息、行数与列数完全一致,否则会弹出报错信息。如果大家的栅格图像行数与列数不完全一致,可以参考文章Python实现snap:对齐多张遥感影像的空间范围,对各个栅格图像加以统一。

tif_file_all <- stack(tif_file_path)
tif_file_all

  运行上述代码,得到如下所示的结果。可以看到,这一变量中保存了12个图层(虽然栅格图像只有7景,但是其中有几景是具有多个波段的);其中,除了最基本的栅格图像维度、空间范围、空间参考信息等内容,names还展示了12个图层各自的名称,min valuesmax values则还展示了每一个图层的最小值与最大值。

  此外,我们还可以继续基于plot()函数,直接批量绘制多个图层各自的栅格图像。

plot(tif_file_all)

  运行上述代码,结果如下所示。

  此外,我们还可以基于mean()等函数,对栅格图像的基本数学统计信息加以计算。不过在对多个栅格图像数据加以计算时需要注意,在tif_file_all后是否添加[]符号,得到的结果是不一样的——如果不添加[]符号,我们相当于是加以逐像元分析,对每一个位置的像元在12个图层中的数值加以统计,并计算该像元在12个图层中的平均值;因此最终所得结果是一景新的栅格图像,图像中的每一个像元数值都表示该像元在12个图层中的平均值。而如果我们添加了[]符号,那么就和前述单一栅格图像的处理一样,计算的结果就是一个数值,即12个图层中每一个像元对应数值的总体的平均值。

tif_all_mean <- mean(tif_file_all, na.rm = TRUE)
tif_all_mean_2 <- mean(tif_file_all[], na.rm = TRUE)

  我们分别打印上述两个变量,得到结果如下图所示。

  由此可以更加明显地看出添加[]符号与否的差异。

  本文就只是对R语言raster包读取、处理栅格数据加以基本的方法介绍,至于更加深入的用法,我们将在后期的文章中加以介绍。

基于R语言的raster包读取遥感影像的更多相关文章

  1. R语言中文分词包jiebaR

    R语言中文分词包jiebaR R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据 ...

  2. R语言︱H2o深度学习的一些R语言实践——H2o包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言H2o包的几个应用案例 笔者寄语:受启发 ...

  3. 基于R语言的时间序列指数模型

    时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...

  4. 基于R语言的ARIMA模型

    A IMA模型是一种著名的时间序列预测方法,主要是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型.ARIMA模型根据原序列是否平稳以及 ...

  5. R语言:recommenderlab包的总结与应用案例

    R语言:recommenderlab包的总结与应用案例   1. 推荐系统:recommenderlab包整体思路 recommenderlab包提供了一个可以用评分数据和0-1数据来发展和测试推荐算 ...

  6. 使用R语言的RTCGA包获取TCGA数据--转载

    转载生信技能树 https://mp.weixin.qq.com/s/JB_329LCWqo5dY6MLawfEA TCGA数据源 - R包RTCGA的简单介绍 - 首先安装及加载包 - 指定任意基因 ...

  7. 中文分词实践(基于R语言)

    背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来.然后做中文分词+词频统计,最后将统计结果简单做个标签云.效果例如以下: 兴许:中文分词是中文信息处理的基础.分词之后.事 ...

  8. [R语言] 基于R语言实现环状条形图的绘制

    环状条形图(Circular barplot)是条形图的变体,图如其名,环状条形图在视觉上很吸引人,但也必须小心使用,因为环状条形图使用的是极坐标系而不是笛卡尔坐标系,每一个类别不共享相同的Y轴.环状 ...

  9. 概率图模型 基于R语言 这本书中的第一个R语言程序

    概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...

  10. Twitter基于R语言的时序数据突变检测(BreakoutDetection)

    Twitter开源的时序数据突变检测(BreakoutDetection),基于无参的E-Divisive with Medians (EDM)算法,比传统的E-Divisive算法快3.5倍以上,并 ...

随机推荐

  1. 零基础入门学习Java课堂笔记 ——day05

    面向对象(上) 面向过程:我打算列个计划表一步一步来 面向对象:我喜欢先分析分类,把复杂的问题简单化 1.什么是面向对象!!? 面向对象的本质就是:以类的方式组织代码,以对象的方式组织数据 封装 继承 ...

  2. Kafka-常用命令行命令(Kafak3.4.0最新命令)

    第一章 Kafka常用命令 1. Topic(主题) 1.1. 创建Topic bin/kafka-topics.sh --create --bootstrap-server hadoop01:909 ...

  3. UVA11573 Ocean Currents

    题目链接 题目 见链接. 题解 知识点:BFS. 这道题显然用BFS,但发现洋流方向会破坏时间的有序性,但注意到洋流时间花费是 \(0\) ,因此只需要用双端队列即可,洋流方向扩展直接放队头,其他方向 ...

  4. Java线程状态(生命周期)--一篇入魂

    1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态. 线程可以有如下6 种状态: New (新创建):未启动的线程: Runnable (可运行):可运行的线程,需要等待操作系统资源: ...

  5. java 从零开始手写 redis(十)缓存淘汰算法 LFU 最少使用频次

    前言 java从零手写实现redis(一)如何实现固定大小的缓存? java从零手写实现redis(三)redis expire 过期原理 java从零手写实现redis(三)内存数据如何重启不丢失? ...

  6. 【Android】使用Binder实现进程间通讯简单案例

    1 前言 使用AIDL实现进程间通讯简单案例 和 使用AIDL实现进程间传递对象案例 中介绍了使用 AIDL 进行进程间通讯,文中提到在编写完 aidl 文件(如:IMessageManager.ai ...

  7. 解决Burpsuite1.6中文显示乱码问题

    说明 最近公司项目被测试团队测试出有越权访问等安全问题,用的是这个Burpsuit工具,我想做软件测试的同学应该很熟悉.那么中间在模拟请求响应过程中发现返回的信息中文是乱码,搜索了一圈发现很多人提供的 ...

  8. Spring源码之spring事务

    目录 Spring事务 事务自定义标签 自定义标签 解析标签 bean 的初始化 InfrastructureAdvisorAutoProxyCreator 获取增强方法 获取所有增强中内适用于当前方 ...

  9. C++ 控制台程序的线程分析

    在无任何功能代码的情况下运行控制台,会发现有三个线程在运行 SO 的答案指出,在程序一开始运行时,为加快进程启动,windows 会利用多个 CPU 内核更快地初始化. ntdll.dll 线程实际上 ...

  10. Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试

    前言   上一篇使用QtWebApp的基于Qt的轻量级http服务器实现了一个静态网页返回的Demo,网页服务器很重要的就是日志,因为在服务器类上并没有直接返回,所以,本篇先把日志加上.   Demo ...