summit/backend/venv/lib/python3.12/site-packages/rasterio/rio/insp.py

86 lines
2.6 KiB
Python

"""Fetch and edit raster dataset metadata from the command line."""
import code
import logging
import sys
import collections
import warnings
import numpy as np
import click
from . import options
import rasterio
try:
import matplotlib.pyplot as plt
except ImportError: # pragma: no cover
plt = None
except RuntimeError as e: # pragma: no cover
# Certain environment configurations can trigger a RuntimeError like:
# Trying to import matplotlibRuntimeError: Python is not installed as a
# framework. The Mac OS X backend will not be able to function correctly
# if Python is not installed as a framework. See the Python ...
warnings.warn(str(e), RuntimeWarning, stacklevel=2)
plt = None
Stats = collections.namedtuple('Stats', ['min', 'max', 'mean'])
# Collect dictionary of functions for use in the interpreter in main()
funcs = locals()
def stats(dataset):
"""Return a tuple with raster min, max, and mean."""
if isinstance(dataset, tuple):
arr = dataset[0].read(dataset[1])
else:
arr = dataset
return Stats(np.min(arr), np.max(arr), np.mean(arr))
def main(banner, dataset, alt_interpreter=None):
"""Main entry point for use with python interpreter."""
local = dict(funcs, src=dataset, np=np, rio=rasterio, plt=plt)
if not alt_interpreter:
code.interact(banner, local=local)
elif alt_interpreter == 'ipython': # pragma: no cover
import IPython
IPython.InteractiveShell.banner1 = banner
IPython.start_ipython(argv=[], user_ns=local)
else:
raise ValueError("Unsupported interpreter '%s'" % alt_interpreter)
return 0
@click.command(short_help="Open a data file and start an interpreter.")
@options.file_in_arg
@click.option('--ipython', 'interpreter', flag_value='ipython',
help="Use IPython as interpreter.")
@click.option(
'-m',
'--mode',
type=click.Choice(['r', 'r+']),
default='r',
help="File mode (default 'r').")
@click.pass_context
def insp(ctx, input, mode, interpreter):
"""Open the input file in a Python interpreter."""
logger = logging.getLogger()
try:
with ctx.obj['env']:
with rasterio.open(input, mode) as src:
main(
'Rasterio %s Interactive Inspector (Python %s)\n'
'Type "src.meta", "src.read(1)", or "help(src)" '
'for more information.' % (
rasterio.__version__,
'.'.join(map(str, sys.version_info[:3]))),
src, interpreter)
except Exception:
logger.exception("Exception caught during processing")
raise click.Abort()