def main(*argv): if not argv: argv = sys.argv if len(argv) != 3: print('Usage: write_ndvi <envisat-product> <output-file>') print(' where envisat-product is the input filename') print(' and output-file is the output filename.') print('Example: MER_RR__1P_TEST.N1 my_ndvi.raw') print sys.exit(1) # Open the product with epr.open(argv[1]) as product: # The NDVI shall be calculated using bands 6 and 8. band1_name = 'radiance_6' band2_name = 'radiance_10' band1 = product.get_band(band1_name) band2 = product.get_band(band2_name) # Allocate memory for the rasters width = product.get_scene_width() height = product.get_scene_height() subsampling_x = 1 subsampling_y = 1 raster1 = band1.create_compatible_raster(width, height, subsampling_x, subsampling_y) raster2 = band2.create_compatible_raster(width, height, subsampling_x, subsampling_y) # Read the radiance into the raster. offset_x = 0 offset_y = 0 logging.info('read "%s" data' % band1_name) band1.read_raster(offset_x, offset_y, raster1) logging.info('read "%s" data' % band2_name) band2.read_raster(offset_x, offset_y, raster2) # Open the output file logging.info('write ndvi to "%s"' % argv[2]) with open(argv[2], 'wb') as out_stream: # Loop over all pixel and calculate the NDVI. # # @NOTE: looping over data matrices is not the best soluton. # It is done here just for demostrative purposes for j in range(height): for i in range(width): rad1 = raster1.get_pixel(i, j) rad2 = raster2.get_pixel(i, j) if (rad1 + rad2) != 0.0: ndvi = (rad2 - rad1) / (rad2 + rad1) else: ndvi = -1.0 out_stream.write(struct.pack('f', ndvi)) logging.info('ndvi was written success')
def main(*argv): '''A program for converting producing ENVI raster information from dataset. It generates as many raster as there are dataset entrance parameters. Call:: $ write_bands.py <envisat-product> <output directory for the raster file> <dataset name 1> [<dataset name 2> ... <dataset name N>] Example:: $ write_bands.py \ MER_RR__1PNPDK20020415_103725_000002702005_00094_00649_1059.N1 \ . latitude ''' if not argv: argv = sys.argv if len(argv) <= 3: print('Usage: write_bands.py <envisat-product> <output-dir> ' '<dataset-name-1>') print(' [<dataset-name-2> ... <dataset-name-N>]') print(' where envisat-product is the input filename') print(' and output-dir is the output directory') print(' and dataset-name-1 is the name of the first band to be ' 'extracted (mandatory)') print(' and dataset-name-2 ... dataset-name-N are the names of ' 'further bands to be extracted (optional)') print('Example:') print(' write_bands MER_RR__2P_TEST.N1 . latitude') print() sys.exit(1) product_file_path = argv[1] output_dir_path = argv[2] # Open the product; an argument is a path to product data file with epr.open(product_file_path) as product: for band_name in argv[3:]: write_raw_image(output_dir_path, product, band_name)
def epr2gdal(product, vrt, overwrite_existing=False): if isinstance(product, str): filename = product product = epr.open(filename) ysize = product.get_scene_height() xsize = product.get_scene_width() if os.path.exists(vrt) and not overwrite_existing: raise ValueError('unable to create "{0}". Already exists'.format(vrt)) driver = gdal.GetDriverByName('VRT') if driver is None: raise RuntimeError('unable to get driver "VRT"') gdal_ds = driver.Create(vrt, xsize, ysize, 0) if gdal_ds is None: raise RuntimeError('unable to create "{}" dataset'.format(vrt)) metadata = { 'id_string': product.id_string, 'meris_iodd_version': str(product.meris_iodd_version), 'dataset_names': ','.join(product.get_dataset_names()), 'num_datasets': str(product.get_num_datasets()), 'num_dsds': str(product.get_num_dsds()), } gdal_ds.SetMetadata(metadata) mph = product.get_mph() metadata = str(mph).replace(' = ', '=').split('\n') gdal_ds.SetMetadata(metadata, 'MPH') sph = product.get_sph() metadata = str(sph).replace(' = ', '=').split('\n') gdal_ds.SetMetadata(metadata, 'SPH') for band in product.bands(): epr2gdal_band(band, gdal_ds) # @TODO: set geographic info return gdal_ds
def main(*argv): if not argv: argv = sys.argv if len(argv) != 4: print('Usage: write_bitmask <envisat-product> <bitmask-expression> ' '<output-file>') print(' where envisat-product is the input filename') print(' and bitmask-expression is a string containing the bitmask ' 'logic') print(' and output-file is the output filename.') print('Example:') print(" MER_RR__2P_TEST.N1 'l2_flags.LAND and not l2_flags.BRIGHT' " "my_flags.raw") print sys.exit(1) product_file_path = argv[1] bm_expr = argv[2] image_file_path = argv[3] # Open the product; an argument is a path to product data file with epr.open(product_file_path) as product: offset_x = 0 offset_y = 0 source_width = product.get_scene_width() source_height = product.get_scene_height() source_step_x = 1 source_step_y = 1 bm_raster = epr.create_bitmask_raster(source_width, source_height, source_step_x, source_step_y) product.read_bitmask_raster(bm_expr, offset_x, offset_y, bm_raster) with open(image_file_path, 'wb') as out_stream: bm_raster.data.tofile(out_stream) print('Raw image data successfully written to "%s".' % image_file_path) print('Data type is "byte", size is %d x %d pixels.' % (source_width, source_height))
def read_n1(self, ingest): """ Read N1 file (eg MERIS or AATSR), using pyepr package Extract the region of interest, and at the same time regrid to a regular grid. Returns a dictionary containing the parameters that were requested in the metadata file (plus coordinates) for the specified region. :param ingest: An IngestImages object instance, which contains metadata and inputdir variables :return: Dictionary containing the coordinates and data arrays :return: The value of whichever variable was specified by ingest.metadata['time_variable']. This will be converted to a proper datetime in the calling method. """ import epr data = {} image = epr.open(str(ingest.metadata['filename'])) # Get date/time (is a string like '06-APR-2012 09:00:56.832999') time_temp = image.get_sph().get_field(ingest.metadata['time_variable']).get_elem() # Regrid coordinates and extract region of interest longitude = image.get_band('longitude').read_as_array() latitude = image.get_band('latitude').read_as_array() new_lon, new_lat = GeoTools.get_new_lat_lon(longitude, latitude, ingest.metadata['region_coords']) data['longitude'] = new_lon data['latitude'] = new_lat # Read in flag array, and extract bit for valid/invalid points to remove missing data points if 'flag_name' in ingest.metadata.keys(): flag_array = image.get_band(ingest.metadata['flag_name']).read_as_array() flag_array = flag_array >> ingest.metadata['flag_bit'] & 1 else: flag_array = None # Helper function to read a dataset, then extract and regrid to region of interest # NB we read using the higher level get_band, instead of get_database. This is much simpler to use, and also # means that values have already had scaling applied and are converted to floats def get_variable(varname): array = image.get_band(varname).read_as_array() if flag_array is not None: array[flag_array==1] = np.nan array_roi = GeoTools.extract_region_and_regrid(longitude, latitude, new_lon, new_lat, array) return array_roi # Get the variables that were specified in the metadata file for variable in ingest.metadata['variables']: data[variable] = get_variable(str(variable)) # str() is needed as json returns unicode # Get the viewing angles for angle in ingest.metadata['angle_names']: data[angle] = get_variable(ingest.metadata['angle_names'][angle]) # If this is MERIS reflectance, apply solar correction if ingest.metadata['instrument'].lower() == 'meris' and ingest.metadata['vartype'] == 'radiance': data = self.correct_MERIS(image, longitude, latitude, new_lon, new_lat, ingest.metadata, data) # If this is AATSR reflectance, apply corrections if ingest.metadata['instrument'].lower() == 'aatsr' and ingest.metadata['vartype'] == 'reflectance': data = self.correct_AATSR(image, ingest.metadata, data) return data, time_temp
for band in product.bands(): epr2gdal_band(band, gdal_ds) # @TODO: set geographic info return gdal_ds if __name__ == '__main__': filename = 'MER_LRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1' vrtfilename = os.path.splitext(filename)[0] + '.vrt' gdal_ds = epr2gdal(filename, vrtfilename) with epr.open(filename) as product: band_index = product.get_band_names().index('water_vapour') band = product.get_band('water_vapour') eprdata = band.read_as_array() unit = band.unit lines_mirrored = band.lines_mirrored scaling_offset = band.scaling_offset scaling_factor = band.scaling_factor gdal_band = gdal_ds.GetRasterBand(band_index + 1) vrtdata = gdal_band.ReadAsArray() if lines_mirrored: vrtdata = vrtdata[:, ::-1] vrtdata = vrtdata * scaling_factor + scaling_offset
@author: mag """ #import numpy #from pylab import * #from pylab import imshow import matplotlib.pyplot as plt pn = '/home/mag/data/baltic/finngulfWindCases/' fn = 'ASA_WSM_1PNPDE20110523_084634_000000983102_00395_48254_2349.N1' fn = 'ASA_WSM_1PNPDE20111127_085336_000002143109_00079_50955_3727.N1' import epr product = epr.open(pn + fn) proc_dataset = product.get_dataset('MAIN_PROCESSING_PARAMS_ADS') record = proc_dataset.read_record(0) record.get_field_names()[:20] field = record.get_field('range_spacing') product.get_band_names() # Get proc_data pd = product.get_band('proc_data') proc_data = pd.read_as_array(5000, 5000, xoffset=500, yoffset=9000, \ xstep=2, ystep=2)
#!/usr/bin/env python3 from __future__ import print_function import numpy as np from matplotlib import pyplot as plt import epr FILENAME = 'MER_LRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1' # load original data with epr.open(FILENAME) as product: band = product.get_band('water_vapour') wv_orig_histogram, orig_bins = np.histogram(band.read_as_array().flat, 50) # plot water vapour histogram plt.figure() plt.bar(orig_bins[:-1], wv_orig_histogram, 0.02, label='original') plt.grid(True) plt.title('Water Vapour Histogram') plt.savefig('water_vapour_histogram_01.png') # modily scaling facotrs with epr.open(FILENAME, 'rb+') as product: dataset = product.get_dataset('Scaling_Factor_GADS') record = dataset.read_record(0) field = record.get_field('sf_wvapour') scaling = field.get_elem() scaling *= 1.1