我使用 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')