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

news2024/11/20 13:19:43

  本文介绍基于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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网工交换基础——Qinq技术

一、Qinq的概述 QinQ(802.1Q-in-802.1Q),也叫做VLAN Stacking或Double VLAN,由IEEE 802.1ad标准定义,是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的目…

面试:JVM垃圾回收

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

Oracle数据库的AI能力分析,释放企业数据价值

解锁Oracle数据库的AI潜力 Oracle数据库提供了一系列的AI能力,旨在帮助企业和开发者更高效地利用人工智能技术。以下是Oracle数据库AI能力的一些关键点:1. AI向量相似性搜索:Oracle Database 23c引入了AI Vector Search功能,该功…

2024/4/25 C++day3

#include <iostream> using namespace std; class Person //Person类 {string name; //两个私有属性变量name&#xff0c;ageint age;public: //一个公有属性指针变量&#xff0c;一个无参构造函数&#xff0c;一个有参构造函数&#xff0c;一个sho…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

msf抓取hashdump的思考

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 2. 我们通过hashdump 抓取出 所有用户的密文&#xff0c;分为两个模块&#xff0c;为什么&#xff1f; 这两个模块分别都代表…

架构师系列-消息中间件(九)- RocketMQ 进阶(三)-消费端消息保障

5.2 消费端保障 5.2.1 注意幂等性 应用程序在使用RocketMQ进行消息消费时必须支持幂等消费&#xff0c;即同一个消息被消费多次和消费一次的结果一样&#xff0c;这一点在使用RoketMQ或者分析RocketMQ源代码之前再怎么强调也不为过。 “至少一次送达”的消息交付策略&#xff…

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

详解Qt中的鼠标事件

在Qt中&#xff0c;处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数&#xff0c;允许开发者捕获鼠标的各种动作&#xff0c;如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项&#xff0c;并附带C代码示例。 基础使用方法…

Node.js 22 发布,原生支持 WebSocket 客户端

昨日&#xff0c;Node.js 官方博客正式宣布 Node.js 22 的发布&#xff01;新版本亮点包括 require() ES 模块、WebSocket 客户端、V8 JavaScript 引擎的更新等&#xff01; Node.js 22 将在 10 月进入长期支持 (LTS)&#xff0c;但在此之前&#xff0c;它将是接下来六个月的 …

问题-MySQL将较大的SQL文件导入MySQL

迁移数据的时候&#xff0c;我们有时候会用sqlyog等数据库工具导入到新数据库。可能插入的SQL语句太大&#xff0c;出现导入一半失败的情况。明明代码没错&#xff0c;这让人摸不着头脑。 对于大文件导入&#xff0c;有几种方法&#xff1a; 方法1&#xff1a;使用命令行&…

总体设计(下)

启发规则 描绘软件结构的图形工具 面向数据流的设计方法

暴雨亮相CCBN2024 助力广电行业数智化转型

4月23日&#xff0c;第三十届中国国际广播电视信息网络展览会&#xff08;简称CCBN2024&#xff09;在北京开展&#xff0c;本次展览会由国家广播电视总局指导、广播电视科学研究院主办&#xff0c;作为国内广电视听领域首个综合性、专业化、引领性、国际化科技产业盛会&#x…

搭建强化学习的机械臂MuJoCo环境以及urdf转xml文件方法

一、背景 基于强化学习的机械臂应用日趋广泛&#xff0c;摆脱了基于模型到达固定点的束缚。基于强化学习算法&#xff0c;机械臂可以完成拧魔方、推抓任务&#xff08;Andy Zeng的经典论文&#xff09;&#xff0c;暂且想一下如果用传统方法完成此类复杂任务是何等困难。 强化…

Chisel 入门(2)运算符

Chisel 入门(2) 运算符 逻辑运算符 ChiselExplanationwidth!x逻辑非1x && y逻辑与1x||y逻辑或1 位操作运算符 ChiselExplanationwidthin Verilog~x位反w(x)~ signal_xx & y位与max(w(x), w(y))signal_x & signal_yx | y位或max(w(x), w(y))signal_x | sign…

操作系统:进程间通信 | System V IPC

目录 前言&#xff1a; 1.共享内存 1.1.什么是共享内存 1.2.共享内存使用接口 shmget函数 shmat函数 shmdt函数 shmctl函数 2.共享内存实现通信 2.1.代码实现 comm.hpp server,cpp client.cpp 2.2.共享内存的缺点 2.3.实现通信的同步化 2.4共享内存通信的优势 3.…

Nginx下载安装,什么是nginx,什么是反向代理,Windows下、linux下安装nginx(保姆级教程)

文章目录 一、Nginx简介为什么要使用NginxNginx的特点Nginx的相关概念正向代理反向代理动静分离负载均衡 二、Nginx安装1. Windows安装2. Linux安装 一、Nginx简介 Nginx 是一个高性能的 HTTP&#xff08;静态资源服务器&#xff09; 和 反向代理 Web 服务器。 为什么要使用N…

【以奖代补】诗情画意润童心 书香课堂志愿行

中华古诗词历史源远流长&#xff0c;名篇佳作数不胜数。为弘扬民族文化精髓&#xff0c;丰富乡村儿童假期生活。2024年4月21日上午&#xff0c;襄州区社会工作者协会联合襄州区张家集镇社工站、张集村“童叟乐园”志愿服务队在张集村开展“诗情画意润童心 书香课堂志愿行”志愿…

数据库安全如何保障?YashanDB有妙招(上篇)

数据库作为信息系统的核心&#xff0c;不仅承载着海量的关键数据&#xff0c;还负责向各类用户提供高效、可靠的信息服务&#xff0c;数据库的安全性显得尤为关键&#xff0c;已成为信息安全体系的重中之重。 什么是数据库安全&#xff1f; 数据库安全是数据安全的一个子集&…

Linux——界面和用户

本篇文章所写的都是基于centos 7 64位&#xff08;通过虚拟机运行&#xff09;。 一、Linux的界面 Linux操作系统提供了多种用户界面&#xff0c;主要分为图形用户界面&#xff08;GUI&#xff09;和命令行界面&#xff08;CLI&#xff09;。 1、图形用户界面(GUI)&#xff…