def test_to_geotiff_ifg(self): self.dest = os.path.join(TEMPDIR, 'tmp_gamma_ifg.tif') data_path = join(GAMMA_TEST_DIR, '16x20_20090713-20090817_VV_4rlks_utm.unw') write_fullres_geotiff(self.COMBINED, data_path, self.dest, nodata=0) ds = gdal.Open(self.dest) exp_path = join(GAMMA_TEST_DIR, '16x20_20090713-20090817_VV_4rlks_utm.tif') exp_ds = gdal.Open(exp_path) # compare data and geographic headers assert_array_almost_equal(exp_ds.ReadAsArray(), ds.ReadAsArray()) self.compare_rasters(ds, exp_ds) md = ds.GetMetadata() assert len(md) == 11 # 11 metadata items assert md[ifc.FIRST_DATE] == str(date(2009, 7, 13)) assert md[ifc.SECOND_DATE] == str(date(2009, 8, 17)) assert md[ifc.PYRATE_TIME_SPAN] == str(35 / ifc.DAYS_PER_YEAR) # TODO test failing # self.assertTrue(md[ifc.FIRST_DATE] == str(12)) # TODO test failing # self.assertTrue(md[ifc.SECOND_DATE] == str(time(12))) wavelen = float(md[ifc.PYRATE_WAVELENGTH_METRES]) assert wavelen == pytest.approx(0.05627457792190739)
def _geotiff_multiprocessing(unw_path, params): """ Multiprocessing wrapper for full-res geotiff conversion """ # TODO: Need a more robust method for identifying coherence files. if params[cf.COH_FILE_DIR] and unw_path.endswith('.cc'): # If the user has provided a dir for coherence files, place # converted coherence files in that directory. dest = shared.output_tiff_filename(unw_path, params[cf.COH_FILE_DIR]) else: dest = shared.output_tiff_filename(unw_path, params[cf.OBS_DIR]) processor = params[cf.PROCESSOR] # roipac or gamma # Create full-res geotiff if not already on disk if not os.path.exists(dest): if processor == GAMMA: header = gamma.gamma_header(unw_path, params) elif processor == ROIPAC: header = roipac.roipac_header(unw_path, params) else: raise PreprocessError('Processor must be ROI_PAC (0) or GAMMA (1)') shared.write_fullres_geotiff(header, unw_path, dest, nodata=params[cf.NO_DATA_VALUE]) return dest else: log.info("Full-res geotiff already exists") return None
def test_bad_projection(self): hdr = self.DEM_HDR.copy() hdr[ifc.PYRATE_DATUM] = 'nonexistent projection' data_path = join(GAMMA_TEST_DIR, 'dem16x20raw.dem') self.dest = os.path.join(TEMPDIR, 'tmp_gamma_dem2.tif') with pytest.raises(GeotiffException): write_fullres_geotiff(hdr, data_path, self.dest, nodata=0)
def test_to_geotiff_ifg(self): # tricker: needs ifg header, and DEM one for extents hdrs = self.HDRS.copy() hdrs[ifc.PYRATE_DATUM] = 'WGS84' hdrs[ifc.DATA_TYPE] = ifc.ORIG self.dest = os.path.join('tmp_roipac_ifg.tif') data_path = join(PREP_TEST_OBS, 'geo_060619-061002.unw') write_fullres_geotiff(hdrs, data_path, self.dest, nodata=0) ds = gdal.Open(self.dest) band = ds.GetRasterBand(1) self.assertEqual(ds.RasterCount, 1) exp_path = join(PREP_TEST_TIF, 'geo_060619-061002_unw.tif') exp_ds = gdal.Open(exp_path) exp_band = exp_ds.GetRasterBand(1) # compare data and geographic headers assert_array_almost_equal(exp_band.ReadAsArray(), band.ReadAsArray()) self.compare_rasters(ds, exp_ds) md = ds.GetMetadata() date1 = date(2006, 6, 19) date2 = date(2006, 10, 2) diff = (date2 - date1).days self.assertTrue(md[ifc.MASTER_DATE] == str(date1)) self.assertTrue(md[ifc.SLAVE_DATE] == str(date2)) self.assertTrue(md[ifc.PYRATE_TIME_SPAN] == str(diff / ifc.DAYS_PER_YEAR)) wavelen = float(md[ifc.PYRATE_WAVELENGTH_METRES]) self.assertAlmostEqual(wavelen, 0.0562356424)
def _geotiff_multiprocessing(unw_path: MultiplePaths, params: dict) -> Tuple[str, bool]: """ Multiprocessing wrapper for full-res geotiff conversion """ # TODO: Need a more robust method for identifying coherence files. dest = unw_path.converted_path processor = params[C.PROCESSOR] # roipac or gamma # Create full-res geotiff if not already on disk if not os.path.exists(dest): if processor == GAMMA: header = gamma.gamma_header(unw_path.unwrapped_path, params) elif processor == ROIPAC: log.info( "Warning: ROI_PAC support will be deprecated in a future PyRate release" ) header = roipac.roipac_header(unw_path.unwrapped_path, params) else: raise PreprocessError('Processor must be ROI_PAC (0) or GAMMA (1)') header[ifc.INPUT_TYPE] = unw_path.input_type shared.write_fullres_geotiff(header, unw_path.unwrapped_path, dest, nodata=params[C.NO_DATA_VALUE]) Path(dest).chmod(0o444) # readonly output return dest, True else: log.warning( f"Full-res geotiff already exists in {dest}! Returning existing geotiff!" ) return dest, False
def test_to_geotiff_wrong_input_data(self): # use TIF, not UNW for data self.dest = os.path.join(TEMPDIR, 'tmp_gamma_ifg.tif') data_path = join(GAMMA_TEST_DIR, '16x20_20090713-20090817_VV_4rlks_utm.tif') with pytest.raises(GeotiffException): write_fullres_geotiff(self.COMBINED, data_path, self.dest, nodata=0)
def test_unw_contains_same_data_as_numpy_array(self): from datetime import time temp_unw = tempfile.mktemp(suffix='.unw') temp_tif = tempfile.mktemp(suffix='.tif') # setup some header files for use in write_geotif dem_header_file = common.SML_TEST_DEM_HDR_GAMMA dem_header = gamma.parse_dem_header(dem_header_file) header = gamma.parse_epoch_header( os.path.join(common.GAMMA_SML_TEST_DIR, '20060828_slc.par')) header.update(dem_header) base_header = gamma.parse_baseline_header( os.path.join(common.GAMMA_SML_TEST_DIR, '20060828-20061211_base.par')) header.update(base_header) # insert some dummy data so we are the dem in write_fullres_geotiff is not # not activated and ifg write_fullres_geotiff operation works header[ifc.PYRATE_TIME_SPAN] = 0 header[ifc.SECOND_DATE] = 0 header[ifc.DATA_UNITS] = 'degrees' header[ifc.DATA_TYPE] = ifc.ORIG header[ifc.SECOND_TIME] = time(10) # now create arbitrary data data = np.random.rand(dem_header[ifc.PYRATE_NROWS], dem_header[ifc.PYRATE_NCOLS]) # convert numpy array to .unw shared.write_unw_from_data_or_geotiff(geotif_or_data=data, dest_unw=temp_unw, ifg_proc=1) # convert the .unw to geotif shared.write_fullres_geotiff(header=header, data_path=temp_unw, dest=temp_tif, nodata=np.nan) # now compare geotiff with original numpy array ds = gdal.Open(temp_tif, gdal.GA_ReadOnly) data_lv_theta = ds.ReadAsArray() ds = None np.testing.assert_array_almost_equal(data, data_lv_theta) try: os.remove(temp_tif) except PermissionError: print("File opened by another process.") try: os.remove(temp_unw) except PermissionError: print("File opened by another process.")
def test_to_geotiff_dem(self): hdr = roipac.parse_header(SML_TEST_DEM_HDR) self.dest = os.path.join(TEMPDIR, "tmp_roipac_dem.tif") write_fullres_geotiff(hdr, SML_TEST_DEM_ROIPAC, self.dest, nodata=0) exp_path = join(SML_TEST_DEM_DIR, 'roipac_test_trimmed.tif') exp_ds = gdal.Open(exp_path) ds = gdal.Open(self.dest) # compare data and geographic headers assert_array_almost_equal(exp_ds.ReadAsArray(), ds.ReadAsArray()) self.compare_rasters(ds, exp_ds) self.assertIsNotNone(ds.GetMetadata())
def test_to_geotiff_dem(self): hdr_path = join(GAMMA_TEST_DIR, 'dem16x20raw.dem.par') hdr = gamma.parse_dem_header(hdr_path) data_path = join(GAMMA_TEST_DIR, 'dem16x20raw.dem') self.dest = os.path.join(TEMPDIR, "tmp_gamma_dem.tif") write_fullres_geotiff(hdr, data_path, self.dest, nodata=0) exp_path = join(GAMMA_TEST_DIR, 'dem16x20_subset_from_gamma.tif') exp_ds = gdal.Open(exp_path) ds = gdal.Open(self.dest) # compare data and geographic headers # HACK: round expected to nearest integer assert_array_almost_equal(np.rint(exp_ds.ReadAsArray()), ds.ReadAsArray()) self.compare_rasters(exp_ds, ds) md = ds.GetMetadata() assert md['AREA_OR_POINT'] == 'Area'