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

70 lines
2.1 KiB
Python

"""Fetch and edit raster dataset metadata from the command line."""
import json
import click
from cligj import precision_opt
@click.command(short_help="Transform coordinates.")
@click.argument('INPUT', default='-', required=False)
@click.option('--src-crs', '--src_crs', default='EPSG:4326',
help="Source CRS.")
@click.option('--dst-crs', '--dst_crs', default='EPSG:4326',
help="Destination CRS.")
@precision_opt
@click.pass_context
def transform(ctx, input, src_crs, dst_crs, precision):
"""Transform coordinates between coordinate reference systems.
JSON arrays of coordinates, interleaved, are read from stdin.
Aarrays of transformed coordinates are written to stdout.
To transform a longitude, latitude point (EPSG:4326 is the default)
to another coordinate system with 2 decimal places of output
precision, do the following.
\b
$ cat << EOF | rio transform --dst-crs EPSG:32618 --precision 2
> [-78.0 23.0]
> EOF
[192457.13, 2546667.68]
"""
import rasterio.warp
# Handle the case of file, stream, or string input.
try:
src = click.open_file(input).readlines()
except OSError:
src = [input]
with ctx.obj["env"]:
if src_crs.startswith("EPSG"):
src_crs = {"init": src_crs}
elif rasterio.shutil.exists(src_crs):
with rasterio.open(src_crs) as f:
src_crs = f.crs
if dst_crs.startswith("EPSG"):
dst_crs = {"init": dst_crs}
elif rasterio.shutil.exists(dst_crs):
with rasterio.open(dst_crs) as f:
dst_crs = f.crs
for line in src:
coords = json.loads(line)
xs = coords[::2]
ys = coords[1::2]
xs, ys = rasterio.warp.transform(src_crs, dst_crs, xs, ys)
if precision >= 0:
xs = [round(v, precision) for v in xs]
ys = [round(v, precision) for v in ys]
result = [0] * len(coords)
result[::2] = xs
result[1::2] = ys
click.echo(json.dumps(result))