Suite

Instruction conditionnelle imbriquée dans ArcGIS sur plusieurs rasters


J'ai une liste de rasters dans ArcGIS et je souhaite créer une instruction imbriquée conditionnelle (Con) basée sur tous les rasters de la liste. Je veux que cela soit réitéré à travers de nombreuses listes (le nombre de rasters dans les listes peut changer). Jusqu'à présent, j'ai trouvé un moyen non élégant de construire une chaîne, puis de la transmettre à la fonction exec, mais j'ai lu que l'utilisation de exec est fortement déconseillée. Une façon astucieuse de le faire ?

listRst = arcpy.ListRasters("*", "TIF") initString = "outCon = " pour rst dans listRst : rstString = " Con(( Raster("" + rst + "") > 0) & ( Raster( "" + rst + "") < 367), 1," initString = initString + rstString conString = initString + " 0" + ")"*len(listRst) exec (conString) outCon.Save("ConTest.tif ")

tu as raison çal'exécutifest mal vu et je pense que vous serez mieux adapté pour utiliser des tableaux etnumpypour résoudre votre problème que d'utiliser la calculatrice raster.

Je suppose que tous les rasters de votre liste ont le même nombre de lignes et de colonnes, car vous parlez de fusionner les résultats à la fin. Ce qui suit se traduira par :

  • 1 pour les cellules où aucun raster n'a de valeurs comprises entre 0 et 367 dans la cellule
  • 0 pour les cellules où au moins 1 des rasters a une valeur comprise entre 0 et 367 dans la cellule

Je suis à peu près certain que c'est ce que vous voulez.

Cette première section de code contient toutes les variables dont vous aurez initialement besoin :

#définir les valeurs inférieure et supérieure lower_break_value = 0 upper_break_value = 367 #get raster list, propriétés du premier raster pour créer out_raster_data pour contenir les résultats list_rasters = arcpy.ListRasters('*', "TIF") temp_raster = arcpy.Raster(list_rasters[ 0]) raster_rows = temp_raster.width raster_columns = temp_raster.height out_raster_data = numpy.ones((raster_columns, raster_rows), numpy.int) #dans votre question, vous ne faites référence qu'à des valeurs entières mais cela peut être modifié

La section suivante utilise une boucle sur les rasters de votre liste pour effectuer les opérations suivantes pour chaque raster :

  1. créer un tableau numpy à partir du raster
  2. utilisationnumpy.oùpour classer les valeurs supérieures à votrelower_break_value(0)
  3. utilisationnumpy.oùpour classer les valeurs qui sont inférieures à votreupper_break_value(367). numpy.oùne peut évaluer qu'une seule condition, nous devons donc la diviser en deux instructions distinctes.
  4. ajouter les deux tableaux résultants dunumpy.oùopérations. Tout ce qui remplit les deux conditions s'ajoutera à 0.
  5. créer unmasque_tempqui définit toutes les valeurs sur True qui ne sont pas égales à 0 et False qui sont égales à 0
  6. ajoutermasque_tempà une listeliste_bandes

    bands_list = [] pour i dans list_rasters : temp_array = arcpy.RasterToNumPyArray(i).astype(numpy.int) Greater_than = numpy.where(temp_array > lower_break_value, 0, temp_array) less_than = numpy.where(temp_array < upper_break_value, 0, temp_array) temp_result = supérieur_à + inférieur_à temp_mask = temp_result != 0 bands_list.append(temp_mask)

Dans la dernière partie du code, nous parcourons les tableaux masqués dansliste_bandeset multipliez-les parout_raster_dataqui n'est qu'un tableau de ceux-ci. Toute cellule de l'un des tableaux asters comprise entre 0 et 367 est un 0, donc lorsque nous la multiplions par les autres valeurs, cela donnera un 0 dansout_raster_data:

for i in range(0, len(bands_list)): out_raster_data *= bands_list[i] #convertir out_raster_data en un raster et enregistrer les résultats result_raster = arcpy.NumPyArrayToRaster(out_raster_data) result_raster.save(r") #entrer le chemin du raster en sortie ici


Voir la vidéo: Débuter en python. Instructions print, boucles for et instruction conditionnelle if (Octobre 2021).