Hi Krzysztof,Clint already indicated some flaws in the code. Another one is the fact that you do a loop over your features, but nothing is actually done with the feature itself. What you should do in the loop is create a feature layer of the single feature and use that feature layer in the zonal statistics tool.See below an example of how this could be done:import arcpy
import os
# Set environment settings
outWorkspace = r"C:\Project\_Forums\_json\fgdb\crawlAHN2.gdb"
arcpy.env.workspace = outWorkspace
arcpy.env.overwriteOutput = True
# reference to the data
fc = os.path.join(outWorkspace, "crowns")
raster = os.path.join(outWorkspace, "AHN2r")
zoneField = "ID_OK"
# temporal output ZS table will be (over)written to in memory workspace
outTable = os.path.join("IN_MEMORY", "stat_zs")
# name of feature layer (lives in memory)
flyr_name = 'a_crown'
# get list of zones (this is used for the loop)
lst_zones = [row[0] for row in arcpy.da.SearchCursor(fc, (zoneField))]
# create an empty dictionary to store the statistics results
dct_stats = {}
# create a dictionary that holds the statistics type and the corresponding output field names
dct_stat_fld = {'MEAN': 'cr_mean',
'MAX': 'cr_max',
'MIN': 'cr_min',
'STD': 'cr_std'}
# list of fields in ZS table that hold the statistics I'm interested in ['MEAN','MIN','MAX','STD']
lst_flds = [fld for fld in dct_stat_fld.iterkeys()]
# get sa license
arcpy.CheckOutExtension("Spatial")
# now loop through zones and make a featurelayer with only that zone feature (crown)
cnt = 0
for zone in lst_zones:
cnt += 1
# give some feedback on progress
if cnt % 10 == 0:
print "Processing crown: {0} ({1})".format(cnt, zone)
# create the where clause for that crown
where = "{0} = '{1}'".format(arcpy.AddFieldDelimiters(fc, zoneField), zone)
# make the featurelayer of current crown (zone)
arcpy.MakeFeatureLayer_management(fc, flyr_name, where)
# calculate the zonal statistics for that crown
arcpy.sa.ZonalStatisticsAsTable(flyr_name, zoneField, raster, outTable, "NODATA", "ALL")
# read the ZS table and write to dictionary
with arcpy.da.SearchCursor(outTable, lst_flds) as curs:
for row in curs:
i = 0
for fld in lst_flds:
key = (zone, fld) # looks like ('crown ID', 'statistics type like MIN')
dct_stats[key] = row
i += 1
# return sa license
arcpy.CheckInExtension("Spatial")
# create update field collection (field for the update cursor)
flds = [zoneField]
flds.extend([dct_stat_fld[fld] for fld in lst_flds])
# do an update cursor to write the results from dictionary to crown featureclass
with arcpy.da.UpdateCursor(fc, flds) as curs:
for row in curs:
zone = row[0]
i = 1
for fld in lst_flds:
key = (zone, fld)
if key in dct_stats:
row = dct_stats[key]
i += 1
curs.updateRow(row)
I hope this is useful for you. Kind regards,Xander