Suite

Obtenir la valeur de la cellule le long de la direction du flux à l'aide d'ArcPy ?

Obtenir la valeur de la cellule le long de la direction du flux à l'aide d'ArcPy ?


J'ai:

  • un raster de direction de flux où j'ai décollé (valeur NoData attribuée) les cellules qui recouvraient le réseau fluvial (à partir de l'accumulation de flux).
  • un raster parfaitement chevauchant où j'ai attribué une valeur de coefficient aux cellules (sauf celles chevauchant le réseau fluvial)

Je dois calculer un indice pour chaque cellule de mon raster qui est calculé comme la moyenne entre la valeur du coefficient de la cellule et celles de toutes les cellules entre la première et le réseau fluvial, le long de la direction d'écoulement.

Pour mieux expliquer : Commençons par une cellule, qui a sa valeur de coefficient (c1) et a un raster de 8 dans le sens du flux. Je veux choisir la valeur du coefficient et "déplacer" vers la cellule sud-ouest (c'est la suivante le long de la direction du flux). Ensuite, je veux choisir sa valeur de coefficient (c2), voir dans le raster FlowDirection qui est la cellule suivante et m'y déplacer, pour choisir sa valeur de coefficient (c3)… et ainsi de suite jusqu'à ce que je trouve une cellule avec NoValue (réseau fluvial).

Ensuite, je dois calculer la moyenne entre ces valeurs et attribuer le résultat, dans un nouveau raster, à la cellule de début

(c1+c2+… cn)/n


J'ai utilisé un modèle d'altitude rempli (avec les ruisseaux supprimés) pour reproduire vos coefficients :

En gardant à l'esprit que l'eau coule généralement en descente :), il est raisonnable de s'attendre à ce que toutes les valeurs en sortie soient inférieures ou égales à la valeur au point de départ. J'ai vérifié les résultats en utilisant la différence [Filled]-[ScriptOutput] et j'ai trouvé que le script (voir ci-dessous) a échoué (produit des valeurs légèrement négatives) pour 2 des 63414 cellules. Les deux points sont assis sur des sites très plats à côté de « cours d'eau ». Il s'agit cependant d'une nature de l'algorithme de direction du flux, appelé estimation de la direction la plus probable…

Scénario:

importer arcpy, os, traceback, sys, numpy depuis arcpy importer env depuis arcpy.sa import * env.overwriteOutput = True fdir=r'D:Scratchfdir1' coeffs=r'D:Scratchfill1' try: def showPyMessage() : arcpy.AddMessage(str(time.ctime()) + " - " + message) dirArray = arcpy.RasterToNumPyArray(fdir,"","","",-9999) coefArray = arcpy.RasterToNumPyArray(coeffs ,"","","",-9999) blankArray=coefArray nRows,nCols=dirArray.shape cellsTotal=nCols*nRows d=arcpy.Describe(fdir) origin=d.extent.lowerLeft cSize=arcpy.Raster(fdir ).meanCellHeight ## directions pour trouver la cellule voisine fDirs=(1,2,4,8,16,32,64,128) dCol=(1, 1, 0, -1, -1,-1, 0,1) dRow =(0, -1, -1, -1, 0, 1, 1,1) ## dRow inversé=(0, 1, 1, 1, 0, -1, -1,-1) ## boucle principale arcpy.SetProgressor("step", "", 0, cellsTotal) pour nRow dans la plage (nRows): pour nCol dans la plage (nCols): arcpy.SetProgressorPosition() S=coefArray[nRow,nCol] if S==-9999 :continue tot,m,nR,nC=S,1,nRow,nCol tant que True : direction=dirArray[nR,nC] i=fDirs.index(direction) dX=dCol[i];nC+=dX si nC<0 ou n C==nCols : break dY=dRow[i];nR+=dY si nR<0 ou nR==nRows : break S=coefArray[nR,nC] si S==-9999:break tot+=S;m+=1 tot=tot/m blankArray[nRow,nCol]=tot myRaster = arcpy.NumPyArrayToRaster(blankArray,origin,cSize,cSize) oneGrid=Con(myRaster<>-9999,myRaster) oneGrid.save(r'D:Rubbish avers') del dirArray,coefArray,blankArray sauf : message = "
*** PYTHON ERRORS *** " ; showPyMessage() message = "Informations de suivi Python : " + traceback.format_tb(sys.exc_info()[2])[0] ; showPyMessage() message = "Informations d'erreur Python : " + str(sys.exc_type)+ " : " + str(sys.exc_value) + "
" ; showPyMessage()

Vous devrez remplacer 3 lignes de code, pointant vers la direction du flux d'entrée, le coefficient et les noms de raster en sortie.

A noter aussi qu'il est lent, il a fallu 2 minutes pour traiter 234*271 raster sur ma plutôt bonne machine. Script conçu pour s'exécuter à partir d'Arcmap (User toolbox-Add-Script). Si vous voulez qu'il fonctionne de manière autonome, remplacez arcpy.AddMessage par l'instruction print. Les instructions de progression peuvent également ne pas fonctionner. Il suffit de les supprimer. Le script peut être facilement modifié pour toutes sortes d'études, par ex. distance de sortie d'avalanche…

Des questions, faites le moi savoir. Merci pour la bonne question. Quel genre de coefficients, s'il vous plaît ? Rugosité?


Essaye ça:

# Importer le module arcpy import arcpy # Vérifier toutes les licences nécessaires arcpy.CheckOutExtension("spatial") # Variables locales : c1 = "F:img1.tif" c2 = "F:img2.tif" c3 = "F :img3.tif" output = "F:output.tif" # Processus : Raster Calculator arcpy.gp.RasterCalculator_sa("("%c1%"+"%c2%"+"% c3%")/3", sortie)

Voir la vidéo: Automate Backups of an ArcGIS Online Hosted Feature Layer using Python