Batch converting netCDF to Raster using ArcPy?

Okay, so this was a little tricky as there seemed to be a few different ways of using what is descibed as a Value Table on the ESRI Help Page:

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//004300000006000000.htm

There are also a few uses of brackets that could be tricky if you are not really sure of the syntax so hopefully if you can just use the example below it will work.

So what you really want is answers so here it is with a fix

def extractAllNetCDF():

    variable = "RRt_10m"
    x_dimension = "lon"
    y_dimension = "lat"
    band_dimension = ""
    dimension = "time"
    valueSelectionMethod = "BY_VALUE"

    outLoc = "E:/New Folder/"
    inNetCDF = "E:/netCDFFiles/RRt.nc"

    nc_FP = arcpy.NetCDFFileProperties(inNetCDF)
    nc_Dim = nc_FP.getDimensions()

    for dimension in nc_Dim:

        top = nc_FP.getDimensionSize(dimension)

        for i in range(0, top):

            if dimension == "time":

                dimension_values = nc_FP.getDimensionValue(dimension, i)
                nowFile = str(dimension_values)

                #THIS IS THE NEW CODE HERE
                dv1 = ["time", dimension_value]
                dimension_values = [dv1]
                #END NEW CODE

                arcpy.MakeNetCDFRasterLayer_md(inNetCDF, variable, x_dimension, y_dimension, nowFile, band_dimension, dimension_values, valueSelectionMethod)
                arcpy.CopyRaster_management(nowFile, outLoc + nowFile + ".img", "", "", "", "NONE", "NONE", "")
                print dimension_values, i 

So that's it essentially. There is no need to create an instance of 'Value Table' type e.g.

vtab = arcpy.ValueTable(2)

as is seemed to be implied by the fact the argument was labelled 'Value Table'.

There is no need to use all of the brackets that they show in the examples whether curly, round or otherwise. Follow the above and it should work.


Just improving the efficiency of the above answer by pulling the if dimension == "time": out of the loop so it doesn't evaluate needlessly again and again. Also pulled the forward slashes out of the output filenames, to address an error in executing MakeNetCDFRasterLayer_md.

 def extractAllNetCDF():

    variable = "precip"
    x_dimension = "lon"
    y_dimension = "lat"
    band_dimension = ""
    dimension = "time"
    valueSelectionMethod = "BY_VALUE"

    outLoc = r"C:\Users\jkadmin\Downloads\Shirin\a"
    inNetCDF = r"C:\Users\jkadmin\Downloads\Shirin\precip.mon.total.v7.nc"

    nc_FP = arcpy.NetCDFFileProperties(inNetCDF)
    nc_Dim = nc_FP.getDimensions()

    for dimension in nc_Dim:
        if dimension == "time":
            top = nc_FP.getDimensionSize(dimension)
            for i in range(0, top):

                dimension_values = nc_FP.getDimensionValue(dimension, i)
                nowFile = str(dimension_values)
                nowFile = nowFile.translate(None, '/')
                # I needed only the years 1950 onward
                if int(nowFile[-2]) > 4:

                    dv1 = ["time", dimension_values]
                    dimension_values = [dv1]

                    arcpy.MakeNetCDFRasterLayer_md(inNetCDF, variable, x_dimension, y_dimension, nowFile, band_dimension, dimension_values, valueSelectionMethod)
                    print "success"
                    outname = outLoc + nowFile

                    arcpy.CopyRaster_management(nowFile, outname, "", "", "", "NONE", "NONE", "")


                else: print "before 1950"

Tags:

Netcdf

Arcpy