代码之家  ›  专栏  ›  技术社区  ›  flu_tschi

从grass gis导出多个光栅

  •  2
  • flu_tschi  · 技术社区  · 9 年前

    我用了r.tile( http://grass.osgeo.org/grass71/manuals/r.tile.html )用一个巨大的地理标志制作瓷砖。现在我想将每个磁贴导出到一个文件,但没有找到一个简单的方法: 使用r.out。gdal我一次只能导出一个平铺,这使得它无法使用,因为我有100个平铺。。。

    我还没有找到其他解决方案……有人有什么想法吗?

    3 回复  |  直到 9 年前
        1
  •  2
  •   wenzeslaus    9 年前

    你只要打电话 r、 外.gdal 在某些脚本语言的for循环中。

    这是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 Scripting Library 调用 r、 英寸 模块和 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版本并运行它,例如通过 启动脚本 中的项目 文件 中的菜单 图层管理器 .

        2
  •  0
  •   Beeman    8 年前

    以上答案要求您输入每个光栅图层的名称。如果您想自动化整个过程,可以使用以下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')
    
        3
  •  0
  •   kbjshop    2 年前

    在macOS上使用GRASS 8.2,此版本可以正常工作。 g.list()似乎返回一个字符串,可能用换行符分隔。

    split()将其分解为一个可以迭代的python列表。 请注意,这仅适用于GRASS不允许在对象名称中使用空格。

    #!/usr/bin/env python3
    
    import grass.script as grass
    
    rastlist=grass.read_command("g.list", type="rast")
    
    rastlistClean=rastlist.split()
    
    for raster in rastlistClean:
      grass.run_command('r.out.gdal', input=raster, output= raster + '.tif', format='GTiff', overwrite=True)  
    
    

    这要归功于Beeman的回答,这是本文的基础。