def test_different_projections_not_ok(self): """Validation: different projections not allowed by default. This test illustrates a bug we don't yet have a good solution for (natcap/invest#558) When ``different_projections_ok is False``, we don't check that the projections are actually the same, because there isn't a great way to do so. So there's the possibility that some bounding boxes overlap numerically, but have different projections, and thus pass validation when they shouldn't. """ from natcap.invest import validation driver = gdal.GetDriverByName('GTiff') filepath_1 = os.path.join(self.workspace_dir, 'raster_1.tif') filepath_2 = os.path.join(self.workspace_dir, 'raster_2.tif') # bounding boxes overlap if we don't account for the projections for filepath, geotransform, epsg in ((filepath_1, [1, 1, 0, 1, 0, 1], 4326), (filepath_2, [2, 1, 0, 2, 0, 1], 2193)): raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) wgs84_srs = osr.SpatialReference() wgs84_srs.ImportFromEPSG(epsg) raster.SetProjection(wgs84_srs.ExportToWkt()) raster.SetGeoTransform(geotransform) raster = None expected = (f'Spatial files {[filepath_1, filepath_2]} do not all ' 'have the same projection') self.assertEqual( validation.check_spatial_overlap([filepath_1, filepath_2]), expected)
def test_no_overlap(self): """Validation: verify lack of overlap.""" from natcap.invest import validation driver = gdal.GetDriverByName('GTiff') filepath_1 = os.path.join(self.workspace_dir, 'raster_1.tif') filepath_2 = os.path.join(self.workspace_dir, 'raster_2.tif') for filepath, geotransform in ((filepath_1, [1, 1, 0, 1, 0, 1]), (filepath_2, [100, 1, 0, 100, 0, 1])): raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) wgs84_srs = osr.SpatialReference() wgs84_srs.ImportFromEPSG(4326) raster.SetProjection(wgs84_srs.ExportToWkt()) raster.SetGeoTransform(geotransform) raster = None error_msg = validation.check_spatial_overlap([filepath_1, filepath_2]) self.assertTrue('Bounding boxes do not intersect' in error_msg)
def test_overlap(self): """Validation: verify overlap.""" from natcap.invest import validation driver = gdal.GetDriverByName('GTiff') filepath_1 = os.path.join(self.workspace_dir, 'raster_1.tif') filepath_2 = os.path.join(self.workspace_dir, 'raster_2.tif') for filepath, geotransform in ((filepath_1, [1, 1, 0, 1, 0, 1]), (filepath_2, [2, 1, 0, 2, 0, 1])): raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) wgs84_srs = osr.SpatialReference() wgs84_srs.ImportFromEPSG(4326) raster.SetProjection(wgs84_srs.ExportToWkt()) raster.SetGeoTransform(geotransform) raster = None self.assertEqual( None, validation.check_spatial_overlap([filepath_1, filepath_2]))
def test_no_overlap_with_reference(self): """Validation: verify lack of overlap given reference projection.""" from natcap.invest import validation driver = gdal.GetDriverByName('GTiff') filepath_1 = os.path.join(self.workspace_dir, 'raster_1.tif') filepath_2 = os.path.join(self.workspace_dir, 'raster_2.tif') reference_filepath = os.path.join(self.workspace_dir, 'reference.gpkg') # Filepaths 1 and 2 are obviously outside of UTM zone 31N. for filepath, geotransform, epsg_code in ( (filepath_1, [1, 1, 0, 1, 0, 1], 4326), (filepath_2, [100, 1, 0, 100, 0, 1], 4326)): raster = driver.Create(filepath, 3, 3, 1, gdal.GDT_Int32) wgs84_srs = osr.SpatialReference() wgs84_srs.ImportFromEPSG(epsg_code) raster.SetProjection(wgs84_srs.ExportToWkt()) raster.SetGeoTransform(geotransform) raster = None gpkg_driver = gdal.GetDriverByName('GPKG') vector = gpkg_driver.Create(reference_filepath, 0, 0, 0, gdal.GDT_Unknown) vector_srs = osr.SpatialReference() vector_srs.ImportFromEPSG(32731) # UTM 31N layer = vector.CreateLayer('layer', vector_srs, ogr.wkbPoint) new_feature = ogr.Feature(layer.GetLayerDefn()) new_feature.SetGeometry(ogr.CreateGeometryFromWkt('POINT 1 1')) new_feature = None layer = None vector = None error_msg = validation.check_spatial_overlap( [filepath_1, filepath_2, reference_filepath], vector_srs.ExportToWkt()) self.assertTrue('Bounding boxes do not intersect' in error_msg)
def test_check_overlap_undefined_projection(self): """Validation: check overlap of raster with an undefined projection.""" from natcap.invest import validation driver = gdal.GetDriverByName('GTiff') filepath_1 = os.path.join(self.workspace_dir, 'raster_1.tif') filepath_2 = os.path.join(self.workspace_dir, 'raster_2.tif') raster_1 = driver.Create(filepath_1, 3, 3, 1, gdal.GDT_Int32) wgs84_srs = osr.SpatialReference() wgs84_srs.ImportFromEPSG(4326) raster_1.SetProjection(wgs84_srs.ExportToWkt()) raster_1.SetGeoTransform([1, 1, 0, 1, 0, 1]) raster_1 = None # set up a raster with an undefined projection raster_2 = driver.Create(filepath_2, 3, 3, 1, gdal.GDT_Int32) raster_2.SetGeoTransform([2, 1, 0, 2, 0, 1]) raster_2 = None error_msg = validation.check_spatial_overlap( [filepath_1, filepath_2], different_projections_ok=True) expected = f'Spatial file {filepath_2} has no projection' self.assertEqual(error_msg, expected)