mirror of
https://github.com/rasterio/rasterio.git
synced 2025-12-08 17:36:12 +00:00
123 lines
3.3 KiB
Python
123 lines
3.3 KiB
Python
#!/usr/bin/env python
|
|
|
|
"""Copy a raster with various options."""
|
|
|
|
import rasterio
|
|
|
|
|
|
def main(source, destination, opts, template=None, log=None):
|
|
"""Copy from source to destination with new options"""
|
|
|
|
with rasterio.drivers():
|
|
|
|
try:
|
|
|
|
with rasterio.open(source) as src:
|
|
|
|
# First, copy the opts to the destination's kwargs.
|
|
kwargs = src.meta
|
|
kwargs.update(opts)
|
|
|
|
# If there's a template file, overlay its georeferencing.
|
|
if template is not None:
|
|
with rasterio.open(template) as tmpl:
|
|
kwargs['transform'] = tmpl.transform
|
|
kwargs['crs'] = tmpl.crs
|
|
|
|
# Write to the destination.
|
|
# TODO: use shortcut to source buffer.
|
|
with rasterio.open(destination, 'w', **kwargs) as dst:
|
|
for i in dst.indexes:
|
|
dst.write_band(i, src.read_band(i))
|
|
|
|
except:
|
|
log.exception("rio_cp failed, exception caught")
|
|
return 1
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
import argparse
|
|
import logging
|
|
import sys
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="Copy raster file with options")
|
|
parser.add_argument(
|
|
'source',
|
|
metavar='SOURCE',
|
|
help="Source file name")
|
|
parser.add_argument(
|
|
'destination',
|
|
metavar='DESTINATION',
|
|
help="Destination file name")
|
|
# TODO: add a short option for the following.
|
|
parser.add_argument(
|
|
'--template-file',
|
|
metavar='FILE',
|
|
help="Use a georeferenced file as a template")
|
|
parser.add_argument(
|
|
'-z', '--lzw',
|
|
action='store_true',
|
|
help="Compress destination using LZW")
|
|
parser.add_argument(
|
|
'--interleave-band',
|
|
action='store_true',
|
|
help="Band rather than pixel interleaved")
|
|
parser.add_argument(
|
|
'-t', '--tiled',
|
|
action='store_true',
|
|
help="Tiled rather than striped TIFFs")
|
|
parser.add_argument(
|
|
'--block-height',
|
|
metavar='HEIGHT',
|
|
help="Tile or strip height")
|
|
parser.add_argument(
|
|
'--block-width',
|
|
metavar='WIDTH',
|
|
help="Tile width")
|
|
parser.add_argument(
|
|
'-v', '--verbose',
|
|
action='count',
|
|
default=0,
|
|
help="Increase verbosity")
|
|
parser.add_argument(
|
|
'-q', '--quiet',
|
|
action='count',
|
|
default=0,
|
|
help="Decrease verbosity")
|
|
args = parser.parse_args()
|
|
|
|
verbosity = args.verbose - args.quiet
|
|
log_level = max(10, 30 - 10*verbosity)
|
|
logging.basicConfig(stream=sys.stderr, level=log_level)
|
|
logger = logging.getLogger('rio_cp')
|
|
|
|
# TODO: quick check of filenames before we call main().
|
|
|
|
options = {}
|
|
if args.interleave_band:
|
|
options['interleave'] = 'band'
|
|
if args.lzw:
|
|
options['compress'] = 'LZW'
|
|
if args.tiled:
|
|
options['tiled'] = True
|
|
if args.block_height:
|
|
options['blockysize'] = args.block_height
|
|
if args.block_width:
|
|
options['blockxsize'] = args.block_width
|
|
|
|
# TODO: support other formats.
|
|
options['driver'] = 'GTiff'
|
|
|
|
sys.exit(
|
|
main(
|
|
args.source,
|
|
args.destination,
|
|
options,
|
|
args.template_file,
|
|
log=logger))
|
|
|