Python依据遥感影像的分幅筛选出对应的栅格文件

python · 浏览次数 : 2

小编点评

**代码功能:** 1. 读取属性表中的遥感影像分幅条带号。 2. 遍历所有遥感影像文件,筛选出与属性表中分幅条带号匹配的遥感影像文件。 3. 将筛选出的遥感影像文件复制到一个新的结果文件夹中。 4. 创建多个子文件夹,每个子文件夹表示一个分幅条带号,并将该分幅条带号对应的遥感影像文件放入该子文件夹中。

正文

  本文介绍基于Python语言,结合已知研究区域中所覆盖的全部遥感影像分幅条带号,从大量的遥感影像文件中筛选落在这一研究区域中遥感影像文件的方法。

  首先,先来明确一下本文所需实现的需求。现已知一个研究区域(四川省),且已知覆盖这一研究区域所需的全部遥感影像的分幅条带号(这里就以Sentinel-2数据所采用的分幅规则为例来介绍),如下图所示。

image

  其中,矢量图层上的标签Label)就是所需的遥感影像的分幅条带号;且这一矢量要素的属性表中,有具体每一个分幅条带号的具体字段(如上图红色方框所示的那一列)。

  同时,我们还下载好了大量的遥感影像——这些遥感影像数量众多,既有位于这一研究区域内的遥感影像,同时还有位于研究区域外的。其中,这里所有的遥感影像都保存在一个大文件夹下,而这一大文件夹下还有多个子文件夹,具体遥感影像就存在于子文件夹中;如下图所示。

  其中,红色框内的文件夹即为前述“大文件夹”,紫色框内的每一个文件夹即为前述“子文件夹”。此外,每一个子文件夹的命名也是和遥感影像的分幅条带号对应的,比如43LCC这一个子文件夹就是保存了UTM编号为43的网格内的全部遥感影像。这里关于Sentinel-2遥感影像分幅条带号的介绍,如果大家有需要,可以参考哨兵2号Sentinel-2分幅条带介绍与MGRS网格矢量文件获取这篇文章。

  同时,在每一个遥感影像文件文件名中,都有分幅条带号这一字段;例如,打开43LCC这一子文件夹,如下图所示。

  我们希望实现的,就是基于上图所示的研究区域内遥感影像的分幅条带号信息,在大量的遥感影像中筛选出这些分幅对应的遥感影像文件,并将其通过复制的方式放入到一个新的结果文件夹中。

  了解了具体需求,我们就可以开始代码的撰写。首先,本文所需的完整代码如下所示。

# -*- coding: utf-8 -*-
"""
Created on Fri Feb  3 18:33:11 2023

@author: fkxxgis
"""

import os
import xlrd
import shutil

xls_file = r"E:\02_Project\Sentinel.xls"
tif_path = r"G:\S2_CSI_LCC_product\LCC_10days_2020"
result_path = r"G:\Select"

book = xlrd.open_workbook(xls_file)
sh = book.sheet_by_index(0)
row_num = sh.nrows

for row in range(1, row_num):
    mgrs = sh.cell(row,6).value
    utm = mgrs[0:2]
    for root, dirs, files in os.walk(tif_path):
        for name in dirs:
            if name[0:2] == utm:
                for root_1, dirs_1, files_1 in os.walk(os.path.join(root, name)):
                    for name_1 in files_1:
                        if name_1.find(mgrs) != -1:
                            if not os.path.exists(os.path.join(result_path, mgrs)):
                                os.makedirs(os.path.join(result_path, mgrs))
                                print("Make " + mgrs + " path.")
                            shutil.copy(os.path.join(root, name, name_1), os.path.join(result_path, mgrs, name_1))

  其中,我们需要导入osxlrdshutil3Python库,分别实现系统文件遍历、Excel数据读取与研究区域内遥感影像数据的复制。其中,关于xlrd库的配置,如果大家是用的Anaconda环境,可以参考Python表格处理模块xlrd在Anaconda中的安装这篇文章。此外,我们首先需要将本文开头提及的表示遥感影像数据分幅条带号的矢量文件的属性表导出(通过“System Toolboxes”→“Conversion Tools.tbx”→“Excel”→“Table To Excel”选项,如下图所示),保存为.xls格式的表格文件,从而方便我们后期代码对数据的读取。

  在代码中,xls_file表示我们将属性表导出后得到的.xls格式的表格文件,tif_path表示存放所有遥感影像的大文件夹,result_path则表示找到我们所需的结果遥感影像文件后,希望将其复制到的路径。

  随后,我们通过xlrd.open_workbook()函数打开.xls格式的表格文件,读取其中的数据并获取其行数row_num;接下来,我们即可对这一表格文件的单元格数据加以遍历,也就是代码中的第1for循环——我们从第2行开始(因为第1行是表头),读取每一行第7列的数据(也就是存放有遥感影像分幅条带号的那一列),从而依次获取所需的遥感影像条带号。

  接下来,由于遥感影像的分幅条带号的前两位,以及前述子文件夹名称的前两位,都是表示UTM编号的两位数字,因此我们通过utm = mgrs[0:2]这句代码,截取当前遥感影像分幅条带号的前两位,并通过os.walk()函数进行遍历,通过一个if判断语句找到大文件夹下对应的子文件夹;随后,在这一子文件夹中同样通过os.walk()函数,进行遥感影像文件的遍历——也就是代码中第2个、第3个、第4for循环所做的事情。

  接下来,针对遍历得到的子文件夹中每一个遥感影像文件,我们通过.find()函数找到所有满足这一分幅条带号的遥感影像文件,也就是代码中第5for循环与第2if判断语句的工作。找到符合当前分幅条带号的遥感影像文件后,我们即可开始将其复制到目标文件夹中。

  这里还有一个需求,因为我们这里保存的是多时相遥感影像数据(即每一个分幅条带号对应着多个不同时相的遥感影像文件),因此我们希望在目标文件夹中,同样用各个分幅条带号作为名称,创建多个子文件夹;然后将当前分幅条带号对应的全部遥感影像数据放入这一文件夹中。基于此,我们通过os.path.exists()函数判断是否存在指定的子文件夹,如果不存在的话就新建这一文件夹;随后,通过shutil.copy()函数复制这些遥感影像文件。

  运行上述代码,最终我们得到的结果如下图所示;其中,每一个子文件夹都表示一个分幅条带号,子文件夹内即为这一分幅条带号所对应的全部时相的遥感影像文件。

  至此,大功告成。

