Python中ArcPy按照分幅条带与成像日期拼接每个8天间隔内的遥感影像

  本文介绍基于Python中的ArcPy模块,将大量遥感影像文件按照分幅条带编号成像时间加以分组,并将同一分幅的遥感影像加以每个8天时间间隔内的镶嵌拼接的方法。

  首先,来看一下本文具体的需求。我们现有一个文件夹,其中含有大量的.tif格式的遥感影像,如下图所示。首先,每一景遥感影像的文件名中,都有一个表示成像时间的字段;例如,下图中从上往下数第1景图像,就是2022年第001天某时刻的遥感影像,而下图中从上往下数第4景图像,就是2022年第013天某时刻的遥感影像。

  同时,这些遥感影像文件的文件名顺序还不完全是时间顺序,因为其文件名开头还有一些表示其他含义的字段(如传感器名称),而这些不同字段对应的遥感影像文件同样具有多个成像时间。如下图所示,可以看到在GF1WFV3传感器对应的2022346天遥感影像结束后,新的GF1WFV4传感器对应的遥感影像又是从2022年的开头开始的。总之,就是不能将文件名排序作为遥感影像成像时间的顺序

  其次,如下图所示,每一景遥感影像的文件名中还有一个表示遥感影像分幅的字段;其中,48STA48STB等都是不同分幅对应的编号。

  我们希望实现的是,从2022年第001天开始,到第365天结束,对于每1分幅,将其每18天时间范围内的所有遥感影像(无论是来自哪一个传感器)拼接在一起。例如,将分幅为48STA的、成像时间在001天至008天的遥感影像拼接在一起,然后将009天至016天的拼接在一起,以此类推,直到2022年所有分幅为48STA的遥感影像处理完成;随后再处理48STB的,再以此类推,直到全部分幅都处理完成。

  在之前的文章Google Earth Engine谷歌地球引擎GEE批量计算一年中每个指定天数范围内遥感影像平均值的方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/135447348)中,我们介绍过在GEE中计算每18天时间间隔内遥感影像数据平均值的方法;而这一次我们将基于Python,将每18天时间间隔内遥感影像拼接起来。

  本文所用到的代码如下。

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 13 22:44:34 2024

