余慧慧 發表於 2024-3-15 09:55:00

基于R语言的raster包读取遥感影像

<p>  本文介绍基于<strong>R</strong>语言中的<code>raster</code>包,读取<strong>单张</strong>或批量读取<strong>多张</strong>栅格图像,并对栅格图像数据加以<strong>基本处理</strong>的方法。</p>
<h1 id="1-包的安装与导入">1 包的安装与导入</h1>
<p>  首先,我们需要配置好对应的<strong>R</strong>语言包;前面也提到,我们这里选择基于<code>raster</code>包来实现栅格图像数据的读取与处理工作。首先,如果有需要的话,我们可以先到<code>raster</code>包在<strong>R</strong>语言的官方网站中,查阅<code>raster</code>包的基本情况,比如其作者信息、当前的版本、所依赖的其他包等等;如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095503820-1170986704.png"></p>
<p>  当然,这些内容看不看都不影响我们接下来的操作。接下来,我们开始安装<code>raster</code>包;这里我是在<strong>RStudio</strong>中进行代码的撰写的。</p>
<p>  首先,我们输入如下的代码,从而开始<code>raster</code>包的下载与自动配置。</p>
<pre><code class="language-r">install.packages("raster")
</code></pre>
<p>  随后,按下<code>回车</code>键,运行代码,如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095459863-288254274.png"></p>
<p>  可以看到,我们在安装<code>raster</code>包时,会自动将其所需依赖的其他包(如果在此之前没有配置过)都一并配置好,非常方便。</p>
<p>  接下来,输入如下的代码,从而将刚刚配置好的<code>raster</code>包导入。</p>
<pre><code class="language-r">library(raster)
</code></pre>
<p>随后,按下<code>回车</code>键,运行代码,如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500154-126749829.png"></p>
<p>  此时,在<strong>RStudio</strong>右下方的“<strong>Packages</strong>”中,可以看到<code>raster</code>包以及其所依赖的<code>sp</code>包都处于选中的状态,表明二者都已经配置成功,且完成导入。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095459912-349687077.png"></p>
<h1 id="2-单一栅格图像读取与处理">2 单一栅格图像读取与处理</h1>
<p>  接下来,我们首先开始读取、处理单独一景栅格图像数据。</p>
<p>  首先,我们输入如下的代码;其中第一句是指定接下来要打开的栅格图像的路径与文件名,第二句则是通过<code>raster()</code>函数打开这一栅格图像。</p>
<pre><code class="language-r">tif_file_name &lt;- r"(E:\02_Project\01_Chlorophyll\ClimateZone\Split\A_LCC0.TIF)"
tif_file &lt;- raster(tif_file_name)
</code></pre>
<p>  运行上述代码。此时,我们可以在<strong>RStudio</strong>中右上方的“<strong>Environment</strong>”中看到我们刚刚新建的两个变量,以及其对应的值。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500103-112554063.png"></p>
<p>  接下来,我们可以直接通过<code>plot()</code>函数,对刚刚读取到的栅格图像数据加以绘制。</p>
<pre><code class="language-r">plot(tif_file)
</code></pre>
<p>  运行代码后,可以在<strong>RStudio</strong>中右下方的“<strong>Plots</strong>”看到绘制完毕的图像。可以说,这一绘制栅格图像的方式,相较于<strong>Python</strong>、<strong>C++</strong>等语言都更为方便。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500273-932177428.png"></p>
<p>  随后,我们简单介绍一下对这一栅格图像数据的处理操作。例如,我们可以通过<code>mean()</code>函数与<code>sd()</code>函数,计算栅格图像全部像元数值的平均值和标准差;这里我们用到了<code>na.rm = TRUE</code>参数,具体含义稍后会提到。</p>
<pre><code class="language-r">tif_mean &lt;- mean(tif_file[], na.rm = TRUE)
tif_std &lt;- sd(tif_file[], na.rm = TRUE)
</code></pre>
<p>  运行上述代码,随后输入如下的代码,即可查看我们刚刚计算得到的平均值与标准差。</p>
<pre><code class="language-r">tif_mean
tif_std
</code></pre>
<p>  结果图下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500128-1987760700.png"></p>
<p>  前面我们提到了<code>na.rm = TRUE</code>参数,这一参数表示是否消除数据集中无效值<code>NA</code>的影响;如果我们不将其设置为<code>TRUE</code>,那么就表示不消除数据集中的无效值;而如果我们的栅格图像中出现无效值(<strong>NoData</strong>值),那么就会使得平均值、标准差等计算结果同样为无效值<code>NA</code>;如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500162-368931812.png"></p>
<h1 id="3-大量栅格图像读取与处理">3 大量栅格图像读取与处理</h1>
<p>  接下来,我们介绍一下基于<code>raster</code>包批量读取大量栅格图像的方法。</p>
<p>  首先,我们需要将存放有大量栅格图像的文件夹明确,并将其带入<code>list.files()</code>函数中;这一函数可以对指定路径下的文件加以遍历。其中,<code>pattern</code>是对文件名称加以匹配,我们用<code>".tif$"</code>表示只筛选出文件名称是以<code>.tif</code>结尾的文件;<code>full.names</code>表示是否将文件的全名(即路径名称加文件名称)返回,<code>ignore.case</code>表示是否不考虑匹配文件名称时的大小写差异。</p>
<pre><code class="language-r">tif_file_path &lt;- list.files(r"(E:\02_Project\01_Chlorophyll\ClimateZone\Split\0)", pattern = ".tif$", full.names = TRUE, ignore.case = TRUE)
</code></pre>
<p>  运行上述代码,并将这一变量打印出来,结果如下图所示。可以看到,此时我们已经将指定路径下的<code>.tif</code>格式的栅格图像全部提取出来了。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500126-626417169.png"></p>
<p>  接下来,我们通过<code>stack()</code>函数,将全部栅格图像的数据放入同一个变量中;随后,我们可以打印一下这个变量,查看其中的内容。这里需要注意,如果通过这种方法批量读取栅格图像,需要保证每一景图像的空间参考信息、行数与列数完全一致,否则会弹出报错信息。如果大家的栅格图像行数与列数不完全一致,可以参考文章Python实现snap:对齐多张遥感影像的空间范围,对各个栅格图像加以统一。</p>
<pre><code class="language-r">tif_file_all &lt;- stack(tif_file_path)
tif_file_all
</code></pre>
<p>  运行上述代码,得到如下所示的结果。可以看到,这一变量中保存了<code>12</code>个图层(虽然栅格图像只有<code>7</code>景,但是其中有几景是具有多个波段的);其中,除了最基本的栅格图像维度、空间范围、空间参考信息等内容,<code>names</code>还展示了<code>12</code>个图层各自的名称,<code>min values</code>与<code>max values</code>则还展示了每一个图层的最小值与最大值。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500299-1224691000.png"></p>
<p>  此外,我们还可以继续基于<code>plot()</code>函数,直接批量绘制多个图层各自的栅格图像。</p>
<pre><code class="language-r">plot(tif_file_all)
</code></pre>
<p>  运行上述代码,结果如下所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500245-1119481559.png"></p>
<p>  此外,我们还可以基于<code>mean()</code>等函数,对栅格图像的基本数学统计信息加以计算。不过在对多个栅格图像数据加以计算时需要注意,在<code>tif_file_all</code>后是否添加<code>[]</code>符号,得到的结果是不一样的——如果不添加<code>[]</code>符号,我们相当于是加以逐像元分析,对每一个位置的像元在<code>12</code>个图层中的数值加以统计,并计算该像元在<code>12</code>个图层中的平均值;因此最终所得结果是一景新的栅格图像,图像中的每一个像元数值都表示该像元在<code>12</code>个图层中的平均值。而如果我们添加了<code>[]</code>符号,那么就和前述单一栅格图像的处理一样,计算的结果就是一个数值,即<code>12</code>个图层中每一个像元对应数值的总体的平均值。</p>
<pre><code class="language-r">tif_all_mean &lt;- mean(tif_file_all, na.rm = TRUE)
tif_all_mean_2 &lt;- mean(tif_file_all[], na.rm = TRUE)
</code></pre>
<p>  我们分别打印上述两个变量,得到结果如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202403/3080295-20240315095500241-366104107.png"></p>
<p>  由此可以更加明显地看出添加<code>[]</code>符号与否的差异。</p>
<p>  本文就只是对<strong>R</strong>语言<code>raster</code>包读取、处理栅格数据加以基本的方法介绍,至于更加深入的用法,我们将在后期的文章中加以介绍。</p><br><br>
来源:https://www.cnblogs.com/fkxxgis/p/18074781
頁: [1]
查看完整版本: 基于R语言的raster包读取遥感影像