def create_netcdf_storage_unit(filename, crs, coordinates, variables, variable_params, global_attributes=None, netcdfparams=None): """ Create a NetCDF file on disk. :param pathlib.Path filename: filename to write to :param datacube.utils.geometry.CRS crs: Datacube CRS object defining the spatial projection :param dict coordinates: Dict of named `datacube.model.Coordinate`s to create :param dict variables: Dict of named `datacube.model.Variable`s to create :param dict variable_params: Dict of dicts, with keys matching variable names, of extra parameters for variables :param dict global_attributes: named global attributes to add to output file :param dict netcdfparams: Extra parameters to use when creating netcdf file :return: open netCDF4.Dataset object, ready for writing to """ filename = Path(filename) if filename.exists(): raise RuntimeError('Storage Unit already exists: %s' % filename) try: filename.parent.mkdir(parents=True) except OSError: pass _LOG.info('Creating storage unit: %s', filename) nco = netcdf_writer.create_netcdf(str(filename), **(netcdfparams or {})) for name, coord in coordinates.items(): netcdf_writer.create_coordinate(nco, name, coord.values, coord.units) netcdf_writer.create_grid_mapping_variable(nco, crs) for name, variable in variables.items(): set_crs = all(dim in variable.dims for dim in crs.dimensions) var_params = variable_params.get(name, {}) data_var = netcdf_writer.create_variable(nco, name, variable, set_crs=set_crs, **var_params) for key, value in var_params.get('attrs', {}).items(): setattr(data_var, key, value) for key, value in (global_attributes or {}).items(): setattr(nco, key, value) return nco
def test_create_epsg4326_netcdf(tmpnetcdf_filename): nco = create_netcdf(tmpnetcdf_filename) create_coordinate(nco, 'latitude', numpy.array([1., 2., 3.]), 'm') create_coordinate(nco, 'longitude', numpy.array([1., 2., 3.]), 'm') create_grid_mapping_variable(nco, GEO_PROJ) nco.close() with netCDF4.Dataset(tmpnetcdf_filename) as nco: assert 'crs' in nco.variables assert nco['crs'].grid_mapping_name == 'latitude_longitude' _ensure_spheroid(nco['crs']) _ensure_geospatial(nco)
def test_create_epsg4326_netcdf(tmpnetcdf_filename): nco = create_netcdf(tmpnetcdf_filename) create_coordinate(nco, 'latitude', numpy.array([1., 2., 3.]), 'm') create_coordinate(nco, 'longitude', numpy.array([1., 2., 3.]), 'm') create_grid_mapping_variable(nco, GEO_PROJ) nco.close() with netCDF4.Dataset(tmpnetcdf_filename) as nco: assert 'crs' in nco.variables assert nco['crs'].grid_mapping_name == 'latitude_longitude' _ensure_spheroid(nco['crs']) _ensure_geospatial(nco)
def test_create_sinus_netcdf(tmpnetcdf_filename): nco = create_netcdf(tmpnetcdf_filename) create_coordinate(nco, 'x', numpy.array([1., 2., 3.]), 'm') create_coordinate(nco, 'y', numpy.array([1., 2., 3.]), 'm') create_grid_mapping_variable(nco, SINIS_PROJ) nco.close() with netCDF4.Dataset(tmpnetcdf_filename) as nco: assert 'crs' in nco.variables assert nco['crs'].grid_mapping_name == 'sinusoidal' assert 'longitude_of_central_meridian' in nco['crs'].ncattrs() _ensure_spheroid(nco['crs']) _ensure_geospatial(nco)
def test_create_sinus_netcdf(tmpnetcdf_filename): nco = create_netcdf(tmpnetcdf_filename) create_coordinate(nco, 'x', numpy.array([1., 2., 3.]), 'm') create_coordinate(nco, 'y', numpy.array([1., 2., 3.]), 'm') create_grid_mapping_variable(nco, SINIS_PROJ) nco.close() with netCDF4.Dataset(tmpnetcdf_filename) as nco: assert 'crs' in nco.variables assert nco['crs'].grid_mapping_name == 'sinusoidal' assert 'longitude_of_central_meridian' in nco['crs'].ncattrs() _ensure_spheroid(nco['crs']) _ensure_geospatial(nco)
def test_create_albers_projection_netcdf(tmpnetcdf_filename): nco = create_netcdf(tmpnetcdf_filename) create_coordinate(nco, 'x', numpy.array([1., 2., 3.]), 'm') create_coordinate(nco, 'y', numpy.array([1., 2., 3.]), 'm') create_grid_mapping_variable(nco, ALBERS_PROJ) nco.close() with netCDF4.Dataset(tmpnetcdf_filename) as nco: assert 'crs' in nco.variables assert nco['crs'].grid_mapping_name == 'albers_conical_equal_area' assert 'standard_parallel' in nco['crs'].ncattrs() assert 'longitude_of_central_meridian' in nco['crs'].ncattrs() assert 'latitude_of_projection_origin' in nco['crs'].ncattrs() _ensure_spheroid(nco['crs']) _ensure_gdal(nco['crs']) _ensure_geospatial(nco)
def saveNC(output,filename, history): nco=netcdf_writer.create_netcdf(filename) nco.history = (history.decode('utf-8').encode('ascii','replace')) coords=output.coords cnames=() for x in coords: netcdf_writer.create_coordinate(nco, x, coords[x].values, coords[x].units) cnames=cnames+(x,) netcdf_writer.create_grid_mapping_variable(nco, output.crs) for band in output.data_vars: output.data_vars[band].values[np.isnan(output.data_vars[band].values)]=nodata var= netcdf_writer.create_variable(nco, band, Variable(output.data_vars[band].dtype, nodata, cnames, None) ,set_crs=True) var[:] = netcdf_writer.netcdfy_data(output.data_vars[band].values) nco.close()
def test_create_albers_projection_netcdf(tmpnetcdf_filename): nco = create_netcdf(tmpnetcdf_filename) create_coordinate(nco, 'x', numpy.array([1., 2., 3.]), 'm') create_coordinate(nco, 'y', numpy.array([1., 2., 3.]), 'm') create_grid_mapping_variable(nco, ALBERS_PROJ) nco.close() with netCDF4.Dataset(tmpnetcdf_filename) as nco: assert 'crs' in nco.variables assert nco['crs'].grid_mapping_name == 'albers_conical_equal_area' assert 'standard_parallel' in nco['crs'].ncattrs() assert 'longitude_of_central_meridian' in nco['crs'].ncattrs() assert 'latitude_of_projection_origin' in nco['crs'].ncattrs() _ensure_spheroid(nco['crs']) _ensure_gdal(nco['crs']) _ensure_geospatial(nco)
def test_create_lambert_conformal_conic_2sp_projection_netcdf( tmpnetcdf_filename): nco = create_netcdf(tmpnetcdf_filename) create_coordinate(nco, 'x', numpy.array([1., 2., 3.]), 'm') create_coordinate(nco, 'y', numpy.array([1., 2., 3.]), 'm') create_grid_mapping_variable(nco, LCC2_PROJ) nco.close() with netCDF4.Dataset(tmpnetcdf_filename) as nco: assert 'crs' in nco.variables assert nco['crs'].grid_mapping_name == 'lambert_conformal_conic' assert 'standard_parallel' in nco['crs'].ncattrs() assert 'longitude_of_central_meridian' in nco['crs'].ncattrs() assert 'latitude_of_projection_origin' in nco['crs'].ncattrs() assert 'false_easting' in nco['crs'].ncattrs() assert 'false_northing' in nco['crs'].ncattrs() _ensure_spheroid(nco['crs']) _ensure_gdal(nco['crs']) _ensure_geospatial(nco)
def write_dataset_to_netcdf(access_unit, global_attributes, variable_params, filename): if filename.exists(): raise RuntimeError('Storage Unit already exists: %s' % filename) try: filename.parent.mkdir(parents=True) except OSError: pass # _LOG.info("Writing storage unit: %s", filename) nco = netcdf_writer.create_netcdf(str(filename)) for name, coord in access_unit.coords.items(): netcdf_writer.create_coordinate(nco, name, coord.values, coord.units) netcdf_writer.create_grid_mapping_variable(nco, access_unit.crs) for name, variable in access_unit.data_vars.items(): # Create variable var_params = variable_params.get(name, {}) data_var = netcdf_writer.create_variable( nco, name, Variable(variable.dtype, getattr(variable, 'nodata', None), variable.dims, getattr(variable, 'units', '1')), **var_params) # Write data data_var[:] = netcdf_writer.netcdfy_data(variable.values) # TODO: 'flags_definition', 'spectral_definition'? for key, value in variable_params.get(name, {}).get('attrs', {}).items(): setattr(data_var, key, value) # write global atrributes for key, value in global_attributes.items(): setattr(nco, key, value) nco.close()
def create_netcdf_storage_unit(filename, crs, coordinates, variables, variable_params, global_attributes=None, netcdfparams=None): if filename.exists(): raise RuntimeError('Storage Unit already exists: %s' % filename) try: filename.parent.mkdir(parents=True) except OSError: pass nco = netcdf_writer.create_netcdf(str(filename), **(netcdfparams or {})) for name, coord in coordinates.items(): netcdf_writer.create_coordinate(nco, name, coord.values, coord.units) netcdf_writer.create_grid_mapping_variable(nco, crs) for name, variable in variables.items(): set_crs = all(dim in variable.dims for dim in crs.dimensions) var_params = variable_params.get(name, {}) data_var = netcdf_writer.create_variable(nco, name, variable, set_crs=set_crs, **var_params) for key, value in var_params.get('attrs', {}).items(): setattr(data_var, key, value) for key, value in (global_attributes or {}).items(): setattr(nco, key, value) return nco