def test_gdal_transform_fail_src_crs(): with pytest.raises(CRSError): _calculate_default_transform('+proj=foobar', {'init': 'epsg:32610'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_dst_crs(): with pytest.raises(CRSError): _calculate_default_transform({'init': 'EPSG:4326'}, '+proj=foobar', width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_dst_crs(): with pytest.raises(CRSError): _calculate_default_transform( {'init': 'epsg:4326'}, '+proj=foobar', width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_src_crs(): with pytest.raises(CRSError): _calculate_default_transform( '+proj=foobar', {'init': 'EPSG:32610'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_identity_gcps(): """Define an identity transform using GCPs""" # Tile: [53, 96, 8] src_crs = dst_crs = 'EPSG:3857' width = height = 1000 left, bottom, right, top = (-11740727.544603072, 4852834.0517692715, -11584184.510675032, 5009377.085697309) # For comparison only, these are not used to calculate the transform. transform = from_bounds(left, bottom, right, top, width, height) # Define 4 ground control points at the corners of the image. gcps = [ GroundControlPoint(row=0, col=0, x=left, y=top, z=0.0), GroundControlPoint(row=0, col=1000, x=right, y=top, z=0.0), GroundControlPoint(row=1000, col=1000, x=right, y=bottom, z=0.0), GroundControlPoint(row=1000, col=0, x=left, y=bottom, z=0.0) ] # Compute an output transform. res_transform, res_width, res_height = _calculate_default_transform( src_crs, dst_crs, height=height, width=width, gcps=gcps) assert res_width == width assert res_height == height for res, exp in zip(res_transform, transform): assert round(res, 3) == round(exp, 3)
def test_identity_gcps(): """Define an identity transform using GCPs""" # Tile: [53, 96, 8] src_crs = dst_crs = 'EPSG:3857' width = height = 1000 left, bottom, right, top = ( -11740727.544603072, 4852834.0517692715, -11584184.510675032, 5009377.085697309) # For comparison only, these are not used to calculate the transform. transform = from_bounds(left, bottom, right, top, width, height) # Define 4 ground control points at the corners of the image. gcps = [ GroundControlPoint(row=0, col=0, x=left, y=top, z=0.0), GroundControlPoint(row=0, col=1000, x=right, y=top, z=0.0), GroundControlPoint(row=1000, col=1000, x=right, y=bottom, z=0.0), GroundControlPoint(row=1000, col=0, x=left, y=bottom, z=0.0)] # Compute an output transform. res_transform, res_width, res_height = _calculate_default_transform( src_crs, dst_crs, height=height, width=width, gcps=gcps) assert res_width == width assert res_height == height for res, exp in zip(res_transform, transform): assert round(res, 3) == round(exp, 3)
def test_gdal_transform_fail_dst_crs(): with Env(): dt, dw, dh = _calculate_default_transform({'init': 'EPSG:4326'}, '+proj=foobar', width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_src_crs(): with rasterio.Env(): dt, dw, dh = _calculate_default_transform('+proj=foobar', {'init': 'EPSG:32610'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_dst_crs_xfail(): with pytest.raises(CRSError): dt, dw, dh = _calculate_default_transform({'init': 'epsg:4326'}, {'proj': 'foobar'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_notnull(): dt, dw, dh = _calculate_default_transform(src_crs={'init': 'epsg:4326'}, dst_crs={'init': 'epsg:32610'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70) assert True
def test_gdal_transform_fail_src_crs(): with rasterio.Env(): with pytest.raises(CRSError): dt, dw, dh = _calculate_default_transform({'init': 'EPSG:4326'}, {'proj': 'foobar'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_dst_crs(): with rasterio.drivers(): dt, dw, dh = _calculate_default_transform( {'init': 'EPSG:4326'}, '+proj=foobar', width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_dst_crs_xfail(): with pytest.raises(CRSError): dt, dw, dh = _calculate_default_transform( {'init': 'EPSG:4326'}, {'proj': 'foobar'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_fail_src_crs(): with rasterio.Env(): dt, dw, dh = _calculate_default_transform( '+proj=foobar', {'init': 'EPSG:32610'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70)
def test_gdal_transform_notnull(): dt, dw, dh = _calculate_default_transform( src_crs={'init': 'EPSG:4326'}, dst_crs={'init': 'EPSG:32610'}, width=80, height=80, left=-120, bottom=30, right=-80, top=70) assert True
def test_identity(): """Get the same transform and dimensions back for same crs.""" # Tile: [53, 96, 8] src_crs = dst_crs = 'EPSG:3857' width = height = 1000 left, bottom, right, top = (-11740727.544603072, 4852834.0517692715, -11584184.510675032, 5009377.085697309) transform = from_bounds(left, bottom, right, top, width, height) res_transform, res_width, res_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top) assert res_width == width assert res_height == height for res, exp in zip(res_transform, transform): assert round(res, 3) == round(exp, 3)
def test_identity(): """Get the same transform and dimensions back for same crs.""" # Tile: [53, 96, 8] src_crs = dst_crs = 'EPSG:3857' width = height = 1000 left, bottom, right, top = ( -11740727.544603072, 4852834.0517692715, -11584184.510675032, 5009377.085697309) transform = from_bounds(left, bottom, right, top, width, height) res_transform, res_width, res_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top) assert res_width == width assert res_height == height for res, exp in zip(res_transform, transform): assert round(res, 3) == round(exp, 3)
def calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top, resolution=None): """Calculate parameters for reproject function. Transforms bounds to destination coordinate system, calculates resolution if not provided, and returns destination transform and dimensions. Intended to be used to calculate parameters for reproject function. Destination transform is anchored from the left, top coordinate. Destination width and height (and resolution if not provided), are calculated using GDAL's method for suggest warp output. Parameters ---------- src_crs: dict Source coordinate reference system, in rasterio dict format. Example: {'init': 'EPSG:4326'} dst_crs: dict Target coordinate reference system. width: int Source raster width. height: int Source raster height. left, bottom, right, top: float Bounding coordinates in src_crs, from the bounds property of a raster. resolution: tuple (x resolution, y resolution) or float, optional Target resolution, in units of target coordinate reference system. Returns ------- tuple of destination affine transform, width, and height Note ---- Should be called within a raster.env.Env() context Some behavior of this function is determined by the CHECK_WITH_INVERT_PROJ environment variable YES: constrain output raster to extents that can be inverted avoids visual artifacts and coordinate discontinuties. NO: reproject coordinates beyond valid bound limits """ dst_affine, dst_width, dst_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top) # If resolution is specified, Keep upper-left anchored # adjust the transform resolutions # adjust the width/height by the ratio of estimated:specified res (ceil'd) if resolution: # resolutions argument into tuple try: res = (float(resolution), float(resolution)) except TypeError: res = (resolution[0], resolution[0]) \ if len(resolution) == 1 else resolution[0:2] # Assume yres is provided as positive, # needs to be negative for north-up affine xres = res[0] yres = -res[1] xratio = dst_affine.a / xres yratio = dst_affine.e / yres dst_affine = Affine(xres, dst_affine.b, dst_affine.c, dst_affine.d, yres, dst_affine.f) dst_width = ceil(dst_width * xratio) dst_height = ceil(dst_height * yratio) return dst_affine, dst_width, dst_height
def calculate_default_transform(src_crs, dst_crs, width, height, left, bottom, right, top, resolution=None): """Calculate parameters for reproject function. Transforms bounds to destination coordinate system, calculates resolution if not provided, and returns destination transform and dimensions. Intended to be used to calculate parameters for reproject function. Destination transform is anchored from the left, top coordinate. Destination width and height (and resolution if not provided), are calculated using GDAL's method for suggest warp output. Parameters ---------- src_crs: CRS or dict Source coordinate reference system, in rasterio dict format. Example: CRS({'init': 'EPSG:4326'}) dst_crs: CRS or dict Target coordinate reference system. width: int Source raster width. height: int Source raster height. left, bottom, right, top: float Bounding coordinates in src_crs, from the bounds property of a raster. resolution: tuple (x resolution, y resolution) or float, optional Target resolution, in units of target coordinate reference system. Returns ------- tuple Three elements: ``affine transform, width, and height`` Note ---- Should be called within a rasterio.Env() context Some behavior of this function is determined by the CHECK_WITH_INVERT_PROJ environment variable YES: constrain output raster to extents that can be inverted avoids visual artifacts and coordinate discontinuties. NO: reproject coordinates beyond valid bound limits """ dst_affine, dst_width, dst_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top) # If resolution is specified, Keep upper-left anchored # adjust the transform resolutions # adjust the width/height by the ratio of estimated:specified res (ceil'd) if resolution: # resolutions argument into tuple try: res = (float(resolution), float(resolution)) except TypeError: res = (resolution[0], resolution[0]) \ if len(resolution) == 1 else resolution[0:2] # Assume yres is provided as positive, # needs to be negative for north-up affine xres = res[0] yres = -res[1] xratio = dst_affine.a / xres yratio = dst_affine.e / yres dst_affine = Affine(xres, dst_affine.b, dst_affine.c, dst_affine.d, yres, dst_affine.f) dst_width = ceil(dst_width * xratio) dst_height = ceil(dst_height * yratio) return dst_affine, dst_width, dst_height
def calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top, resolution=None): """ Transforms bounds to destination coordinate system, calculates resolution if not provided, and returns destination transform and dimensions. Intended to be used to calculate parameters for reproject function. Destination transform is anchored from the left, top coordinate. Destination width and height (and resolution if not provided), are calculated using GDAL's method for suggest warp output. Parameters ---------- src_crs: dict Source coordinate reference system, in rasterio dict format. Example: {'init': 'EPSG:4326'} dst_crs: dict Target coordinate reference system. width: int Source raster width. height: int Source raster height. left, bottom, right, top: float Bounding coordinates in src_crs, from the bounds property of a raster. resolution: tuple (x resolution, y resolution) or float, optional Target resolution, in units of target coordinate reference system. Returns ------- tuple of destination affine transform, width, and height """ with rasterio.drivers(): dst_affine, dst_width, dst_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top) # If resolution is specified, Keep upper-left anchored # adjust the transform resolutions # adjust the width/height by the ratio of estimated:specified res (ceil'd) if resolution: # resolutions argument into tuple try: res = (float(resolution), float(resolution)) except TypeError: res = (resolution[0], resolution[0]) \ if len(resolution) == 1 else resolution[0:2] # Assume yres is provided as positive, # needs to be negative for north-up affine xres = res[0] yres = -res[1] xratio = dst_affine.a / xres yratio = dst_affine.e / yres dst_affine = Affine(xres, dst_affine.b, dst_affine.c, dst_affine.d, yres, dst_affine.f) dst_width = ceil(dst_width * xratio) dst_height = ceil(dst_height * yratio) return dst_affine, dst_width, dst_height
def calculate_default_transform(src_crs, dst_crs, width, height, left=None, bottom=None, right=None, top=None, gcps=None, resolution=None): """Output dimensions and transform for a reprojection. Source and destination coordinate reference systems and output width and height are the first four, required, parameters. Source georeferencing can be specified using either ground control points (gcps) or spatial bounds (left, bottom, right, top). These two forms of georeferencing are mutually exclusive. The destination transform is anchored at the left, top coordinate. Destination width and height (and resolution if not provided), are calculated using GDAL's method for suggest warp output. Parameters ---------- src_crs: CRS or dict Source coordinate reference system, in rasterio dict format. Example: CRS({'init': 'EPSG:4326'}) dst_crs: CRS or dict Target coordinate reference system. width, height: int Source raster width and height. left, bottom, right, top: float, optional Bounding coordinates in src_crs, from the bounds property of a raster. Required unless using gcps. gcps: sequence of GroundControlPoint, optional Instead of a bounding box for the source, a sequence of ground control points may be provided. resolution: tuple (x resolution, y resolution) or float, optional Target resolution, in units of target coordinate reference system. Returns ------- transform: Affine Output affine transformation matrix width, height: int Output dimensions Notes ----- Some behavior of this function is determined by the CHECK_WITH_INVERT_PROJ environment variable: YES: constrain output raster to extents that can be inverted avoids visual artifacts and coordinate discontinuties. NO: reproject coordinates beyond valid bound limits """ if any(x is not None for x in (left, bottom, right, top)) and gcps: raise ValueError("Bounding values and ground control points may not" "be used together.") if any(x is None for x in (left, bottom, right, top)) and not gcps: raise ValueError("Either four bounding values or ground control points" "must be specified") dst_affine, dst_width, dst_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top, gcps) # If resolution is specified, Keep upper-left anchored # adjust the transform resolutions # adjust the width/height by the ratio of estimated:specified res (ceil'd) if resolution: # resolutions argument into tuple try: res = (float(resolution), float(resolution)) except TypeError: res = (resolution[0], resolution[0]) \ if len(resolution) == 1 else resolution[0:2] # Assume yres is provided as positive, # needs to be negative for north-up affine xres = res[0] yres = -res[1] xratio = dst_affine.a / xres yratio = dst_affine.e / yres dst_affine = Affine(xres, dst_affine.b, dst_affine.c, dst_affine.d, yres, dst_affine.f) dst_width = ceil(dst_width * xratio) dst_height = ceil(dst_height * yratio) return dst_affine, dst_width, dst_height
def calculate_default_transform(src_crs, dst_crs, width, height, left=None, bottom=None, right=None, top=None, gcps=None, resolution=None): """Output dimensions and transform for a reprojection. Source and destination coordinate reference systems and output width and height are the first four, required, parameters. Source georeferencing can be specified using either ground control points (gcps) or spatial bounds (left, bottom, right, top). These two forms of georeferencing are mutually exclusive. The destination transform is anchored at the left, top coordinate. Destination width and height (and resolution if not provided), are calculated using GDAL's method for suggest warp output. Parameters ---------- src_crs: CRS or dict Source coordinate reference system, in rasterio dict format. Example: CRS({'init': 'EPSG:4326'}) dst_crs: CRS or dict Target coordinate reference system. width, height: int Source raster width and height. left, bottom, right, top: float, optional Bounding coordinates in src_crs, from the bounds property of a raster. Required unless using gcps. gcps: sequence of GroundControlPoint, optional Instead of a bounding box for the source, a sequence of ground control points may be provided. resolution: tuple (x resolution, y resolution) or float, optional Target resolution, in units of target coordinate reference system. Returns ------- transform: Affine Output affine transformation matrix width, height: int Output dimesions Notes ----- Some behavior of this function is determined by the CHECK_WITH_INVERT_PROJ environment variable: YES: constrain output raster to extents that can be inverted avoids visual artifacts and coordinate discontinuties. NO: reproject coordinates beyond valid bound limits """ if any(x is not None for x in (left, bottom, right, top)) and gcps: raise ValueError("Bounding values and ground control points may not" "be used together.") if any(x is None for x in (left, bottom, right, top)) and not gcps: raise ValueError("Either four bounding values or ground control points" "must be specified") dst_affine, dst_width, dst_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top, gcps) # If resolution is specified, Keep upper-left anchored # adjust the transform resolutions # adjust the width/height by the ratio of estimated:specified res (ceil'd) if resolution: # resolutions argument into tuple try: res = (float(resolution), float(resolution)) except TypeError: res = (resolution[0], resolution[0]) \ if len(resolution) == 1 else resolution[0:2] # Assume yres is provided as positive, # needs to be negative for north-up affine xres = res[0] yres = -res[1] xratio = dst_affine.a / xres yratio = dst_affine.e / yres dst_affine = Affine(xres, dst_affine.b, dst_affine.c, dst_affine.d, yres, dst_affine.f) dst_width = ceil(dst_width * xratio) dst_height = ceil(dst_height * yratio) return dst_affine, dst_width, dst_height
def calculate_default_transform(src_crs, dst_crs, width, height, left, bottom, right, top, resolution=None): """ Transforms bounds to destination coordinate system, calculates resolution if not provided, and returns destination transform and dimensions. Intended to be used to calculate parameters for reproject function. Destination transform is anchored from the left, top coordinate. Destination width and height (and resolution if not provided), are calculated using GDAL's method for suggest warp output. Parameters ---------- src_crs: dict Source coordinate reference system, in rasterio dict format. Example: {'init': 'EPSG:4326'} dst_crs: dict Target coordinate reference system. width: int Source raster width. height: int Source raster height. left, bottom, right, top: float Bounding coordinates in src_crs, from the bounds property of a raster. resolution: tuple (x resolution, y resolution) or float, optional Target resolution, in units of target coordinate reference system. Returns ------- tuple of destination affine transform, width, and height """ with rasterio.drivers(): dst_affine, dst_width, dst_height = _calculate_default_transform( src_crs, dst_crs, width, height, left, bottom, right, top) # If resolution is specified, Keep upper-left anchored # adjust the transform resolutions # adjust the width/height by the ratio of estimated:specified res (ceil'd) if resolution: # resolutions argument into tuple try: res = (float(resolution), float(resolution)) except TypeError: res = (resolution[0], resolution[0]) \ if len(resolution) == 1 else resolution[0:2] # Assume yres is provided as positive, # needs to be negative for north-up affine xres = res[0] yres = -res[1] xratio = dst_affine.a / xres yratio = dst_affine.e / yres dst_affine = Affine(xres, dst_affine.b, dst_affine.c, dst_affine.d, yres, dst_affine.f) dst_width = ceil(dst_width * xratio) dst_height = ceil(dst_height * yratio) return dst_affine, dst_width, dst_height