>>> from env_helper import info; info()
页面更新时间: 2024-04-09 09:14:01
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.7. 命令行用户指南

Rasterio的命令行界面(CLI)是一个名为“rasterio”的程序。 在 Debian/Ubuntu 操作系统中,需要通过以下命令安装:

sudo apt install -y rasterio

rasterio允许您使用shell命令构建工作流,可以在命令提示下交互,也可以使用脚本。 rasterio子命令涵盖了许多常见的情况,与实现类似于python脚本的功能相比,使用现成的命令通常更方便。

rasterio程序是使用 Click 框架。它的插件系统允许外部模块共享一个公共的名称空间和处理上下文变量。

>>> !rasterio --help
Usage: rasterio [OPTIONS] COMMAND [ARGS]...

  Rasterio command line interface.

Options:
  -v, --verbose           Increase verbosity.
  -q, --quiet             Decrease verbosity.
  --aws-profile TEXT      Select a profile from the AWS credentials file
  --aws-no-sign-requests  Make requests anonymously
  --aws-requester-pays    Requester pays data transfer costs
  --version               Show the version and exit.
  --gdal-version
  --show-versions         Show dependency versions
  --help                  Show this message and exit.

Commands:
  blocks     Write dataset blocks as GeoJSON features.
  bounds     Write bounding boxes to stdout as GeoJSON.
  calc       Raster data calculator.
  clip       Clip a raster to given bounds.
  convert    Copy and convert raster dataset.
  edit-info  Edit dataset metadata.
  env        Print information about the Rasterio environment.
  gcps       Print ground control points as GeoJSON.
  info       Print information about a data file.
  insp       Open a data file and start an interpreter.
  mask       Mask in raster using features.
  merge      Merge a stack of raster datasets.
  overview   Construct overviews in an existing dataset.
  rasterize  Rasterize features.
  rm         Delete a dataset.
  sample     Sample a dataset.
  shapes     Write shapes extracted from bands or masks.
  stack      Stack a number of bands into a multiband dataset.
  transform  Transform coordinates.
  warp       Warp a raster dataset.

命令结果如上所示。进一步可查看 --help 有关详细信息的单个命令。

3.7.1. 创建选项

对于创建新数据集的命令,还可以使用 --co 。 例如,要用平铺方式( tiled )输出新的 GeoTiff文件,请添加以下内容。

--co tiled=true --co blockxsize=256 --co blockysize=256

要使用 lzw 方法压缩它,请添加

--co compress=LZW

3.7.2. bounds 命令

增加0.10。

bounds 命令将栅格数据的外包四边形( bounding boxes )输出为 GeoJSON 格式。

>>> !rasterio bounds /gdata/dem_data.tif --indent 2
{
  "bbox": [
    120.99999965279999,
    44.99999983200001,
    125.00208297973,
    47.002083162130006
  ],
  "geometry": {
    "coordinates": [
      [
        [
          120.99999965279999,
          44.99999983200001
        ],
        [
          125.00208297973,
          44.99999983200001
        ],
        [
          125.00208297973,
          47.002083162130006
        ],
        [
          120.99999965279999,
          47.002083162130006
        ],
        [
          120.99999965279999,
          44.99999983200001
        ]
      ]
    ],
    "type": "Polygon"
  },
  "properties": {
    "filename": "dem_data.tif",
    "id": "0",
    "title": "/gdata/dem_data.tif"
  },
  "type": "Feature"
}

3.7.3. calc 命令

增加0.19

这个 calc 命令将文件作为数组读取,在其上下文中计算类似Lisp的表达式,并将结果作为新文件写入。 numpy模块的成员以及算术和逻辑运算符是可用的内置函数和运算符。 它旨在进行简单的计算;任何需要多个步骤的计算都可以在Python中使用Rasterio和Numpy API更好地完成。

输入文件的带区数目可能不同,但行和列的数目应该相同。 输出文件将具有与输入相同的行数和列数,并且表达式结果的每个元素都有一个带区。 一个涉及n-d数组算术运算的表达式将产生一个n-d数组并产生一个n波段输出文件。

下面将生成一个3波段的geotiff,所有值的比例为0.95,增量为2。在表达式中, (read 1) 作为三维数组计算第一个输入数据集(3个频带)。

>>> !rasterio calc "(+ 2 (* 0.95 (read 1)))" /gdata/geotiff_file.tif /tmp/out.tif
Traceback (most recent call last):
  File "/bin/rasterio", line 8, in <module>
    sys.exit(main_group())
             ^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/decorators.py", line 26, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/rasterio/rio/calc.py", line 185, in calc
    results = results.filled(float(kwargs['nodata']))
                             ^^^^^^^^^^^^^^^^^^^^^^^
