# This is a module file to read in/initialize geospatial metadata for the NWM # 1 km land grid. This information will be used to compose and augment output # MPE NetCDF files for CF-compliance. # Logan Karsten # National Center for Atmsopheric Research # karsten@ucar.edu # 303-497-2693 from netCDF4 import Dataset class nwmGeoMeta: def __init__(self): # Initialize empty object conaining variables. self.nx = -9999 self.ny = -9999 self.xCoords = -9999 self.yCoords = -9999 self.yStdName = '' self.xStdName = '' self.yLongName = '' self.xLongName = '' self.yAxisType = '' self.xAxisType = '' self.yUnits = '' self.xUnits = '' self.yRes = -9999 self.xRes = -9999 self.transformType = '' self.transformName = '' self.gridMapping = '' self.coordAxis = '' self.esriString = '' self.stdParallel = -9999 self.lon0 = -9999 self.lat0 = -9999 self.falseEast = -9999 self.falseNorth = -9999 self.radius = -9999 self.proj4 = '' self.conventions = '' def readMeta(self,statusMeta): """ Function to read in geospatial metadata from the NWM metadata file. """ try: idMeta = Dataset(statusMeta.landMetaFile) except: statusMeta.errMsg = "ERROR: Failure to open metadata file: " + statusMeta.landMetaFile raise Exception() if 'x' not in list(idMeta.variables): statusMeta.errMsg = "ERROR: Coordinate variable x not found in: " + statusMeta.landMetaFile raise Exception() if 'y' not in list(idMeta.variables): statusMeta.errMsg = "ERROR: Coordinate variable y not found in: " + statusMeta.landMetaFile raise Exception() if 'crs' not in list(idMeta.variables): statusMeta.errMsg = "ERROR: crs not found in: " + statusMeta.landMetaFile raise Exception() # Pull the necessary information from the land metadata file. try: self.nx = idMeta.variables['x'].shape[0] except: statusMeta.errMsg = "ERROR: Unable to find x variable size in: " + statusMeta.landMetaFile raise Exception() try: self.ny = idMeta.variables['y'].shape[0] except: statusMeta.errMsg = "ERROR: Unable to find y variable size in: " + statusMeta.landMetaFile raise Exception() try: self.xCoords = idMeta.variables['x'][:] except: statusMeta.errMsg = "ERROR: Unable to extract x coordinate values in: " + statusMeta.landMetaFile raise Exception() try: self.yCoords = idMeta.variables['y'][:] except: statusMeta.errMsg = "ERROR: Unable to extract y coordinate values in: " + statusMeta.landMetaFile raise Exception() try: self.xStdName = idMeta.variables['x'].standard_name except: statusMeta.errMsg = "ERROR: Unable to extract x standard_name from: " + statusMeta.landMetaFile raise Exception() try: self.yStdName = idMeta.variables['y'].standard_name except: statusMeta.errMsg = "ERROR: Unable to extract y standard_name from: " + statusMeta.landMetaFile raise Exception() try: self.xLongName = idMeta.variables['x'].long_name except: statusMeta.errMsg = "ERROR: Unable to extract x long_name from : " + statusMeta.landMetaFile raise Exception() try: self.yLongName = idMeta.variables['y'].long_name except: statusMeta.errMsg = "ERROR: Unable to extract y long_name from : " + statusMeta.landMetaFile raise Exception() try: self.xAxisType = idMeta.variables['x']._CoordinateAxisType except: statusMeta.errMsg = "ERROR: Unable to extract x _CoordinateAxisType from: " + statusMeta.landMetaFile raise Exception() try: self.yAxisType = idMeta.variables['y']._CoordinateAxisType except: statusMeta.errMsg = "ERROR: Unable to extract y _CoordinateAxisType from: " + statusMeta.landMetaFile raise Exception() try: self.xUnits = idMeta.variables['x'].units except: statusMeta.errMsg = "ERROR: Unable to extract x units from: " + statusMeta.landMetaFile raise Exception() try: self.yUnits = idMeta.variables['y'].units except: statusMeta.errMsg = "ERROR: Unable to extract y units from: " + statusMeta.landMetaFile raise Exception() try: self.xRes = idMeta.variables['x'].resolution except: statusMeta.errMsg = "ERROR: Unable to extract x resolution from: " + statusMeta.landMetaFile raise Exception() try: self.yRes = idMeta.variables['y'].resolution except: statusMeta.errMsg = "ERROR: Unable to extract y resolution from: " + statusMeta.landMetaFile raise Exception() try: self.transformType = idMeta.variables['crs']._CoordinateTransformType except: statusMeta.errMsg = "ERROR: Unable to extract CoordinateTransformType from: " + statusMeta.landMetaFile raise Exception() try: self.transformName = idMeta.variables['crs'].transform_name except: statusMeta.errMsg = "ERROR: Unable to extract transform_name from: " + statusMeta.landMetaFile raise Exception() try: self.gridMapping = idMeta.variables['crs'].grid_mapping_name except: statusMeta.errMsg = "ERROR: Unable to extract grid_mapping_name from: " + statusMeta.landMetaFile raise Exception() try: self.coordAxis = idMeta.variables['crs']._CoordinateAxes except: statusMeta.errMsg = "ERROR: Unable to extract coordinateAxes from: " + statusMeta.landMetaFile raise Exception() try: self.esriString = idMeta.variables['crs'].esri_pe_string except: statusMeta.errMsg = "ERROR: Unable to extract esri_pe_string from: " + statusMeta.landMetaFile raise Exception() try: self.stdParallel = idMeta.variables['crs'].standard_parallel except: statusMeta.errMsg = "ERROR: Unable to extract standard_parallel from: " + statusMeta.landMetaFile raise Exception() try: self.lon0 = idMeta.variables['crs'].longitude_of_central_meridian except: statusMeta.errMsg = "ERROR: Unable to extract longitude_of_central_meridian from: " + statusMeta.landMetaFile raise Exception() try: self.lat0 = idMeta.variables['crs'].latitude_of_projection_origin except: statusMeta.errMsg = "ERROR: Unable to extract latitude_of_projection_origin from: " + statusMeta.landMetaFile raise Exception() try: self.falseEast = idMeta.variables['crs'].false_easting except: statusMeta.errMsg = "ERROR: Unable to extract false_easting from: " + statusMeta.landMetaFile raise Exception() try: self.falseNorth = idMeta.variables['crs'].false_northing except: statusMeta.errMsg = "ERROR: Unable to extract false_northing from: " + statusMeta.landMetaFile raise Exception() try: self.radius = idMeta.variables['crs'].earth_radius except: statusMeta.errMsg = "ERROR: Unable to extract earth_radius from: " + statusMeta.landMetaFile raise Exception() try: self.proj4 = idMeta.proj4 except: statusMeta.errMsg = "ERROR: Unable to extract proj4 from: " + statusMeta.landMetaFile raise Exception() try: self.conventions = idMeta.Conventions except: statusMeta.errMsg = "ERROR: Unable to extract Conventions from: " + statusMeta.landMetaFile raise Exception() # Close the land metadata file try: idMeta.close() except: statusMeta.errMsg = "ERROR: Unable to close file: " + statusMeta.landMetaFile raise Exception()