论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Python ArcPy批量计算多时相遥感影像的各项元平均值 ...
Python ArcPy批量计算多时相遥感影像的各项元平均值
大号在练葵花宝典
金牌会员
|
2023-4-18 17:51:40
|
显示全部楼层
|
阅读模式
楼主
主题
936
|
帖子
936
|
积分
2808
本文介绍基于
Python
中
ArcPy
模块,对大量
长时间序列
栅格遥感影像文件的
每一个像元
进行
多时序平均值
的求取。
在遥感应用中,我们经常需要对
某一景
遥感影像中的
全部像元的像素值
进行平均值求取——这一操作很好实现,基于
ArcMap
软件或者简单的
Python
代码就可以实现;但有时候,我们会需要结合同一地区、
不同时相
的
多景
遥感影像,求取
每一个像元
在
全部时相
中像素值的平均值——这一需求的实现较之前者就有些麻烦,本文对此加以介绍。
首先,我们来明确一下本文的具体需求。现有一个存储有大量.tif格式遥感影像的文件夹,其中每一个遥感影像的文件名中都包含有该图像的成像时间,如下图所示。且其中除了.tif格式的遥感影像文件外,还具有其它格式的文件。
我们希望,对于
同一年
成像的遥感影像进行逐像元平均值的求取。例如,上图中具有2001年第185天成像、第193天成像、第201天成像……等等遥感影像8幅,每一幅都是这一年不同时间在同一空间位置的成像;同时,还有2005年不同时间成像的遥感影像9幅。我们希望,首先将2001年成像的8幅遥感影像加以逐像元平均值的求取,即求取
每一个像元
在这
8景图像
中像素值的平均;随后再对2005年成像的9幅遥感影像加以逐像元平均值的求取,以此类推。
明确了需求后,我们就可以开始具体的操作。首先,本文所需用到的代码如下。
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 16 10:48:37 2022
@author: fkxxgis
"""
import arcpy
from arcpy.sa import *
tif_file_path="E:/LST/Data/MODIS/05_Resample/"
average_file_path="E:/LST/Data/MODIS/06_Average/"
arcpy.env.workspace=tif_file_path
tif_file_name=arcpy.ListRasters("*","tif")
tif_file_year=tif_file_name[0][0:4]
one_year_tif_list=[]
sum_pic=0
for tif_file in tif_file_name:
if tif_file[0:4]==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]:
pic_num=len(one_year_tif_list)
for tif_file_new in one_year_tif_list:
sum_pic=sum_pic+Raster(tif_file_new)
(sum_pic/pic_num).save(average_file_path+tif_file_year+"_Ave.tif")
else:
pic_num=len(one_year_tif_list)
for tif_file_new in one_year_tif_list:
sum_pic=sum_pic+Raster(tif_file_new)
(sum_pic/pic_num).save(average_file_path+tif_file_year+"_Ave.tif")
one_year_tif_list=[]
sum_pic=0
one_year_tif_list.append(tif_file)
tif_file_year=tif_file[0:4]
复制代码
其中,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幅遥感影像。
这里相信大家也看到了为什么我们要在前期先将文件夹中的文件按照“
名称
”排序——是为了保证
同一年成像的所有遥感影像都排列在一起
,遍历时只要遇到一个
新的年份
,程序就知道
上一个年份
的所有图像都已经遍历完毕了,就可以将
上一个年份
的所有栅格图像加以平均值求取。
在这里,逐像元的平均值求取其实也非常简单——我们对每一个像元分别执行以下操作:首先将该像元在当前年份里所有
遥感影像的像素值
相加,随后除以这一年份的
遥感影像的数量
,得到的就是该像元在这一年中
像素值的平均值
。
最后,通过if tif_file==tif_file_name[len(tif_file_name)-1]:这个判断,来确认是否目前已经遍历到文件夹中的
最后一个
图像文件。如果是的话,就需要将
当前成像年份
的所有图像进行平均值的求取,并宣告代码完成运行。
在
IDLE (Python GUI)
中运行代码。代码运行完毕后,我们看一下结果文件夹。可以看到,其中的图像已经是按照成像时间,分别完成平均值求取后的结果了。
在最后,还需要说明一点——用以上代码来求取长时间序列遥感影像的像元平均值,对于任意一个像元,只要该像元在
任意一个时相
的图像中是无效值(即为
NoData
),那么该像元在最终求出的平均值
结果图中
,像素值也将会是无效值
NoData
。针对这一问题的解决,我们将在下一篇博客中介绍。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
大号在练葵花宝典
金牌会员
这个人很懒什么都没写!
楼主热帖
记一次MySql唯一索引在left join连表查 ...
鸿蒙系统架构分析
【大话云原生】微服务篇-五星级酒店的 ...
STM32F1与STM32CubeIDE编程实例-磁簧开 ...
2021年高教杯数学建模国赛C题的解题过 ...
国产开源体系openEuler_24.03_LTS摆设 ...
C# 使用dataGridView导入导出excel(NPO ...
GO实现Redis:GO实现内存数据库(3) ...
渗透测试过程参考
MySQL实战45讲 3
标签云
CIO
存储
服务器
快速回复
返回顶部
返回列表