@author: fkxxgis
"""

import re
import os
import arcpy

arcpy.env.workspace = r"F:\Data_Reflectance_Rec\GF\2022"
output_folder = r"F:\Data_Reflectance_Rec\GF\8Days_frame\2022"

image_list = arcpy.ListRasters("*", "tiff")
image_list.sort()

image_dict = {}


for image in image_list:
    match = re.search(r"\d{7}", image)
    image_date = match.group()
    image_year = image_date[0:4]
    image_days = image_date[-3:]
    match = re.search(r"\.(.{5})\.", image)
    image_frame = match.group().strip(".")
    dict_idx = (int(image_days) - 1) / 8
    dict_key = str(dict_idx) + "/" + image_frame
    if dict_key in image_dict:
        image_dict[dict_key].append(image)
    else:
        image_dict[dict_key] = [image]
    print image, "is in", dict_key

for dict_idx, image_list_interval in image_dict.items():
    dict_idx_split = dict_idx.split("/")
    days = int(dict_idx_split[0]) * 8 + 1
    frame = dict_idx_split[1]
    
    template_image = image_list_interval[0]
    cell_size = arcpy.GetRasterProperties_management(template_image, "CELLSIZEX")
    value_type = arcpy.GetRasterProperties_management(template_image, "VALUETYPE")
    describe = arcpy.Describe(template_image)
    spatial_reference = describe.spatialReference
    
    arcpy.CreateRasterDataset_management(output_folder,
                                         image_year + str(days).zfill(3) + "_" + frame + ".tif",
                                         cell_size.getOutput(0),
                                         "16_BIT_UNSIGNED",
                                         spatial_reference,
                                         4)
    print image_year + str(days).zfill(3) + "_" + frame + ".tif", "creation finished."
    
    try:
        arcpy.Mosaic_management(image_list_interval,
                                os.path.join(output_folder, image_year + str(days).zfill(3) + "_" + frame + ".tif"),
                                "MINIMUM",
                                background_value = 0,
                                nodata_value = 0)
        # arcpy.MosaicToNewRaster_management(image_list_interval,
        #                                    output_folder,
        #                                    image_year + str(days).zfill(3) + "_" + frame + ".tif",
        #                                    pixel_type = "16_BIT_UNSIGNED",
        #                                    number_of_bands = 4,
        #                                    mosaic_method = "MINIMUM")
        print image_year + str(days).zfill(3) + "_" + frame + ".tif", "mosaic finished."
    except arcpy.ExecuteError:
        print image_year + str(days).zfill(3) + "_" + frame + ".tif", "had ERROR."

  其中,上述代码的具体含义如下。

  首先,我们通过import语句导入所需的模块。其中,re用于正则表达式匹配,os用于文件路径操作,arcpyArcGISPython模块,用于处理GIS数据。

  随后,我们通过env.workspace设置工作空间,即等待拼接的栅格影像数据所在的文件夹路径;通过output_folder设定输出结果的文件夹路径。

  接下来,基于ListRasters("*", "tiff")获取待拼接的所有.tif格式栅格文件,并将其排序后存储在image_list列表中;image_dict是一个字典,用于存储栅格影像按日期分幅号进行分组的结果,从而将每1种分幅中,处于同18天时间间隔的遥感影像放在一起;for循环遍历image_list中的每个影像文件,并使用正则表达式re.search提取影像文件名中的日期信息——其中,需要提取年份image_year和天数image_days;接下来,使用正则表达式re.search提取影像文件名中的分幅号信息,并根据天数分幅号生成字典的键dict_key;随后,将影像文件添加到相应的字典值中,如果字典键已存在,则将影像文件添加到对应的列表中。同时,打印信息,指示影像文件属于哪个字典键。

  再次,for循环遍历image_dict中的每个字典键和对应的影像文件列表——首先拆分字典键,获取天数分幅号的信息;接下来,获取文件列表中第一个影像文件的信息,如像元大小、值类型、空间参考等(因为后期需要基于其来作为模板图像);随后,使用CreateRasterDataset_management()函数创建输出栅格数据集,命名规则为年份+天数+分幅号。同时,打印信息,指示栅格数据集创建完成。

  最后,即可使用Mosaic_management()将影像文件列表拼接为一个栅格数据集,命名规则同上;同时,打印信息,指示栅格数据集拼接完成。如果拼接过程中出现错误,则捕获arcpy.ExecuteError异常,并打印错误信息。这里之所以需要tryexcept语句,是因为有的8天时间间隔内可能没有任何遥感影像数据,因此Mosaic_management()函数可能会报错,导致程序终止运行。关于tryexcept语句的具体用法,大家参考Python异常处理try与except跳过报错使得程序继续运行的方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/137552214)即可。

  运行上述代码,首先将看到如下图所示的界面;表示正在基于遥感影像的文件名,将其放置到不同的字典中——这个字典就是根据遥感影像成像时间分幅号来表示的。

  完成字典的确定后,相同分幅号且落在同18天时间间隔内的遥感影像数据,即可被存入同1个字典中。接下来,即可开始拼接;如下图所示。

  完成上述代码运行后,即可在结果文件夹中看到按照分幅号成像时间拼接好的遥感影像了。因为我这里当初把2022年的拼接结果误删了,所以就截取2021年的数据经过上述代码处理后的结果,如下图所示。可以看到,结果已经是按照每个8天的时间间隔、以及每1种分幅号拼接好的了。

  至此,大功告成。

欢迎关注:疯狂学习GIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/574417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置有效的防爬虫技术保护网站

本文主要介绍了防爬虫的概念、目的以及一些有效的防爬虫手段。防爬虫是指网站采取各种技术手段阻止爬虫程序对其数据进行抓取的过程。为了保护网站的数据和内容的安全性,防止经济损失和恶意竞争,以及减轻服务器负载,网站需要采取防爬虫机制。…

NIKKE胜利女神妮姬1.5周年(PC)怎么注册?账号注册教程一看就懂

游戏的世界观了一些轻科幻、末世和废土背景,剧情中也探讨了一些深刻的主题,比如NIKKE的人权问题。虽然整体剧情表现得连贯,但本质上有一些俗套情节,特别是在序章的玛丽安之死后,剧情逐渐失去了原有的紧张感&#xff0c…

那些你不知道的数据库知识:行式存储和列式存储

前几天听课,听到老师讲数据列式存储。 我🙋🏻‍♀️:等等,what,什么列式存储,数据一行一行的展示,然后一行一行的存在数据库里面不就好了,什么叫做列式存储,…

rust中结构体的属性默认是不能修改的,要想修改可以有两种方式

Rust中结构体里面的属性默认是不支持修改的,而且默认不是pub的,要想修改的话,有两种方式,我以为和python里面的类似呢,但是还是需要一点技术含量的。如果想在引到外部修改,需要声明pub,如果想在…

专利视角下的量子竞赛:《2024全球专利格局白皮书》

2024年1月,欧洲量子产业联盟(QuIC)发布了题为《全球量子技术专利格局描述》的综合白皮书。 该文件以透明的视角展示了当今的知识产权格局,包括知识产权持有人的地理分布。该文件由 QuIC 知识产权(IP)与贸易…

【C++】图的存储 -- 邻接表

目录 邻接表的创建使用dfs遍历图dfs遍历图的递归思想 邻接表的创建 #include <iostream> using namespace std; #include <vector>struct edge//创建边集类型 {int v;//出边int w;//权值 }; const int N 100010;//顶点数量 vector<edge> e[N];//邻接表int m…

淘宝新店有流量扶持吗

淘宝新店有流量扶持 淘宝新店需要做些推广提高店铺权重 淘宝新店用3an推客做推广比较好 3an推客是给商家提供的营销工具&#xff0c;3an推客CPS推广模式由商家自主设置佣金比例&#xff0c;以及设置商品优惠券&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最…

初步认识泛型

文章目录 泛型的编译擦除机制 泛型的上界泛型方法 泛型的编译 擦除机制 泛型到底是怎么编译的&#xff1f;这个问题&#xff0c;也是曾经的一个面试问题。泛型本质是非常难的语法 通过命令&#xff1a;javap -c 查看字节码文件&#xff0c;所有的T都是Object。 在编译的过程当…

“量子谷”启程!数亿资金注入,加速量子、人工智能创新

2024年4月23日&#xff0c;欧洲委员会启动了新一轮“地平线欧洲”&#xff08;Horizon Europe&#xff09;项目征集&#xff0c;动用资金总额超过1.12亿欧元&#xff08;约8.67亿人民币&#xff09;。此次征集活动主要面向人工智能&#xff08;AI&#xff09;与量子技术领域的前…

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除&#xff08;已废弃&#xff09; 找到根对象&#xff08;局部变量正在引用的对象、静态变量正在引用的对象&#xff09;&#xff1b;沿着根对象的引用链&#xff0c;查看当前的对象是否被根对象所引用&#xff0c;若被引用&#xff0c;则加上…

redis和mysql数据一致性方案

请求 A 更新数据 请求B读数据 在高并发情况下&#xff0c;A、B请求过程步骤相互穿插&#xff0c;就会出现图中的问题。 期望redis 的数据是11&#xff0c;最后变成了10 场景&#xff1a;先删除Redis&#xff0c;再更新 MySQL&#xff0c;不主动更新Redis&#xff0c;访问redi…

软件企业质量保证的基石――QA,QC的良性协作

软件企业质量保证的基石――QA、QC的良性协作 国内的软件产业发展了20多年的时间&#xff0c;已经由个人英雄时代步入到中、小团队协作时代。相信不久的将来&#xff0c;国内一定会出现航母级的软件企业&#xff0c;那时候我们会迎来集团军作战的时代。不同的时代表明软件规模…

【AI相关】数学和统计学知识

数学和统计学的知识可以分为两部分&#xff1a; 一部分是线性代数中的基础概念&#xff0c;比如标量、向量和张量。 另一部分是概率统计中常见的分布类型&#xff0c;比如正态分布和伯努利分布。 线性代数 什么是标量&#xff1f; 标量是一个单独的数&#xff0c;可以是整…

PLC基本原理及其接线

目录&#xff1a; 一、PLC的简介与起源 二、PLC的基本结构 1、MCU模块 2、输入与输出模块 3、电源模块 4、编程设备 三、PLC的外部接线 1、PNP与NPN接线 2、三菱PLC的NPN与PNP设置 下续&#xff1a;三菱FX系列PLC-编程1 一、PLC的简介与起源 1、PLC简介 PLC的全称为…

Prompt之美:如何设计提示词让大模型变“聪明”

目录 一. Prompt关键要素 二. Prompt技巧 三. 实战中的Prompt优化 四. 参考文献 一. Prompt关键要素 Prompt是一个简短的文本输入&#xff0c;用于引导AI模型生成特定的回答或执行特定任务。换句话说&#xff0c;Prompt是你与AI模型沟通的方式。一个好的Prompt可以让AI更准…

猫头虎分享已解决Bug || **Error: ‘Promise‘ is undefined**

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【SpringBoot】00 Maven配置及创建项目

一、Maven配置 1、下载Maven 进入官网下载&#xff1a;Maven – Welcome to Apache MavenMaven – Download Apache Maven 本文以最新版为例&#xff0c;可按需选择版本 Maven – Welcome to Apache Maven 2、解压下载好的安装包 将安装包解压到自己设置的空文件夹中 3、…

抽象的代理模式1.0版本

前言&#xff1a; 在阅读Spring Security官方文档时&#xff0c;里面设计到了一种设计模式——代理模式Proxy 众里寻她千百度&#xff0c;蓦然回首&#xff0c;那人却在灯火阑珊处 开始 在之前的文章里陈述了一个观点——编程语言和语言没有区别 现看看我们日常生活中的代理…

利用 easycode 自动生成 数据库表 对应 类文件

1、安装easycode 打开settings&#xff0c;在plugins中搜索easycode进行安装&#xff0c;安装完成后重启idea。 2、连接数据库 连接数据库&#xff0c;填写数据库配置信息 点解Test connetction测试连接&#xff0c; 3、生成文件 右键数据库表格&#xff0c;生成对应文件 4…

说方法不如传授经验向媒体投稿你可以这样

在信息爆炸的时代,作为单位的信息宣传员,肩负着将本单位的重要资讯、活动成果、政策解读等内容有效传播至公众视野的重任。其中,向各类媒体投稿无疑是实现这一目标的重要途径。然而,传统的邮件投稿方式常常让我深感力不从心,费时费力不说,成功率低、出稿慢等问题更是让我和领导…