我使用 r.tile ( http://grass.osgeo.org/grass71/manuals/r.tile.html ) 从一个巨大的 geotiff 创建瓷砖。现在我想将每个图块导出到一个文件,但没有找到一种简单的方法:使用 r.out.gdal 我一次只能导出一个图块,这使得它无法使用,因为我有 100 个图块......
我还没有找到任何其他解决方案...任何人有任何想法?
我使用 r.tile ( http://grass.osgeo.org/grass71/manuals/r.tile.html ) 从一个巨大的 geotiff 创建瓷砖。现在我想将每个图块导出到一个文件,但没有找到一种简单的方法:使用 r.out.gdal 我一次只能导出一个图块,这使得它无法使用,因为我有 100 个图块......
我还没有找到任何其他解决方案...任何人有任何想法?
您只需在某些脚本语言的 for 循环中调用r.out.gdal。
这是 Bash 的示例。这是一个简单但完整的脚本。它期望光栅地图名称作为命令行参数,如果参数不存在,它会失败并给出使用建议。
#!/usr/bin/env bash
if [ $# -eq 0 ]
then
>&2 echo "No arguments supplied"
>&2 echo "Usage: $0 raster1 raster2 ..."
fi
for RASTER in "$@"
do
r.out.gdal input=$RASTER output=$RASTER.tiff format=GTiff
done
要运行它,您必须先将其设置为可执行文件 ( chmod u+x export.sh
),然后您可以在命令行中运行它:
./export.sh tile1 tile2
这是 Python 的一个示例,它更适用于更大的任务。该代码与 Bash 脚本完全相同。此外,它使用GRASS Python 脚本库来调用r.in.gdal模块和print
函数,以向前兼容 Python 3。
#!/usr/bin/env python
from __future__ import print_function
import sys
import grass.script as gscript
if len(sys.argv) == 1:
print("No arguments supplied", file=sys.stderr)
print("Usage: {} raster1 raster2 ...".format(sys.argv[0]), file=sys.stderr)
for raster in sys.argv[1:]:
gscript.run_command('r.out.gdal', input=raster,
output=raster + '.tiff', format='GTiff')
同样,要运行它,您必须先将其设置为可执行文件 ( chmod u+x export.py
),然后您可以在命令行中运行它:
./export.py tile1 tile2
这两个示例都假设您使用的是 Linux、Mac OS X 或类似的东西,并在 GRASS GIS 的系统命令行中运行脚本。在 MS Windows 上,您可能应该使用 Python 版本并运行它,例如从 GRASS GIS GUI 通过图层管理器中文件菜单中的启动脚本项。
以上答案要求您输入每个栅格图层的名称。如果您想自动化整个过程,您可以使用以下 Python 脚本。此脚本首先创建一个可用于草地的所有栅格列表,然后将每个栅格单独导出为 Tiff 文件。要运行它,请将代码复制并粘贴到 GRASS python shell(可作为 GRASS GUI 层管理器窗口上的选项卡访问),或者将其保存为 .py 文件,然后再次从 Python shell 使用命令execfile("foo.py")
.
import grass.script as grass
# create list of all rasters
rastlist=grass.read_command("g.list",type="rast")
rastlist1= rastlist.split(':', 1)[1]
rastlist2= rastlist1.split('-', 1)[0]
RastListClean=rastlist2.split()
# export all rasters
for raster in RastListClean:
grass.run_command('r.out.gdal', input=raster,
output=raster + '.tiff', format='GTiff')