Geospatial xarray extension powered by rasterio for raster data manipulation and analysis
npx @tessl/cli install tessl/pypi-rioxarray@0.19.0A geospatial extension for xarray that enables powerful raster data manipulation and analysis through integration with rasterio. rioxarray provides coordinate reference system (CRS) transformations, reprojection operations, clipping and masking of raster data, and seamless integration with the scientific Python ecosystem.
pip install rioxarrayimport rioxarrayThe package automatically registers the .rio accessor when imported:
import rioxarray # Registers the .rio accessor
import xarray as xr
# Now .rio is available on all xarray objects
da = xr.open_dataarray('file.nc')
da.rio.crs # Access rioxarray functionalityFor merge functionality:
from rioxarray.merge import merge_arrays, merge_datasetsimport rioxarray
import xarray as xr
# Open a raster file directly
da = rioxarray.open_rasterio('path/to/raster.tif')
# Or use with existing xarray objects
ds = xr.open_dataset('file.nc')
# Access geospatial functionality via .rio accessor
print(ds.rio.crs)
# Reproject to a new coordinate system
reprojected = da.rio.reproject('EPSG:4326')
# Clip to a bounding box
clipped = da.rio.clip_box(minx=-10, miny=40, maxx=10, maxy=60)
# Set coordinate reference system
da_with_crs = da.rio.set_crs('EPSG:3857')
# Save to raster format
da.rio.to_raster('output.tif')
# Merge multiple raster files
from rioxarray.merge import merge_arrays
da1 = rioxarray.open_rasterio('tile1.tif')
da2 = rioxarray.open_rasterio('tile2.tif')
merged = merge_arrays([da1, da2])rioxarray extends xarray through the accessor pattern, providing geospatial capabilities without modifying xarray's core functionality:
.rio accessor on DataArrays and DatasetsReading and writing geospatial raster data with comprehensive parameter support for chunking, caching, coordinate parsing, and format-specific options.
def open_rasterio(
filename: Union[str, os.PathLike, rasterio.io.DatasetReader, rasterio.vrt.WarpedVRT],
*,
parse_coordinates: Optional[bool] = None,
chunks: Optional[Union[int, tuple, dict]] = None,
cache: Optional[bool] = None,
lock: Optional[Any] = None,
masked: bool = False,
mask_and_scale: bool = False,
variable: Optional[Union[str, list[str], tuple[str, ...]]] = None,
group: Optional[Union[str, list[str], tuple[str, ...]]] = None,
default_name: Optional[str] = None,
decode_times: bool = True,
decode_timedelta: Optional[bool] = None,
band_as_variable: bool = False,
**open_kwargs
) -> Union[xarray.Dataset, xarray.DataArray, list[xarray.Dataset]]: ...Comprehensive CRS management including setting, transforming, and reprojecting coordinate systems with support for various CRS formats and automatic UTM zone estimation.
# Properties
@property
def crs: Optional[rasterio.crs.CRS]: ...
# Methods
def set_crs(self, crs: Any, allow_override: bool = False, inplace: bool = False): ...
def estimate_utm_crs(self, datum_name: str = "WGS 84"): ...
def write_crs(self, crs: Any = None, grid_mapping_name: Optional[str] = None, inplace: bool = False): ...Clipping, reprojection, padding, and geometric operations on raster data with support for vector geometries, bounding boxes, and pixel-based operations.
def reproject(
self, dst_crs: Any, *, resolution: Optional[Union[float, tuple[float, float]]] = None,
shape: Optional[tuple[int, int]] = None, transform: Optional[rasterio.Affine] = None,
resampling: rasterio.enums.Resampling = rasterio.enums.Resampling.nearest, **kwargs
): ...
def clip(self, geometries: Any, crs: Optional[Any] = None, all_touched: bool = False, drop: bool = True, invert: bool = False, from_disk: bool = False): ...
def clip_box(self, minx: float, miny: float, maxx: float, maxy: float, crs: Optional[Any] = None, auto_expand: bool = False, auto_expand_limit: int = 3): ...NoData value handling, attribute and encoding management, and data merging operations for combining multiple raster datasets.
# NoData handling
@property
def nodata: Any: ...
def set_nodata(self, nodata: Any, inplace: bool = False): ...
# Attribute management
def set_attrs(self, inplace: bool = False, **attrs): ...
def update_attrs(self, inplace: bool = False, **attrs): ...
# Merging
def merge_arrays(dataarrays: Sequence[xarray.DataArray], *, bounds: Optional[tuple] = None, res: Optional[tuple] = None, nodata: Optional[float] = None, precision: Optional[float] = None, method: Union[str, Callable, None] = None, crs: Optional[rasterio.crs.CRS] = None, parse_coordinates: bool = True) -> xarray.DataArray: ...
def merge_datasets(datasets: Sequence[xarray.Dataset], *, bounds: Optional[tuple] = None, res: Optional[tuple] = None, nodata: Optional[float] = None, precision: Optional[float] = None, method: Union[str, Callable, None] = None, crs: Optional[rasterio.crs.CRS] = None) -> xarray.Dataset: ...Global configuration options, version information, exception handling, and utility functions for CRS conversion and coordinate management.
def set_options(**kwargs): ...
def show_versions(): ...
# Exception hierarchy
class RioXarrayError(Exception): ...
class NoDataInBounds(RioXarrayError): ...
class MissingSpatialDimensionError(RioXarrayError): ...
class MissingCRS(RioXarrayError): ...# Union types for file inputs
FileInput = Union[str, os.PathLike, rasterio.io.DatasetReader, rasterio.vrt.WarpedVRT]
# CRS input types
CRSInput = Union[rasterio.crs.CRS, str, dict, int]
# Geometry input types
GeometryInput = Union[dict, Any] # GeoJSON-like dict or geometry objects
# Sequence types
Sequence = collections.abc.Sequence
Callable = collections.abc.Callable
# Resampling options from rasterio
Resampling = rasterio.enums.Resampling