与Python依据遥感影像的分幅筛选出对应的栅格文件相似的内容:

Python依据遥感影像的分幅筛选出对应的栅格文件

本文介绍基于Python语言,结合已知研究区域中所覆盖的全部遥感影像的分幅条带号,从大量的遥感影像文件中筛选落在这一研究区域中的遥感影像文件的方法~

Python ArcPy批量拼接长时间序列栅格图像

本文介绍基于Python中ArcPy模块,对大量不同时相的栅格遥感影像按照其成像时间依次执行批量拼接的方法~

[转帖]Docker:Python环境Docker镜像瘦身

https://www.jianshu.com/p/c0ad13e0be85 关键字:Docker,Python 原始镜像 封装一个Python 3.7的环境并且安装Python依赖包实现一个机器学习算法预测任务,Dockerfile如下 FROM python:3.7 MAINTAINER xxx

[转帖]KeenTune(轻豚)

Dependencies 安装python3运行环境 yum install python36 python36-devel pip3 install --upgrade pip 安装python依赖包 pip3 install hyperopt==0.2.5 pip3 install numpy=

Python:灵活的开发环境

如果你接手了别人的代码工程,却发现对方使用的 python 版本或者依赖库都和你的环境不兼容时,怎么办?打算卸掉自己原来的那一套环境再重来吗?真麻烦!

python | 连接数据库

介绍一些python中用于连接常用数据库的依赖库。 SQLite3 SQLite3是Python 中自带的数据库模块,适用于小型应用和快速原型开发。 SQLite是一个进程内的库,实现了自给自足的、无服务器的、是非常小的,是轻量级的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,不需要在系统

[转帖]linux下python环境安装缺少库, The necessary bits to build these optional modules were not found

每次linux安裝python 環境,总是遇到缺少相关依赖的问题,安装一次查一次,醉醉的,这次还是做个备忘吧。 在centos 安装 缺少库名称安装命令_uuidyum install libuuid-develreadlineyum install readline-devel_tkinteryu

Python 霸榜的一周,又有什么新 AI 力作呢?「GitHub 热点速览」

GPT 带火了一波语言模型,LLaMA 和 Alpaca 也在持续发力。依旧是各类 GPT 后缀霸榜 GitHub trending 的一周,为此特推部分专门收录了两个比较不错的 GPT 应用。而作为 ML/AI 第一首选语言的 Python 也是风头一时,除了 AI 项目之外,本周的密文解析 Ci

[转帖]Python安装模块(包/库)的方法

这里写目录标题 通过pip安装正常在线安装pip命令补全更改下载镜像 离线包安装库的下载库的安装whl的安装.tar.gz的安装源码安装 本地安装报错(依赖) Pycharm中安装手动安装终端命令行安装 Jupyter notebook中安装Python库 通过pip安装 pip是python的一个

Python如何在日志中隐藏明文密码

Python如何在日志中隐藏明文密码 前言 在项目开发中,有的时候会遇到一些安全需求,用以提升程序整体的安全性,提高外来非法攻击的门槛,而在日志中隐藏明文密码打印便是最典型的安全需求之一。 在Python中,明文密码往往发生于命令执行参数、debug日志、依赖库打印等场景中。对于程序自身的明文密码打