Maison > Article > développement back-end > Comment Python ArcPy implémente l'épissage par lots d'images raster en série à long terme
Tout d’abord, clarifions les besoins spécifiques de cet article. Il existe un dossier qui stocke un grand nombre d'images de télédétection au format .tif
. Le nom de fichier de chaque image de télédétection contient l'heure d'imagerie de l'image, comme le montre la figure ci-dessous. .tif
格式遥感影像的文件夹,其中每一个遥感影像的文件名中都包含有该图像的成像时间,如下图所示。
我们希望,对于同一天成像的遥感影像进行拼接——例如,上图中具有2001
年第185
天成像的遥感影像10
幅,每一幅都是这一天在不同空间位置的成像;同时有2001
年第193
天成像的遥感影像10
幅。我们希望首先将第185
天成像的10
幅遥感影像加以拼接,随后再对第193
天成像的10
幅遥感影像加以拼接,以此类推。在遥感影像整体数量较少时,我们或许还可以逐一手动拼接;而当图像数量很多时,就需要借助代码来实现了。
明确了需求后,我们就可以开始具体的操作。首先,本文所需用到的代码如下。
# -*- coding: utf-8 -*- """ Created on Fri Apr 15 13:21:55 2022 @author: fkxxgis """ import os import arcpy tif_file_path="E:/LST/Data/NDVI/02_TIFF/" out_file_path="E:/LST/Data/NDVI/03_Mosaic/" arcpy.env.workspace=tif_file_path tif_file_name=arcpy.ListRasters("*","tif") tif_file_date=tif_file_name[0][1:8] one_day_tif_list=[] tif_file_example_path=tif_file_path+tif_file_name[0] cell_size_x=arcpy.GetRasterProperties_management(tif_file_example_path,"CELLSIZEX") cell_size=cell_size_x.getOutput(0) value_type=arcpy.GetRasterProperties_management(tif_file_example_path,"VALUETYPE") describe=arcpy.Describe(tif_file_example_path) spatial_reference=describe.spatialReference for tif_file in tif_file_name: if tif_file[1:8]==tif_file_date: one_day_tif_list.append(tif_file) tif_file_temp=tif_file if tif_file==tif_file_name[len(tif_file_name)-1]: out_file_name=tif_file[1:8]+".tif" arcpy.CreateRasterDataset_management(out_file_path,out_file_name, cell_size,"16_BIT_SIGNED",spatial_reference,"1") out_file=out_file_path+out_file_name for tif_file_new in one_day_tif_list: arcpy.Mosaic_management([tif_file_path+tif_file_new],out_file) else: out_file_name=tif_file_temp[1:8]+".tif" arcpy.CreateRasterDataset_management(out_file_path,out_file_name, cell_size,"16_BIT_SIGNED",spatial_reference,"1") out_file=out_file_path+out_file_name for tif_file_new in one_day_tif_list: arcpy.Mosaic_management([tif_file_path+tif_file_new],out_file) one_day_tif_list=[] one_day_tif_list.append(tif_file) tif_file_date=tif_file[1:8]
其中,tif_file_path
是原有拼接前遥感图像的保存路径,out_file_path
是我们新生成的拼接后遥感影像的保存路径。
在这里,我们需要首先在资源管理器中,将tif_file_path
路径下的各文件以“名称”排序的方式进行排序;随后,利用arcpy.ListRasters()
函数,获取路径下原有的全部.tif
格式的图像文件,并截取第一个文件的部分文件名,从而获取其成像时间;接下来,做好创建一个新的栅格文件的准备,这一部分代码的含义在本文开头提及的那一篇文章Python arcpy创建栅格、批量拼接栅格中已有提及,这里就不再赘述。
接下来,遍历tif_file_path
路径下全部.tif
格式图像文件。其中,我们通过一个简单的判断语句,来确定某一成像时间的遥感影像是否已经读取完毕——如果已经读取完毕,例如假如第185
天成像的10幅遥感影像都已经遍历过了,那么就对这十景遥感影像加以拼接;如果还没有读取完毕,例如假如第185
天成像的10幅遥感影像目前仅遍历到了第8幅,那么就不拼接,继续往下遍历。
这里相信大家也看到了为什么我们要在前期先将文件夹中的文件按照“名称”排序——是为了保证同一成像时间的所有遥感影像都排列在一起,遍历时只要遇到一个新的成像时间,程序就知道上一个成像时间的所有图像都已经遍历完毕了,就可以将上一个成像时间的所有栅格图像加以拼接。
最后,通过tif_file==tif_file_name[len(tif_file_name)-1]
Nous espérons assembler les images de télédétection prises le même jour - par exemple, l'image ci-dessus présente l'image de télédétection 10 prise le jour <code>185
de 2001
, chacune est une image de cette journée à un emplacement spatial différent ; il y a aussi des images de télédétection du 10<code>193
de l'année 2001
/code>cadre. Nous espérons d'abord assembler les 10
images de télédétection imagées le jour 185
, puis assembler les 1010 images imagées le <code> 193
jour. /code> les images de télédétection sont assemblées, et ainsi de suite. Lorsque le nombre total d’images de télédétection est faible, nous pouvons peut-être les assembler manuellement une par une, mais lorsque le nombre d’images est important, nous devons utiliser du code pour y parvenir.
rrreee Parmi eux, tif_file_path
est le chemin de sauvegarde de l'image de télédétection d'origine avant l'assemblage, et out_file_path
est le chemin de sauvegarde de notre image de télédétection nouvellement générée après l'assemblage.
tif_file_path
dans le gestionnaire de ressources par "name" ; puis utiliser la fonction arcpy.ListRasters( )
pour obtenez tous les fichiers image originaux au format .tif
sous le chemin, et interceptez une partie du nom de fichier du premier fichier pour obtenir son heure d'imagerie, puis effectuez la préparation à la création d'un nouveau fichier raster ; . La signification de cette partie du code a été mentionnée dans l'article Python arcpy pour créer des rasters et des rasters d'épissage par lots mentionné au début de cet article, je n'entrerai donc pas dans les détails ici.
.tif
sous le chemin tif_file_path
. Parmi eux, nous utilisons une simple déclaration de jugement pour déterminer si les images de télédétection à un certain moment d'imagerie ont été lues - si elles ont été lues, par exemple, si les 10 images imagées le jour 185
Toutes des images de télédétection ont été parcourues, alors ces dix images de télédétection seront fusionnées si la lecture n'est pas terminée, par exemple, si les 10 images de télédétection imagées le jour 185
sont actuellement transmises au 8ème image, alors il n'y aura pas d'épissage et le parcours continuera. 🎜🎜Je crois que tout le monde ici a également compris pourquoi nous devons trier les fichiers dans le dossier en fonction du « 🎜nom🎜 » au début - pour garantir que 🎜toutes les images de télédétection au même moment d'imagerie sont disposées ensemble🎜, lorsque traversée Tant qu'il rencontre un 🎜nouveau temps d'imagerie🎜, le programme saura que toutes les images du 🎜temps d'imagerie précédent🎜 ont été parcourues, et il peut fusionner toutes les images raster du 🎜temps d'imagerie précédent🎜. 🎜🎜Enfin, utilisez le jugement de tif_file==tif_file_name[len(tif_file_name)-1]
pour confirmer si le 🎜dernier 🎜fichier image du dossier a été parcouru. Si tel est le cas, vous devez assembler toutes les images à l'heure d'imagerie actuelle🎜 et terminer l'exécution du code. 🎜🎜Exécutez le code dans 🎜IDLE (interface graphique Python)🎜. Une fois le code exécuté, jetons un œil au dossier des résultats. On peut voir que les images sont déjà assemblées séparément en fonction du temps d'imagerie. 🎜🎜🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!