从草 gis 中导出多个栅格
Export multiple raster from grass gis
我使用 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: [=10=] 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 Scripting Library 调用 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 通过 Launch script 项目图层管理器中的文件菜单。
以上答案要求您输入每个栅格图层的名称。如果你想自动化整个过程,你可以使用下面的 Python 脚本。该脚本首先创建一个列表,其中包含可用于草的所有栅格,然后将每个栅格单独导出为 Tiff 文件。要 运行 它,要么将代码复制并粘贴到 GRASS python shell(作为 GRASS GUI 层管理器 window 上的选项卡访问),或者将其另存为.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')
我使用 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: [=10=] 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 Scripting Library 调用 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 通过 Launch script 项目图层管理器中的文件菜单。
以上答案要求您输入每个栅格图层的名称。如果你想自动化整个过程,你可以使用下面的 Python 脚本。该脚本首先创建一个列表,其中包含可用于草的所有栅格,然后将每个栅格单独导出为 Tiff 文件。要 运行 它,要么将代码复制并粘贴到 GRASS python shell(作为 GRASS GUI 层管理器 window 上的选项卡访问),或者将其另存为.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')