gdal_calc.py在sbt下不起作用

时间:2017-04-19 17:26:51

标签: python scala sbt gdal

我在scala脚本中运行命令行gdal_calc.py。我用'sbt run'运行这个脚本。在我的终端上。我收到了这个错误:

SELECT t.*,
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',1),' ',-1)+0 as D1,
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',2),'/',-1)+0 as D2,
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',3),'/',-1)+0 as D§
FROM test_sort t
ORDER BY 
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',1),' ',-1)+0,
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',2),'/',-1)+0,
    SUBSTRING_INDEX(SUBSTRING_INDEX(PORT,'/',3),'/',-1)+0;

在我的终端中运行命令gdal_calc.py效果很好。 直接在我的终端中运行完全相同的命令行是行不通的。环境是一样的:使用的gdal库是相同的

运行的命令行如下:

Traceback (most recent call last):
  File "/usr/local/bin/gdal_calc.py", line 329, in <module>
    main()
  File "/usr/local/bin/gdal_calc.py", line 326, in main
    doit(opts, args)
  File "/usr/local/bin/gdal_calc.py", line 282, in doit
    myResult = ((1*(myNDVs==0))*myResult) + (myOutNDV*myNDVs)
TypeError: only integer arrays with one element can be converted to an index

有人可以解释一下吗?谢谢!

3 个答案:

答案 0 :(得分:0)

我终于找到了解决问题的方法: 我正在将我的gdal_calc.py命令行写入shell脚本,然后执行它认为shell。 它不是解决问题而是绕过;)

答案 1 :(得分:0)

我无法帮助Scala,但是像Samuel一样,我遇到了一个问题,就是用Python脚本调用gdal_calc.py并使用&#39; subprocess.call()&#39;。

我怀疑当争论被移交给&#39; gdal_calc.py时会出现一些问题。 by&#39; subprocess.call()&#39;。

解决方案是使用&#39; subprocess.call&#39;参数&#39; shell = True&#39;,通过shell将调用作为单个字符串执行:

subprocess.call('gdal_calc.py --outfile=outfile.tiff -A rasterA.tiff
                -B rasterB.tiff --calc="A+B"', shell = True)

也许&#39; sbt run&#39;在Scala有类似的选择吗?

答案 2 :(得分:0)

您始终可以从python脚本启动它,而无需使用shell脚本:

# import section
import os

# Manual input
a_source = "aaa.tif"
b_source = "bbb.tif"
output = "out.tif"
calc = '"(A**B)*(B==1)"'

# The command itself
gdal_calc = 'python {Path root}/Lib/site-packages/osgeo/scripts/gdal_calc.py ' \
            '-A {0} ' \
            '-B {1} ' \
            '--outfile={2} ' \
            '--calc={3} ' \
            '--type=Float32 ' \
            '--overwrite'.format(a_source, b_source, output, calc)

# Launch the command
os.system(gdal_calc)

我发现这更加容易和清楚。