I'll answer to myself:
It seems that all the values are rounded to the nearest 0,5. So 0,401 m / 2.8284 m = 0,14177, would instead be 0,5/3 = 16,6667. Or if distance is 2 metres, then 0,5/2 = 25 %. In the manual it says the values are rounded in FLAT areas, which seems to be a little off considering it does that where slope is 25 %. Another remark is that in flat areas (lakes) the drop percentages are indeed continuous!
[ATTACH=CONFIG]28643[/ATTACH]
Here's a sample showing what I mean. Darker gray equals flow direcetion to lower left and percentage 16,666 % drop while lighter gray here has 25 % drop and flow direction to the left.
# Created By: Prasad A Pathak # Purpose: Calculate Topographic Wetness Index: natural logarithm of area divided by slope # It indicates the probable water saturation level of the ground # By default, ArcGIS calculates slope by considering just 3 X 3 neighborhood # For this index a slope is calculated from the topmost pixel to any particular pixel is needed # This is acheived by calculating the minimum elevation raster # small adaptions to ArcGIS 10.2 by Xander Bakker # - adapted to arcpy # - cellsize is determined from input DEM # - output TWI is name (string) not raster dataset # Import system modules import arcpy import os import math from arcpy import env env.overwriteOutput = True # Get the name of folder env.workspace = arcpy.GetParameterAsText(0) #Input DEM InDEM = arcpy.GetParameterAsText(1) #Output TWI raster NAME OutTWI = arcpy.GetParameterAsText(2) # note this was a raster, is now changed to a name # Check out license for Spatial Analyst arcpy.CheckOutExtension("Spatial") # determine cellsize of input raster desc = arcpy.Describe(InDEM) cellsize = desc.meanCellHeight # new # Variables used Output_surface_raster = env.workspace + os.sep + "eldodem_fill" Output_flow_direction_raster = env.workspace + os.sep + "eldodem_flw" Output_drop_raster = env.workspace + os.sep + "eldodem_drp" Output_accumulation_raster = env.workspace + os.sep + "eldodem_acc" Output_Plus_raster = env.workspace + os.sep + "eldodempls" Output_Times_raster = env.workspace + os.sep + "eldodemtim" Output_Mean_elev_raster = env.workspace + os.sep + "mean_elev" Output_edrop = env.workspace + os.sep + "edrop" Out_change = env.workspace + os.sep + "change_elev" Out_distance = env.workspace + os.sep + "distance" Out_slope = env.workspace + os.sep + "slope" Out_preatan = env.workspace + os.sep + "preatan" Out_TWI_raster = env.workspace + os.sep + OutTWI # new # Fill DEM to make it depressionless filledDEM = arcpy.sa.Fill(InDEM) filledDEM.save(Output_surface_raster) print "DEM filled" arcpy.AddMessage("DEM filled") # Flow Direction flowDir = arcpy.sa.FlowDirection(filledDEM,"NORMAL",Output_drop_raster) flowDir.save(Output_flow_direction_raster) print "Flow direction raster created successfully" arcpy.AddMessage("Flow direction raster created successfully") # Flow Accumulation flowAcc = arcpy.sa.FlowAccumulation(flowDir,"","FLOAT") flowAcc.save(Output_accumulation_raster) print "Flow accumulation raster created successfully" arcpy.AddMessage("Flow accumulation raster created successfully") # One is added to each pixel to get an count of how many pixel including the current are contributing the flow flowAccPlus1 = flowAcc + 1 flowAccPlus1.save(Output_Plus_raster) print "addition raster created successfully" arcpy.AddMessage("addition raster created successfully") # Contributing Area using the number of pixels and flowAccPlus1Times = flowAccPlus1 * cellsize**2 flowAccPlus1Times.save(Output_Times_raster) print "multiplication raster created successfully" arcpy.AddMessage("multiplication raster created successfully") # Process: Block Statistics... meanElev = arcpy.sa.BlockStatistics(filledDEM, arcpy.sa.NbrRectangle(3, 3, "CELL"),"MINIMUM", "DATA") meanElev.save(Output_Mean_elev_raster) print "MIN elevation raster created successfully" arcpy.AddMessage("MIN elevation raster created successfully") eDrop = filledDEM - meanElev eDrop.save(Output_edrop) print "EDROP raster created successfully" arcpy.AddMessage("EDROP raster created successfully") Input_false_raster_or_constant_value = 0.005 outChange = arcpy.sa.Con(eDrop >= 0.005, eDrop, Input_false_raster_or_constant_value) outChange.save(Out_change) print "Change elevation raster created successfully" arcpy.AddMessage("Change elevation raster created successfully") inListras = arcpy.sa.InList(flowDir,[1,4,16,64]) Input_true_raster_or_constant_value = cellsize false_raster_or_constant_value = cellsize * math.sqrt(2) outDist = arcpy.sa.Con(arcpy.sa.IsNull(inListras),false_raster_or_constant_value,Input_true_raster_or_constant_value) outDist.save(Out_distance) print "Distance raster created successfully" arcpy.AddMessage("Distance raster created successfully") outSlope = outChange / outDist outSlope.save(Out_slope) print "Slope raster created successfully" arcpy.AddMessage("Slope raster created successfully") outPreatan = flowAccPlus1Times / outSlope outPreatan.save(Out_preatan) print "Pre-atan raster created successfully" arcpy.AddMessage("Pre-atan raster created successfully") outTWI = arcpy.sa.Ln(outPreatan) outTWI.save(Out_TWI_raster) print "TWI raster created successfully" arcpy.AddMessage("TWI raster created successfully")
# Import system modules import arcpy, sys, string, os, arcgisscripting from arcpy import env from arcpy.sa import * # Geoprocessor object gp = arcgisscripting.create(10.1) gp.overwriteoutput = 1 ############# # Input DEM # ############# #set workspace (file directory) env.workspace = "G:\\xxxx\\LiDAR\\TWI\\" #set dem name (inside workspace) InDEM = 'dem_ldm.tif' arcpy.CheckOutExtension("Spatial") #Output TWI rasterOutTWI = "G:\\xxxx\\LiDAR\\TWI\\" # Load toolbox gp.AddToolbox("C:/ESRI/Desktop/Desktop10.1/ArcToolbox/Toolboxes/Spatial Analyst Tools.tbx") ######################################################################## # Fill DEM to make it depressionless outfill = Fill(InDEM) print "DEM filled" # Flow Direction outdrop = "G:\\xxxx\\LiDAR\\TWI\\outdrop" flow_dir = FlowDirection(outfill, "NORMAL", outdrop) print "Flow direction raster created successfully" # Flow Accumulation flow_accu = FlowAccumulation(flow_dir, "", "FLOAT") print "Flow accumulation raster created successfully" # One is added to each pixel to get an count of how many pixel including the current are contributing the flow plus_raster = Plus(flow_accu, 1) print "addition raster created successfully" # Contributing Area using the number of pixels and Times_raster = Times(plus_raster, 4) print "multiplication raster created successfully" # Process: Block Statistics... Output_Mean_elev_raster = BlockStatistics(outfill, "Rectangle 3 3 CELL", "MINIMUM", "DATA") print "MIN elevation raster created successfully" Output_Mean_elev_raster = Minus(Output_Mean_elev_raster, outdrop) print "EDROP raster created successfully" Input_false_raster_or_constant_value = "0,005" Out_change = Con(outdrop, outdrop, Input_false_raster_or_constant_value, "\"VALUE\" >= 0,005") print "Change elevation raster created successfully" Input_true_raster_or_constant_value = "2" false_raster_or_constant_value = "2,828427125" Out_distance = Con(flow_dir, Input_true_raster_or_constant_value, false_raster_or_constant_value, "\"VALUE\" = 1 OR \"VALUE\" = 4 OR \"VALUE\" = 16 OR \"VALUE\" = 64") print "Distance raster created successfully" Out_slope = Divide(Out_change, Out_distance) print "Slope raster created successfully" Out_preatan = Divide(Times_raster, Out_slope) print "Pre-atan raster created successfully" TWI = Ln(Out_preatan) print "TWI raster created successfully" TWI.save("G:\\xxxx\\LiDAR\\TWI\\twi_ykj")
So maybe I should just drop the arcscripting?
# Load toolbox gp.AddToolbox("C:/ESRI/Desktop/Desktop10.1/ArcToolbox/Toolboxes/Spatial Analyst Tools.tbx")
# Get the name of folder env.workspace = arcpy.GetParameterAsText(0) #Input DEM InDEM = arcpy.GetParameterAsText(1) #Output TWI raster NAME OutTWI = arcpy.GetParameterAsText(2)
env.workspace = "G:\\xxxx\\LiDAR\\TWI\\" InDEM = 'dem_ldm.tif' OutTWI = "TWI01" # or a different name
It ran trough, but drop-value problem remains.
(noticed a tiling effect, so there might be a projection problem here too -> looking into that currently)
best regards,
Henri
meanElev = arcpy.sa.BlockStatistics(filledDEM, arcpy.sa.NbrRectangle(3, 3, "CELL"),"MINIMUM", "DATA")
meanElev = arcpy.sa.FocalStatistics(filledDEM, arcpy.sa.NbrRectangle(3, 3, "CELL"),"MINIMUM", "DATA")