Source code for exports.netcdf_kit

"""
Contains the NetCDFKit class
"""

import sys
import logging
from collections import defaultdict
import numpy
from netCDF4 import Dataset


from lib.db.style.false_colour import calculate_false_colour_num, make_false_colour_tup
from lib.exports.export_kit import ExportKit

[docs]class NetCDFKit(ExportKit): ''' Class used to output NetCDF4 files, given geometry, style and metadata data structures ''' def __init__(self, debug_level): ''' Initialise class :param debug_level: debug level taken from python's 'logging' module ''' # Call parent class ExportKit.__init__(self, debug_level)
[docs] def write_points(self, geom_obj, style_obj, meta_obj, out_filename): ''' Write out a NetCDF file from a point geometry file :param geom_obj: MODEL_GEOMETRY object that hold geometry and text :param style_obj: STYLE object containing colour info :param meta_obj: METADATA object, used for labelling :param out_filename: path & filename of NetCDF file to output, without extension ''' self.logger.debug("NetCDFKit.write_points(%s)", out_filename) self.logger.debug("NetCDFKit.write_points() geom_obj=%s", repr(geom_obj)) if not geom_obj.is_point(): self.logger.error("ERROR - Cannot use NetCDFKit.write_points for line, triangle or volume") sys.exit(1) root_grp = Dataset(out_filename+".nc", "w", format="NETCDF4") points_grp = root_grp.createGroup("points") points_grp.createDimension('points list', None) # Just does a single fp value for each XYZ, later expand to multiple values xyzd_dtype = numpy.dtype([("x", numpy.float32), ("y", numpy.float32), ("z", numpy.float32), ("data", numpy.float32)]) points_type = points_grp.createCompoundType(xyzd_dtype, "xyzd_dtype") size = len(geom_obj.vrtx_arr) popup_dict = {} geometry_name = meta_obj.name points_list = points_grp.createVariable("points_list", points_type, "points list", zlib=True) data = numpy.empty(size, points_type) node_list = [] prop_dict = geom_obj.get_loose_3d_data(True) geom_label='' for point_cnt, vrtx in enumerate(geom_obj.vrtx_arr): data[point_cnt]["x"] = vrtx.xyz[0] data[point_cnt]["y"] = vrtx.xyz[1] data[point_cnt]["z"] = vrtx.xyz[2] geom_label = "{0}-{1:010d}".format(geometry_name, point_cnt) # Create popup info popup_dict[geom_label] = {'name': meta_obj.get_property_name(), 'title': geometry_name.replace('_', ' ')} if vrtx.xyz in prop_dict: popup_dict[geom_label]['val'] = prop_dict[vrtx.xyz] try: data[point_cnt]["data"] = float(prop_dict[vrtx.xyz]) except ValueError: pass # Write points to file self.logger.info("write_points() Writing NetCDF file: %s.nc", out_filename) points_list[:] = data try: root_grp.close() except OSError as os_exc: self.logger.error("ERROR - Cannot write file %s.nc: %s", out_filename, repr(os_exc)) return {} return popup_dict
# END OF NetCDFKit CLASS