- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文介绍基于 Python 中 whitebox 模块,对大量 长时间序列 栅格遥感影像的 每一个像元 进行 忽略NoData值 的 多时序平均值 求取.
在文章 Python ArcPy批量计算多时相遥感影像的各像元平均值 中,我们介绍了基于 Python 中 Arcpy 模块实现多时相遥感影像数据的平均值求取方法。但是这一方法具有一个问题,即对于任意一个像元,只要该像元在 任意一个时相 的图像中是无效值(即为 NoData ),那么该像元在最终求出的平均值 结果图中 像素值也将会是无效值 NoData 。这就导致在我们最终计算得到的平均值结果图层中,具有很多空白区域(像素值为 NoData 的区域).
为了解决这一问题,这里我们再介绍一种基于 Python 中另一个地理空间数据分析库—— whitebox ,实现多时像遥感影像数据逐像元平均值的求取方法.
首先,需要下载并安装 whitebox 这一模块。如果大家电脑中已经有了 Anaconda 环境,就可以直接按照 Python地理分析库whitebox在Anaconda中的配置 这篇文章中介绍的方法下载、安装 whitebox .
本文要实现的需求和文章 Python ArcPy批量计算多时相遥感影像的各像元平均值 中的一致,这里就不再赘述。本文所需用到的代码如下.
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 17 15:04:29 2022
@author: fkxxgis
"""
import glob
from whitebox import WhiteboxTools
tif_file_path="E:/LST/Data/MODIS/test/"
average_file_path="E:/LST/Data/MODIS/06_Average/"
wbt=WhiteboxTools()
wbt.work_dir=tif_file_path
tif_file_name=glob.glob(tif_file_path+"*.tif")
tif_file_year=tif_file_name[0][-18:-14]
one_year_tif_list=[]
for tif_file in tif_file_name:
if tif_file[-18:-14]==tif_file_year:
one_year_tif_list.append(tif_file)
tif_file_temp=tif_file
if tif_file==tif_file_name[len(tif_file_name)-1]:
wbt.average_overlay(inputs=';'.join(one_year_tif_list),
output=average_file_path+tif_file_year+"_Ave.tif")
else:
wbt.average_overlay(inputs=';'.join(one_year_tif_list),
output=average_file_path+tif_file_year+"_Ave.tif")
one_year_tif_list=[]
one_year_tif_list.append(tif_file)
tif_file_year=tif_file[-18:-14]
其中, tif_file_path 是原有计算平均值前遥感图像的保存路径, average_file_path 是我们新生成的求取平均值后遥感影像的保存路径,也就是结果保存路径.
上述代码的整体思路其实和文章 Python ArcPy批量计算多时相遥感影像的各像元平均值 这篇文章是非常类似的。首先,同样需要在 资源管理器中 ,将 tif_file_path 路径下的各文件以“ 名称 ”排序的方式进行排序;随后,利用 arcpy.ListRasters() 函数,获取路径下原有的全部 .tif 格式的图像文件,并截取第一个文件的部分文件名,从而获取其成像时间的具体年份.
接下来,遍历 tif_file_path 路径下全部 .tif 格式图像文件。其中,我们通过一个简单的判断语句 if tif_file[0:4]==tif_file_year: ,来确定某一年的遥感影像是否已经读取完毕——如果已经读取完毕,例如假如 2001 年成像的 8 幅遥感影像都已经遍历过了,那么就对这 8 景遥感影像加以逐像元的平均值求取,并开始对下一个年份(即 2005 年)成像的遥感影像继续加以计算;如果还没有读取完毕,例如假如 2001 年成像的 8 幅遥感影像目前仅遍历到了第 5 幅,那么就不求平均值,继续往下遍历,直到遍历完 2001 年成像的 8 幅遥感影像.
这里相信大家也看到了为什么我们要在前期先将文件夹中的文件按照“ 名称 ”排序——是为了保证 同一年成像的所有遥感影像都排列在一起 ,遍历时只要遇到一个 新的年份 ,程序就知道 上一个年份 的所有图像都已经遍历完毕了,就可以将 上一个年份 的所有栅格图像加以平均值求取.
本文代码和前期博客中代码不一样的部分就在于,这里是用到 whitebox 模块而非 arcpy 模块来实现同一年份遥感影像的逐像元平均值求取。在这里, wbt.average_overlay() 函数就是我们实现这一步骤的关键,其中 inputs 参数表示需要进行平均值计算的同一年份的所有遥感影像, output 表示求取平均值后得到的结果图像.
最后,通过 if tif_file==tif_file_name[len(tif_file_name)-1]: 这个判断,来确认是否目前已经遍历到文件夹中的 最后一个 图像文件。如果是的话,就需要将 当前成像年份 的所有图像进行平均值的求取,并宣告代码完成运行.
这里需要注意,由于我们在此没有用到 arcpy 模块,因此代码也就不一定非要在 IDLE (Python GUI) 中运行了,常见的编译器都可以运行。在代码运行过程中,还可以看到具体运行情况与进度.
代码运行完毕后,即可得到求解平均值后的结果图层.
最后还有一个问题——在我用这一代码进行实践后发现,如果 计算平均值前的图层 具有 两个或两个以上 的波段,那么得到的结果图层整体看还好,如下图所示.
但放大后,会发现得到的结果呈现出如下所示的条带状.
而如果 计算平均值前的图层 仅具有 一个 波段的话,就不会出现这种问题;如下图所示.
因此,大家在使用本文的代码对大量 长时间序列 栅格遥感影像的 每一个像元 进行 忽略Nodata值 的 多时序平均值 求取时,一定注意输入图层要 仅含有一个波段 ;否则结果就会出现条带状的错误.
最后此篇关于Python忽略NoData计算多张遥感影像的像元平均值:whitebox库的文章就讲到这里了,如果你想了解更多关于Python忽略NoData计算多张遥感影像的像元平均值:whitebox库的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个大小为 320x320 像素的阈值图像。我通过设置 ROI 以 20x20 像素的 block 循环遍历整个图像。我需要找到每个 block 的平均值。所以我将这些图像 block 传递给函数
我正在尝试学习 Javascript。我已经构建了以下代码来从一组数字中找到平均值。它有效除了最后返回的值总是 NaN。我不知道为什么。如果我将这 block 移到 block 外,它似乎完全忘记了变
假设我的数据已经分组,我该如何计算中位数和其他统计数据? Index Value Count 0 6 2 1 2 3 2 9 8 在上面
我试图计算的有趣情况。基本上在一行中,我有产品名称,其右侧的行是自首次收到产品以来经过的天数。 为 ex 计算的天数是 =TODAY()-BB2 我现在要做的是识别让我们说产品词“卡车”,然后计算卡车
我想知道如何计算某些数字的累积平均值。我将举一个简单的例子来描述我在寻找什么。 我有以下号码 vec 1) 为您的向量(或列表、一维数组或您如何称呼它)的每个元素评估此表达式,您将获得累积平均值。
我正在尝试对数据库表中的每一行进行平均。但它不能正常工作我想忽略该值,如果为空,它不会计算为零。使用我的代码,它将空值计算为零我想这样做 MS Excel 如果行/单元格为空,它将忽略。 Contro
我有以下信息(按 View 返回): DateTime ItemID UserTyp Seconds 2012-01-01 10 S 12 2012-01-01
我正在使用excel的average函数来获取欧洲各个城市一系列酒店价格的平均值。 =average(21,42,63,84,105) 我希望能够计算每个平均函数中的变量数量(例如,在上面的示例中有
我有一长串列,我想一次性计算非零中位数、平均值和标准差。我不能只删除基于 1 列的 0 行,因为同一列中另一列的值可能不是 0。 下面是我目前的代码,用于计算中位数、平均值等,包括零。 agg
这是我的问题: 我有一张这样的 table : Table Log int id; int time; timestamp DATE; int sid (FK to table Site);
JSON: [{"id":"1","user":"001","answer":"1,1,3,2,2,1,3,2"}, {"id":"2","user":"002","answer":"2,3,3,2,
有个问题: 使用适当的列名称,显示 obs 类型“CONT”的允许 ID 和平均 obs 值,其中 CONT 的平均 obs 值 >= 40。 假设承认是表1,观察是表2,但具有相同的主键Admit_
我有一个记录传感器数据的应用程序,我希望能够从多个传感器生成平均值,可以是一个、两个、三个或很多... 编辑:这些是温度传感器,因此 0 是传感器可能作为值存储在数据库中的值。 我最初的出发点是这个
我有这样一个数据框 id power flag 0 20 0 1 25 0 2 26 1 3 30 1 4 18 0 5
我想计算所有事件 blob 的平均位置。为此,首先我需要所有 X 和 Y 位置的总和。在这种情况下我该怎么做? contourFinder.findContours(grayImg, minB
我是一个十足的 Java 新手。上周一开始,之前从未用任何语言进行过任何编程。因此,如果我发现简单的事情变得复杂,请耐心等待。 我收到了一个文本文件。如下图: 第一个数据是时间(午夜过后的秒数),第二
我正在尝试为 Audacity 编写一个简单的测量插件,它就像用石头砸我的头骨一样有趣。我想要做的就是获取一段音频并找到所有样本的平均值(该 block 的 DC offset ),这样我就可以将它作
我正在尝试计算给定多边形内的值: 实际上我正在使用这个管道: 'aggregation': { 'pipeline': [ { "$match" : {
我有一个 pandas DataFrame,其中包含包含列表的列。我正在尝试获取此专栏中列表的方法。 这是我的 DataFrame 的示例: Loc Background 0
我尝试加速计算放置在数组中的4d向量的平均值。这是我的代码: #include #include #include #include #include #include typedef f
我是一名优秀的程序员,十分优秀!