def test_raster_projected_in_m(self): """Validation: test when a raster is projected in meters.""" from natcap.invest import validation # Use EPSG:32731 # WGS84 / UTM zone 31s driver = gdal.GetDriverByName('GTiff') filepath = os.path.join(self.workspace_dir, 'raster.tif') raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) meters_srs = osr.SpatialReference() meters_srs.ImportFromEPSG(32731) raster.SetProjection(meters_srs.ExportToWkt()) raster = None for unit in ('m', 'meter', 'metre', 'meters', 'metres'): error_msg = validation.check_raster(filepath, projected=True, projection_units=unit) self.assertEqual(error_msg, None) # Check error message when we validate that the raster should be # projected in feet. error_msg = validation.check_raster(filepath, projected=True, projection_units='feet') self.assertTrue('projected in feet' in error_msg)
def test_file_not_found(self): """Validation: test that a raster exists.""" from natcap.invest import validation filepath = os.path.join(self.workspace_dir, 'file.txt') error_msg = validation.check_raster(filepath) self.assertTrue('not found' in error_msg)
def test_invalid_raster(self): """Validation: test when a raster format is invalid.""" from natcap.invest import validation filepath = os.path.join(self.workspace_dir, 'file.txt') with open(filepath, 'w') as bad_raster: bad_raster.write('not a raster') error_msg = validation.check_raster(filepath) self.assertTrue('could not be opened as a GDAL raster' in error_msg)
def test_raster_not_projected(self): """Validation: test when a raster is not linearly projected.""" from natcap.invest import validation # use WGS84 as not linearly projected. driver = gdal.GetDriverByName('GTiff') filepath = os.path.join(self.workspace_dir, 'raster.tif') raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) wgs84_srs = osr.SpatialReference() wgs84_srs.ImportFromEPSG(4326) raster.SetProjection(wgs84_srs.ExportToWkt()) raster = None error_msg = validation.check_raster(filepath, projected=True) self.assertTrue('must be projected in linear units' in error_msg)
def test_raster_incorrect_units(self): """Validation: test when a raster projection has wrong units.""" from natcap.invest import validation # Use EPSG:32066 # NAD27 / BLM 16N (in US Feet) driver = gdal.GetDriverByName('GTiff') filepath = os.path.join(self.workspace_dir, 'raster.tif') raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) wgs84_srs = osr.SpatialReference() wgs84_srs.ImportFromEPSG(32066) raster.SetProjection(wgs84_srs.ExportToWkt()) raster = None error_msg = validation.check_raster( filepath, projected=True, projection_units='m') self.assertTrue('must be projected in meters' in error_msg)
def test_invalid_ovr_raster(self): """Validation: test when a .tif.ovr file is input as a raster.""" from natcap.invest import validation # Use EPSG:32731 # WGS84 / UTM zone 31s driver = gdal.GetDriverByName('GTiff') filepath = os.path.join(self.workspace_dir, 'raster.tif') raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) meters_srs = osr.SpatialReference() meters_srs.ImportFromEPSG(32731) raster.SetProjection(meters_srs.ExportToWkt()) raster = None # I could only create overviews when opening the file, not on creation. # Build overviews taken from: # https://gis.stackexchange.com/questions/270498/compress-gtiff-external-overviews-with-gdal-api raster = gdal.OpenEx(filepath) gdal.SetConfigOption("COMPRESS_OVERVIEW", "DEFLATE") raster.BuildOverviews("AVERAGE", [2, 4, 8, 16, 32, 64, 128, 256]) raster = None filepath_ovr = os.path.join(self.workspace_dir, 'raster.tif.ovr') error_msg = validation.check_raster(filepath_ovr) self.assertTrue('File found to be an overview' in error_msg)