def rasterize(shapes, out_shape=None, fill=0, out=None, transform=IDENTITY, all_touched=False, merge_alg=MergeAlg.replace, default_value=1, dtype=None): """Return an image array with input geometries burned in. Warnings will be raised for any invalid or empty geometries, and an exception will be raised if there are no valid shapes to rasterize. Parameters ---------- shapes : iterable of (`geometry`, `value`) pairs or iterable over geometries. The `geometry` can either be an object that implements the geo interface or GeoJSON-like object. If no `value` is provided the `default_value` will be used. If `value` is `None` the `fill` value will be used. out_shape : tuple or list with 2 integers Shape of output numpy ndarray. fill : int or float, optional Used as fill value for all areas not covered by input geometries. out : numpy ndarray, optional Array of same shape and data type as `source` in which to store results. transform : Affine transformation object, optional Transformation from pixel coordinates of `source` to the coordinate system of the input `shapes`. See the `transform` property of dataset objects. all_touched : boolean, optional If True, all pixels touched by geometries will be burned in. If false, only pixels whose center is within the polygon or that are selected by Bresenham's line algorithm will be burned in. merge_alg : MergeAlg, optional Merge algorithm to use. One of: MergeAlg.replace (default): the new value will overwrite the existing value. MergeAlg.add: the new value will be added to the existing raster. default_value : int or float, optional Used as value for all geometries, if not provided in `shapes`. dtype : rasterio or numpy data type, optional Used as data type for results, if `out` is not provided. Returns ------- numpy ndarray If `out` was not None then `out` is returned, it will have been modified in-place. If `out` was None, this will be a new array. Notes ----- Valid data types for `fill`, `default_value`, `out`, `dtype` and shape values are "int16", "int32", "uint8", "uint16", "uint32", "float32", and "float64". This function requires significant memory resources. The shapes iterator will be materialized to a Python list and another C copy of that list will be made. The `out` array will be copied and additional temporary raster memory equal to 2x the smaller of `out` data or GDAL's max cache size (controlled by GDAL_CACHEMAX, default is 5% of the computer's physical memory) is required. If GDAL max cache size is smaller than the output data, the array of shapes will be iterated multiple times. Performance is thus a linear function of buffer size. For maximum speed, ensure that GDAL_CACHEMAX is larger than the size of `out` or `out_shape`. """ valid_dtypes = ('int16', 'int32', 'uint8', 'uint16', 'uint32', 'float32', 'float64') def format_invalid_dtype(param): return '{0} dtype must be one of: {1}'.format(param, ', '.join(valid_dtypes)) def format_cast_error(param, dtype): return '{0} cannot be cast to specified dtype: {1}'.format( param, dtype) if fill != 0: fill_array = np.array([fill]) if not validate_dtype(fill_array, valid_dtypes): raise ValueError(format_invalid_dtype('fill')) if dtype is not None and not can_cast_dtype(fill_array, dtype): raise ValueError(format_cast_error('fill', dtype)) if default_value != 1: default_value_array = np.array([default_value]) if not validate_dtype(default_value_array, valid_dtypes): raise ValueError(format_invalid_dtype('default_value')) if dtype is not None and not can_cast_dtype(default_value_array, dtype): raise ValueError(format_cast_error('default_vaue', dtype)) if dtype is not None and np.dtype(dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('dtype')) valid_shapes = [] shape_values = [] for index, item in enumerate(shapes): if isinstance(item, (tuple, list)): geom, value = item if value is None: value = fill else: geom = item value = default_value geom = getattr(geom, '__geo_interface__', None) or geom if is_valid_geom(geom): shape_values.append(value) geom_type = geom['type'] if geom_type == 'GeometryCollection': # GeometryCollections need to be handled as individual parts to # avoid holes in output: # https://github.com/mapbox/rasterio/issues/1253. # Only 1-level deep since GeoJSON spec discourages nested # GeometryCollections for part in geom['geometries']: valid_shapes.append((part, value)) elif geom_type == 'MultiPolygon': # Same issue as above for poly in geom['coordinates']: valid_shapes.append(({ 'type': 'Polygon', 'coordinates': poly }, value)) else: valid_shapes.append((geom, value)) else: # invalid or empty geometries are skipped and raise a warning instead warnings.warn( 'Invalid or empty shape {} at index {} will not be rasterized.' .format(geom, index), ShapeSkipWarning) if not valid_shapes: raise ValueError('No valid geometry objects found for rasterize') shape_values = np.array(shape_values) if not validate_dtype(shape_values, valid_dtypes): raise ValueError(format_invalid_dtype('shape values')) if dtype is None: dtype = get_minimum_dtype(np.append(shape_values, fill)) elif not can_cast_dtype(shape_values, dtype): raise ValueError(format_cast_error('shape values', dtype)) if out is not None: if np.dtype(out.dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('out')) if not can_cast_dtype(shape_values, out.dtype): raise ValueError(format_cast_error('shape values', out.dtype.name)) elif out_shape is not None: if len(out_shape) != 2: raise ValueError('Invalid out_shape, must be 2D') out = np.empty(out_shape, dtype=dtype) out.fill(fill) else: raise ValueError('Either an out_shape or image must be provided') if min(out.shape) == 0: raise ValueError("width and height must be > 0") transform = guard_transform(transform) _rasterize(valid_shapes, out, transform, all_touched, merge_alg) return out
def rasterize(shapes, out_shape=None, fill=0, out=None, transform=IDENTITY, all_touched=False, merge_alg='replace', default_value=1, dtype=None): """Return an image array with input geometries burned in. Parameters ---------- shapes : iterable of (geometry, value) pairs or iterable over geometries. `geometry` can either be an object that implements the geo interface or GeoJSON-like object. out_shape : tuple or list with 2 integers Shape of output numpy ndarray. fill : int or float, optional Used as fill value for all areas not covered by input geometries. out : numpy ndarray, optional Array of same shape and data type as `image` in which to store results. transform : Affine transformation object, optional Transformation from pixel coordinates of `image` to the coordinate system of the input `shapes`. See the `transform` property of dataset objects. all_touched : boolean, optional If True, all pixels touched by geometries will be burned in. If false, only pixels whose center is within the polygon or that are selected by Bresenham's line algorithm will be burned in. merge_alg : str, optional If `replace` (default), the new value will overwrite the existing value. If `add`, the new value will be added to the existing raster. default_value : int or float, optional Used as value for all geometries, if not provided in `shapes`. dtype : rasterio or numpy data type, optional Used as data type for results, if `out` is not provided. Returns ------- out : numpy ndarray Results Notes ----- Valid data types for `fill`, `default_value`, `out`, `dtype` and shape values are rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, rasterio.uint32, rasterio.float32, rasterio.float64. """ valid_dtypes = ('int16', 'int32', 'uint8', 'uint16', 'uint32', 'float32', 'float64') def format_invalid_dtype(param): return '{0} dtype must be one of: {1}'.format(param, ', '.join(valid_dtypes)) def format_cast_error(param, dtype): return '{0} cannot be cast to specified dtype: {1}'.format( param, dtype) if fill != 0: fill_array = np.array([fill]) if not validate_dtype(fill_array, valid_dtypes): raise ValueError(format_invalid_dtype('fill')) if dtype is not None and not can_cast_dtype(fill_array, dtype): raise ValueError(format_cast_error('fill', dtype)) if default_value != 1: default_value_array = np.array([default_value]) if not validate_dtype(default_value_array, valid_dtypes): raise ValueError(format_invalid_dtype('default_value')) if dtype is not None and not can_cast_dtype(default_value_array, dtype): raise ValueError(format_cast_error('default_vaue', dtype)) if dtype is not None and np.dtype(dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('dtype')) valid_shapes = [] shape_values = [] for index, item in enumerate(shapes): if isinstance(item, (tuple, list)): geom, value = item else: geom = item value = default_value geom = getattr(geom, '__geo_interface__', None) or geom # geom must be a valid GeoJSON geometry type and non-empty if not is_valid_geom(geom): raise ValueError( 'Invalid geometry object at index {0}'.format(index)) valid_shapes.append((geom, value)) shape_values.append(value) if not valid_shapes: raise ValueError('No valid geometry objects found for rasterize') shape_values = np.array(shape_values) if not validate_dtype(shape_values, valid_dtypes): raise ValueError(format_invalid_dtype('shape values')) if dtype is None: dtype = get_minimum_dtype(np.append(shape_values, fill)) elif not can_cast_dtype(shape_values, dtype): raise ValueError(format_cast_error('shape values', dtype)) if out is not None: if np.dtype(out.dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('out')) if not can_cast_dtype(shape_values, out.dtype): raise ValueError(format_cast_error('shape values', out.dtype.name)) elif out_shape is not None: if len(out_shape) != 2: raise ValueError('Invalid out_shape, must be 2D') out = np.empty(out_shape, dtype=dtype) out.fill(fill) else: raise ValueError('Either an out_shape or image must be provided') if min(out.shape) == 0: raise ValueError("width and height must be > 0") transform = guard_transform(transform) _rasterize(valid_shapes, out, transform.to_gdal(), all_touched, merge_alg) return out
def rasterize(shapes, out_shape=None, fill=0, out=None, transform=IDENTITY, all_touched=False, merge_alg=MergeAlg.replace, default_value=1, dtype=None): """Return an image array with input geometries burned in. Warnings will be raised for any invalid or empty geometries, and an exception will be raised if there are no valid shapes to rasterize. Parameters ---------- shapes : iterable of (geometry, value) pairs or iterable over geometries. `geometry` can either be an object that implements the geo interface or GeoJSON-like object. out_shape : tuple or list with 2 integers Shape of output numpy ndarray. fill : int or float, optional Used as fill value for all areas not covered by input geometries. out : numpy ndarray, optional Array of same shape and data type as `source` in which to store results. transform : Affine transformation object, optional Transformation from pixel coordinates of `source` to the coordinate system of the input `shapes`. See the `transform` property of dataset objects. all_touched : boolean, optional If True, all pixels touched by geometries will be burned in. If false, only pixels whose center is within the polygon or that are selected by Bresenham's line algorithm will be burned in. merge_alg : MergeAlg, optional Merge algorithm to use. One of: MergeAlg.replace (default): the new value will overwrite the existing value. MergeAlg.add: the new value will be added to the existing raster. default_value : int or float, optional Used as value for all geometries, if not provided in `shapes`. dtype : rasterio or numpy data type, optional Used as data type for results, if `out` is not provided. Returns ------- out : numpy ndarray Results Notes ----- Valid data types for `fill`, `default_value`, `out`, `dtype` and shape values are rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, rasterio.uint32, rasterio.float32, rasterio.float64. """ valid_dtypes = ('int16', 'int32', 'uint8', 'uint16', 'uint32', 'float32', 'float64') def format_invalid_dtype(param): return '{0} dtype must be one of: {1}'.format(param, ', '.join(valid_dtypes)) def format_cast_error(param, dtype): return '{0} cannot be cast to specified dtype: {1}'.format( param, dtype) if fill != 0: fill_array = np.array([fill]) if not validate_dtype(fill_array, valid_dtypes): raise ValueError(format_invalid_dtype('fill')) if dtype is not None and not can_cast_dtype(fill_array, dtype): raise ValueError(format_cast_error('fill', dtype)) if default_value != 1: default_value_array = np.array([default_value]) if not validate_dtype(default_value_array, valid_dtypes): raise ValueError(format_invalid_dtype('default_value')) if dtype is not None and not can_cast_dtype(default_value_array, dtype): raise ValueError(format_cast_error('default_vaue', dtype)) if dtype is not None and np.dtype(dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('dtype')) valid_shapes = [] shape_values = [] for index, item in enumerate(shapes): if isinstance(item, (tuple, list)): geom, value = item else: geom = item value = default_value geom = getattr(geom, '__geo_interface__', None) or geom if is_valid_geom(geom): shape_values.append(value) if geom['type'] == 'GeometryCollection': # GeometryCollections need to be handled as individual parts to # avoid holes in output: # https://github.com/mapbox/rasterio/issues/1253. # Only 1-level deep since GeoJSON spec discourages nested # GeometryCollections for part in geom['geometries']: valid_shapes.append((part, value)) else: valid_shapes.append((geom, value)) else: # invalid or empty geometries are skipped and raise a warning instead warnings.warn( 'Invalid or empty shape at index {} will not be rasterized.'. format(index)) if not valid_shapes: raise ValueError('No valid geometry objects found for rasterize') shape_values = np.array(shape_values) if not validate_dtype(shape_values, valid_dtypes): raise ValueError(format_invalid_dtype('shape values')) if dtype is None: dtype = get_minimum_dtype(np.append(shape_values, fill)) elif not can_cast_dtype(shape_values, dtype): raise ValueError(format_cast_error('shape values', dtype)) if out is not None: if np.dtype(out.dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('out')) if not can_cast_dtype(shape_values, out.dtype): raise ValueError(format_cast_error('shape values', out.dtype.name)) elif out_shape is not None: if len(out_shape) != 2: raise ValueError('Invalid out_shape, must be 2D') out = np.empty(out_shape, dtype=dtype) out.fill(fill) else: raise ValueError('Either an out_shape or image must be provided') if min(out.shape) == 0: raise ValueError("width and height must be > 0") transform = guard_transform(transform) _rasterize(valid_shapes, out, transform, all_touched, merge_alg) return out
def rasterize( shapes, out_shape=None, fill=0, out=None, output=None, transform=IDENTITY, all_touched=False, default_value=1, dtype=None): """Return an image array with input geometries burned in. Parameters ---------- shapes : iterable of (geometry, value) pairs or iterable over geometries. `geometry` can either be an object that implements the geo interface or GeoJSON-like object. out_shape : tuple or list Shape of output numpy ndarray. fill : int or float, optional Used as fill value for all areas not covered by input geometries. out : numpy ndarray, optional Array of same shape and data type as `image` in which to store results. output : older alias for `out`, will be removed before 1.0. transform : Affine transformation object, optional Transformation from pixel coordinates of `image` to the coordinate system of the input `shapes`. See the `transform` property of dataset objects. all_touched : boolean, optional If True, all pixels touched by geometries will be burned in. If false, only pixels whose center is within the polygon or that are selected by Bresenham's line algorithm will be burned in. default_value : int or float, optional Used as value for all geometries, if not provided in `shapes`. dtype : rasterio or numpy data type, optional Used as data type for results, if `out` is not provided. Returns ------- out : numpy ndarray Results Notes ----- Valid data types for `fill`, `default_value`, `out`, `dtype` and shape values are rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, rasterio.uint32, rasterio.float32, rasterio.float64. """ valid_dtypes = ( 'int16', 'int32', 'uint8', 'uint16', 'uint32', 'float32', 'float64' ) def format_invalid_dtype(param): return '{0} dtype must be one of: {1}'.format( param, ', '.join(valid_dtypes) ) def format_cast_error(param, dtype): return '{0} cannot be cast to specified dtype: {1}'.format(param, dtype) if fill != 0: fill_array = np.array([fill]) if not validate_dtype(fill_array, valid_dtypes): raise ValueError(format_invalid_dtype('fill')) if dtype is not None and not can_cast_dtype(fill_array, dtype): raise ValueError(format_cast_error('fill', dtype)) if default_value != 1: default_value_array = np.array([default_value]) if not validate_dtype(default_value_array, valid_dtypes): raise ValueError(format_invalid_dtype('default_value')) if dtype is not None and not can_cast_dtype(default_value_array, dtype): raise ValueError(format_cast_error('default_vaue', dtype)) if dtype is not None and np.dtype(dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('dtype')) valid_shapes = [] shape_values = [] for index, item in enumerate(shapes): if isinstance(item, (tuple, list)): geom, value = item else: geom = item value = default_value geom = getattr(geom, '__geo_interface__', None) or geom # not isinstance(geom, dict) or if 'type' in geom or 'coordinates' in geom: valid_shapes.append((geom, value)) shape_values.append(value) else: raise ValueError( 'Invalid geometry object at index {0}'.format(index) ) if not valid_shapes: raise ValueError('No valid geometry objects found for rasterize') shape_values = np.array(shape_values) if not validate_dtype(shape_values, valid_dtypes): raise ValueError(format_invalid_dtype('shape values')) if dtype is None: dtype = get_minimum_dtype(np.append(shape_values, fill)) elif not can_cast_dtype(shape_values, dtype): raise ValueError(format_cast_error('shape values', dtype)) if output is not None: warnings.warn( "The 'output' keyword arg has been superseded by 'out' " "and will be removed before Rasterio 1.0.", FutureWarning, stacklevel=2) # pragma: no cover out = out if out is not None else output if out is not None: if np.dtype(out.dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('out')) if not can_cast_dtype(shape_values, out.dtype): raise ValueError(format_cast_error('shape values', out.dtype.name)) elif out_shape is not None: out = np.empty(out_shape, dtype=dtype) out.fill(fill) else: raise ValueError('Either an output shape or image must be provided') transform = guard_transform(transform) with rasterio.drivers(): _rasterize(valid_shapes, out, transform.to_gdal(), all_touched) return out
def test_validate_dtype(): assert validate_dtype([1, 2, 3], ('uint8', 'uint16')) == True assert validate_dtype(np.array([1, 2, 3]), ('uint8', 'uint16')) == True assert validate_dtype(np.array([1.4, 2.1, 3.65]), ('float32',)) == True assert validate_dtype(np.array([1.4, 2.1, 3.65]), ('uint8',)) == False
def test_validate_dtype(): assert validate_dtype([1, 2, 3], ('uint8', 'uint16')) assert validate_dtype(np.array([1, 2, 3]), ('uint8', 'uint16')) assert validate_dtype(np.array([1.4, 2.1, 3.65]), ('float32',)) assert not validate_dtype(np.array([1.4, 2.1, 3.65]), ('uint8',))
def rasterize( shapes, out_shape=None, fill=0, out=None, transform=IDENTITY, all_touched=False, merge_alg=MergeAlg.replace, default_value=1, dtype=None): """Return an image array with input geometries burned in. Parameters ---------- shapes : iterable of (geometry, value) pairs or iterable over geometries. `geometry` can either be an object that implements the geo interface or GeoJSON-like object. out_shape : tuple or list with 2 integers Shape of output numpy ndarray. fill : int or float, optional Used as fill value for all areas not covered by input geometries. out : numpy ndarray, optional Array of same shape and data type as `source` in which to store results. transform : Affine transformation object, optional Transformation from pixel coordinates of `source` to the coordinate system of the input `shapes`. See the `transform` property of dataset objects. all_touched : boolean, optional If True, all pixels touched by geometries will be burned in. If false, only pixels whose center is within the polygon or that are selected by Bresenham's line algorithm will be burned in. merge_alg : MergeAlg, optional Merge algorithm to use. One of: MergeAlg.replace (default): the new value will overwrite the existing value. MergeAlg.add: the new value will be added to the existing raster. default_value : int or float, optional Used as value for all geometries, if not provided in `shapes`. dtype : rasterio or numpy data type, optional Used as data type for results, if `out` is not provided. Returns ------- out : numpy ndarray Results Notes ----- Valid data types for `fill`, `default_value`, `out`, `dtype` and shape values are rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, rasterio.uint32, rasterio.float32, rasterio.float64. """ valid_dtypes = ( 'int16', 'int32', 'uint8', 'uint16', 'uint32', 'float32', 'float64' ) def format_invalid_dtype(param): return '{0} dtype must be one of: {1}'.format( param, ', '.join(valid_dtypes) ) def format_cast_error(param, dtype): return '{0} cannot be cast to specified dtype: {1}'.format(param, dtype) if fill != 0: fill_array = np.array([fill]) if not validate_dtype(fill_array, valid_dtypes): raise ValueError(format_invalid_dtype('fill')) if dtype is not None and not can_cast_dtype(fill_array, dtype): raise ValueError(format_cast_error('fill', dtype)) if default_value != 1: default_value_array = np.array([default_value]) if not validate_dtype(default_value_array, valid_dtypes): raise ValueError(format_invalid_dtype('default_value')) if dtype is not None and not can_cast_dtype(default_value_array, dtype): raise ValueError(format_cast_error('default_vaue', dtype)) if dtype is not None and np.dtype(dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('dtype')) valid_shapes = [] shape_values = [] for index, item in enumerate(shapes): if isinstance(item, (tuple, list)): geom, value = item else: geom = item value = default_value geom = getattr(geom, '__geo_interface__', None) or geom # geom must be a valid GeoJSON geometry type and non-empty if not is_valid_geom(geom): raise ValueError( 'Invalid geometry object at index {0}'.format(index) ) if geom['type'] == 'GeometryCollection': # GeometryCollections need to be handled as individual parts to # avoid holes in output: # https://github.com/mapbox/rasterio/issues/1253. # Only 1-level deep since GeoJSON spec discourages nested # GeometryCollections for part in geom['geometries']: valid_shapes.append((part, value)) else: valid_shapes.append((geom, value)) shape_values.append(value) if not valid_shapes: raise ValueError('No valid geometry objects found for rasterize') shape_values = np.array(shape_values) if not validate_dtype(shape_values, valid_dtypes): raise ValueError(format_invalid_dtype('shape values')) if dtype is None: dtype = get_minimum_dtype(np.append(shape_values, fill)) elif not can_cast_dtype(shape_values, dtype): raise ValueError(format_cast_error('shape values', dtype)) if out is not None: if np.dtype(out.dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('out')) if not can_cast_dtype(shape_values, out.dtype): raise ValueError(format_cast_error('shape values', out.dtype.name)) elif out_shape is not None: if len(out_shape) != 2: raise ValueError('Invalid out_shape, must be 2D') out = np.empty(out_shape, dtype=dtype) out.fill(fill) else: raise ValueError('Either an out_shape or image must be provided') if min(out.shape) == 0: raise ValueError("width and height must be > 0") transform = guard_transform(transform) _rasterize(valid_shapes, out, transform, all_touched, merge_alg) return out
def rasterize( shapes, out_shape=None, fill=0, out=None, output=None, transform=IDENTITY, all_touched=False, default_value=1, dtype=None): """ Returns an image array with input geometries burned in. Parameters ---------- shapes : iterable of (geometry, value) pairs or iterable over geometries. `geometry` can either be an object that implements the geo interface or GeoJSON-like object. out_shape : tuple or list Shape of output numpy ndarray. fill : int or float, optional Used as fill value for all areas not covered by input geometries. out : numpy ndarray, optional Array of same shape and data type as `image` in which to store results. output : older alias for `out`, will be removed before 1.0. transform : Affine transformation object, optional Transformation from pixel coordinates of `image` to the coordinate system of the input `shapes`. See the `transform` property of dataset objects. all_touched : boolean, optional If True, all pixels touched by geometries will be burned in. If false, only pixels whose center is within the polygon or that are selected by Bresenham's line algorithm will be burned in. default_value : int or float, optional Used as value for all geometries, if not provided in `shapes`. dtype : rasterio or numpy data type, optional Used as data type for results, if `out` is not provided. Returns ------- out : numpy ndarray Results Notes ----- Valid data types for `fill`, `default_value`, `out`, `dtype` and shape values are rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, rasterio.uint32, rasterio.float32, rasterio.float64. """ valid_dtypes = ( 'int16', 'int32', 'uint8', 'uint16', 'uint32', 'float32', 'float64' ) def format_invalid_dtype(param): return '{0} dtype must be one of: {1}'.format( param, ', '.join(valid_dtypes) ) def format_cast_error(param, dtype): return '{0} cannot be cast to specified dtype: {1}'.format(param, dtype) if fill != 0: fill_array = np.array([fill]) if not validate_dtype(fill_array, valid_dtypes): raise ValueError(format_invalid_dtype('fill')) if dtype is not None and not can_cast_dtype(fill_array, dtype): raise ValueError(format_cast_error('fill', dtype)) if default_value != 1: default_value_array = np.array([default_value]) if not validate_dtype(default_value_array, valid_dtypes): raise ValueError(format_invalid_dtype('default_value')) if dtype is not None and not can_cast_dtype(default_value_array, dtype): raise ValueError(format_cast_error('default_vaue', dtype)) if dtype is not None and np.dtype(dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('dtype')) valid_shapes = [] shape_values = [] for index, item in enumerate(shapes): if isinstance(item, (tuple, list)): geom, value = item else: geom = item value = default_value geom = getattr(geom, '__geo_interface__', None) or geom #not isinstance(geom, dict) or if 'type' in geom or 'coordinates' in geom: valid_shapes.append((geom, value)) shape_values.append(value) else: raise ValueError( 'Invalid geometry object at index {0}'.format(index) ) if not valid_shapes: raise ValueError('No valid geometry objects found for rasterize') shape_values = np.array(shape_values) if not validate_dtype(shape_values, valid_dtypes): raise ValueError(format_invalid_dtype('shape values')) if dtype is None: dtype = get_minimum_dtype(np.append(shape_values, fill)) elif not can_cast_dtype(shape_values, dtype): raise ValueError(format_cast_error('shape values', dtype)) if output is not None: warnings.warn( "The 'output' keyword arg has been superseded by 'out' " "and will be removed before Rasterio 1.0.", FutureWarning, stacklevel=2) # pragma: no cover out = out if out is not None else output if out is not None: if np.dtype(out.dtype).name not in valid_dtypes: raise ValueError(format_invalid_dtype('out')) if not can_cast_dtype(shape_values, out.dtype): raise ValueError(format_cast_error('shape values', out.dtype.name)) elif out_shape is not None: out = np.empty(out_shape, dtype=dtype) out.fill(fill) else: raise ValueError('Either an output shape or image must be provided') transform = guard_transform(transform) with rasterio.drivers(): _rasterize(valid_shapes, out, transform.to_gdal(), all_touched) return out