TypeError: float() argument must be a string or a real number, not 'NoneType'

下面生成一个3波段的geotiff,其中第一个波段从输入的第一个波段复制,接下来的两个波段按第一个波段的平均值与各自的平均值之比缩放(缩小)。这个 –name 选项用于将数据集绑定到表达式中的名称。 (take a 1) 获取名为 a 作为二维数组 (asarray …) 将二维数组的序列收集到三维数组中进行输出。

>>> !rasterio calc "(asarray (take a 1) (* (take a 2) (/ (mean (take a 1)) (mean (take a 2)))) (* (take a 3) (/ (mean (take a 1)) (mean (take a 3)))))" \
>>> > --name a=testsRGB.byte.tif /tmp/out.rgb.tif
Traceback (most recent call last):
  File "rasterio/_base.pyx", line 307, in rasterio._base.DatasetBase.__init__
  File "rasterio/_base.pyx", line 218, in rasterio._base.open_dataset
  File "rasterio/_err.pyx", line 221, in rasterio._err.exc_wrap_pointer
rasterio._err.CPLE_OpenFailedError: a=testsRGB.byte.tif: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/bin/rasterio", line 8, in <module>
    sys.exit(main_group())
             ^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/click/decorators.py", line 26, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/rasterio/rio/calc.py", line 151, in calc
    sources = [
              ^
  File "/usr/lib/python3/dist-packages/rasterio/rio/calc.py", line 152, in <listcomp>
    stack.enter_context(rasterio.open(path)) for name, path in inputs
                        ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/rasterio/env.py", line 451, in wrapper
    return f(*args, **kwds)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/rasterio/__init__.py", line 304, in open
    dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "rasterio/_base.pyx", line 309, in rasterio._base.DatasetBase.__init__
rasterio.errors.RasterioIOError: a=testsRGB.byte.tif: No such file or directory

上面的命令也是计算的一个例子,它远远超出了calc命令的设计范围,而且可以在python中更有效地进行计算。

3.7.4. clip

增加0.27

这个 clip 命令使用边界输入直接或从模板栅格剪裁栅格。

$ rio clip input.tif output.tif --bounds xmin ymin xmax ymax $ rio clip input.tif output.tif --like template.tif

如果使用 –bounds ,值必须在输入的坐标参考系中。如果使用 –like ,边界将自动转换以匹配输入的坐标参考系。

它还可以结合使用fiona读取功能数据集的边界:

$ rio clip input.tif output.tif --bounds $(fio info features.shp --bounds)

转换 增加0.25

这个 convert 命令将栅格数据集复制并转换为其他数据类型和格式(类似于 gdal_translate )

通过使用 –scale-ratio 和 –scale-offset 选项。目标栅格值计算为

dst = scale_ratio * src + scale_offset

例如,要将实际范围为0-4095到0-255的uint16数据缩放为uint8:

$ rio convert in16.tif out8.tif --dtype uint8 --scale-ratio 0.0625

你可以使用 –rgb 作为 –co photometric=rgb .

3.7.5. 编辑信息

增加0.24

这个 edit-info 命令允许您编辑栅格数据集的元数据,即

坐标参考系

仿射矩阵

nodata值

标签

颜色解释

通过编辑这些元数据项,空间上不知情的图像处理软件(如photoshop或imagemagick)创建的TIFF可以变成geotiff。

例如,可以将数据集的坐标参考系统设置或更改为Web Mercator(epsg:3857)。

$ rio edit-info --crs EPSG:3857 example.tif

设置其 affine transformation matrix ,

$ rio edit-info --transform "[300.0, 0.0, 101985.0, 0.0, -300.0, 2826915.0]" example.tif

或将其nodata值设置为,例如, 0 :

$ rio edit-info --nodata 0 example.tif

或将其颜色解释设置为红色、绿色、蓝色和阿尔法:

$ rio edit-info --colorinterp 1=red,2=green,3=blue,4=alpha example.tif

也可以表示为:

$ rio edit-info --colorinterp RGBA example.tif

见 rasterio.enums.ColorInterp 有关支持的颜色解释的完整列表和颜色文档的详细信息。

3.7.6. 掩膜

增加0.21

这个 mask 命令使用功能从栅格的所有带区中以像素为单位进行遮罩(遮罩出功能未覆盖的所有区域),并选择性地将输出栅格裁剪到功能范围内。假设特征与输入栅格在同一坐标参考系中。

一个常见的用例是通过政治或其他边界屏蔽栅格数据。

$ rio mask input.tif output.tif --geojson-mask input.geojson

geojson特性可以使用stdin提供,也可以直接指定为第一个参数,输出可以裁剪到特性的范围内。

$ rio mask input.tif output.tif --crop --geojson-mask - < input.geojson

可以反转特征遮罩,以遮罩特征覆盖的像素,并保持特征不覆盖的像素。

$ rio mask input.tif output.tif --invert --geojson-mask input.geojson

3.7.7. 信息

增加0.13

这个 info 命令打印有关数据集的结构化信息。

$ rio info tests/data/RGB.byte.tif --indent 2 {

"count": 3, "crs": "EPSG:32618", "dtype": "uint8", "driver": "GTiff", "bounds": [

101985.0, 2611485.0, 339315.0, 2826915.0

], "lnglat": [

-77.75790625255473, 24.561583285327067

], "height": 718, "width": 791, "shape": [

718, 791

], "res": [

300.0379266750948, 300.041782729805

], "nodata": 0.0

}

可以使用 –verbose 选择权。

$ rio info tests/data/RGB.byte.tif --indent 2 --verbose {

"count": 3, "crs": "EPSG:32618", "stats": [

{

"max": 255.0, "mean": 44.434478650699106, "min": 1.0

}, {

"max": 255.0, "mean": 66.02203484105824, "min": 1.0

}, {

"max": 255.0, "mean": 71.39316199120559, "min": 1.0

}

], "dtype": "uint8", "driver": "GTiff", "bounds": [

101985.0, 2611485.0, 339315.0, 2826915.0

], "lnglat": [

-77.75790625255473, 24.561583285327067

], "height": 718, "width": 791, "shape": [

718, 791

], "res": [

300.0379266750948, 300.041782729805

], "nodata": 0.0

}

3.7.8. insp

这个 insp 命令打开数据集和解释器。

$ rio insp --ipython tests/data/RGB.byte.tif Rasterio 0.32.0 Interactive Inspector (Python 2.7.10) Type "src.meta", "src.read(1)", or "help(src)" for more information. In [1]: print(src.name) /path/rasterio/tests/data/RGB.byte.tif

In [2]: print(src.bounds) BoundingBox(left=101985.0, bottom=2611485.0, right=339315.0, top=2826915.0)

3.7.9. 合并

0.12.1中增加

这个 merge 命令可用于平展一组相同结构的数据集。

$ rio merge rasterio/tests/data/R*.tif merged.tif

3.7.10. 概述

0.25新增

这个 overview 命令创建存储在数据集中的概述,这可以提高某些应用程序的性能。

构建概述的抽取级别可以指定为逗号分隔的列表。

$ rio overview --build 2,4,8,16

或者指数的基数和范围。

$ rio overview --build 2^1..4

请注意,当前无法删除概述,并且在修改数据集的主带区时不会自动更新概述。

可以使用–ls选项打印有关现有概述的信息。

$ rio overview --ls

用于概述(内部或外部)的块大小(平铺宽度和高度)可以通过设置 GDAL_TIFF_OVR_BLOCKSIZE 环境变量的二次幂介于64和4096之间。默认值为128。

$ GDAL_TIFF_OVR_BLOCKSIZE=256 rio overview --build 2^1..4

3.7.11. 栅格化

0.18新增。

这个 rasterize 命令将geojson功能栅格化为新栅格或现有栅格。

$ rio rasterize test.tif --res 0.0167 < input.geojson

生成的文件将具有由geojson边界确定的左上角坐标(epsg:4326,默认值),像素大小约为30弧秒。中心位于多边形内或由Bresenham线算法选择的像素将被烧掉,默认值为1。

可以将栅格化为现有栅格并使用其他默认值:

$ rio rasterize existing.tif --default_value 10 < input.geojson

也可以使用模板栅格进行栅格化,模板栅格将用于确定输出栅格的变换、尺寸和坐标参考系统:

$ rio rasterize test.tif --like tests/data/shade.tif < input.geojson

geojson特性可以使用stdin提供,也可以直接指定为第一个参数,并且可以提供尺寸来代替像素分辨率:

$ rio rasterize input.geojson test.tif --dimensions 1024 1024

其他选项可用,请参见:

$ rio rasterize --help

3.7.12. rm

1.0中的新功能

在数据集上调用shell的“$rm”可用于删除由文件路径引用的数据集,但不会处理删除侧车文件。此命令了解数据集及其侧车文件。

3.7.13. 样品

0.18新增。

sample命令读取 x, y 从stdin定位并将该位置的数据集值写入stdout。

$ cat << EOF | rio sample tests/data/RGB.byte.tif > [220649.99999832606, 2719199.999999095] > EOF [18, 25, 14]

转换命令的输出(见下文)可以很好地输入示例。

3.7.14. shapes

0.11中的新功能。

这个 shapes 命令以geojson的形式提取和写入指定数据集带区的特性。

$ rio shapes tests/data/shade.tif --bidx 1 --precision 6 > shade.geojson

上载到MapBox的结果文件如下: sgillies.j1ho338j .

使用 –mask 选项可以写出数据集有效数据区域的形状。

$ rio shapes --mask --precision 6 tests/data/RGB.byte.tif | geojsonio

请参阅http://bl.ocks.org/anonymous/raw/ef244954b719db97926/。

3.7.15. statck

0.15新增。

这个 stack 命令将一个或多个输入文件中的若干条带堆叠到多条带数据集中。输入数据集必须是一种类型:相同的数据类型、维度等。输出是从第一个输入克隆的。默认情况下, stack 将从每个输入中获取所有波段,并按相同的顺序写入输出。或者,可以使用以下语法指定每个输入的带区:

–bidx N 从输入端取第n个波段(第一个波段为1)。

–bidx M,N,O 带m、n和o。

–bidx M..O 带M-O,包括。

–bidx ..N 带上所有波段,包括N。

–bidx N.. 把所有的乐队从N带到结尾。

使用生成其副本的栅格测试数据集的示例。

$ rio stack RGB.byte.tif stacked.tif $ rio stack RGB.byte.tif --bidx 1,2,3 stacked.tif $ rio stack RGB.byte.tif --bidx 1..3 stacked.tif $ rio stack RGB.byte.tif --bidx ..2 RGB.byte.tif --bidx 3.. stacked.tif

你可以使用 –rgb 作为 –co photometric=rgb .

3.7.16. transform

0.10中的新功能。

这个 transform 命令读取坐标的JSON数组,交错,并将另一个转换后的坐标数组写入stdout。

要将经度、纬度点(默认为epsg:4326)转换为输出精度为2位小数的另一个坐标系,请执行以下操作。

$ echo "[-78.0, 23.0]" | rio transform - --dst-crs EPSG:32618 --precision 2 [192457.13, 2546667.68]

要将经度、纬度边界框转换为栅格数据集的坐标系,请执行以下操作。

$ echo "[-78.0, 23.0, -76.0, 25.0]" | rio transform - --dst-crs tests/data/RGB.byte.tif --precision 2 [192457.13, 2546667.68, 399086.97, 2765319.94]

3.7.17. warp

0.25新增

这个 warp 命令扭曲(重新投影)基于可从模板栅格获取或直接输入的参数的栅格。输出总是被覆盖。

要从模板栅格复制坐标参考系、转换和尺寸,请执行以下操作:

$ rio warp input.tif output.tif --like template.tif

可以使用proj.4或epsg:nnnn字符串或JSON文本编码的proj.4对象指定输出坐标系:

$ rio warp input.tif output.tif --dst-crs EPSG:4326

$ rio warp input.tif output.tif --dst-crs '+proj=longlat +ellps=WGS84 +datum=WGS84'

您还可以指定维度,该维度将根据目标CRS中边界与这些维度之间的关系自动计算适当的分辨率:

$ rio warp input.tif output.tif --dst-crs EPSG:4326 --dimensions 100 200

或提供输出边界(在源CRS中)和分辨率:

$ rio warp input.tif output.tif --dst-crs EPSG:4326 --bounds -78 22 -76 24 --res 0.1

上一个命令,如果是南上图像, – 逃离下一个 - :

$ rio warp input.tif output.tif --dst-crs EPSG:4326 --bounds -78 22 -76 24 --res 0.1 -- -0.1

其他选项可用,请参见:

$ rio warp --help

3.7.18. RIO插件

里约使用 click-plugins 提供使用在Rasterio之外开发的插件创建其他子命令的能力。这对于需要附加依赖项而不是栅格所使用的依赖项的命令,或者提供超出栅格预期范围的功能的命令非常理想。

例如, rio-mbtiles 提供命令 rio mbtiles 将栅格导出到mbtiles文件。

见 click-plugins 有关如何构建这些插件的更多信息。

要在rio中使用这些插件,请将命令添加到 rasterio.rio_plugins’ entry point in your setup.py file, as described here 而在 rasterio/rio/main.py .

见 plugin registry 获取可用插件的列表。

其他命令? 欢迎对其他命令提出建议!

1 在一些Linux发行版中,“rio”可能指的是命令行diamond rio mp3播放器控制器。通过在单独的Python环境中安装栅格可以避免这种冲突。