来自网状的Arcpy地图代数

时间:2018-03-01 18:29:03

标签: r arcpy reticulate

我正试图通过arcpy从R中使用reticulate。在大多数情况下,它的效果非常好。但是,在尝试进行栅格代数时,我遇到了一些问题。请考虑以下代码:

library(reticulate)
use_python("C:/Python27/ArcGISx6410.2")

arcpy = import("arcpy")
arcpy$CheckOutExtension("Spatial")

arcpy$management$CreateRandomRaster("in_memory", 
  "randrast", "NORMAL 3.0", "0 0 500 500", 50)

randrast = arcpy$sa$Raster("in_memory/randrast")

doublerast = randrast + randrast 
  

randrast + randrast中的错误:二元运算符的非数字参数

似乎即使reticulate认识到栅格是Python对象("python.builtin.Raster" "python.builtin.object"),它也不知道使用Python的+运算符而不是R'。我尝试使用arcpy导入convert = FALSE,但错误是相同的。

我可以通过定义Python函数来模拟基本的算术运算符来解决这个问题。

tmp = tempfile(fileext = ".py")
cat("def add(x, y):\n  return x + y\n", file = tmp)

source_python(tmp)

doublerast = add(randrast, randrast)

但显然这对于​​更复杂的陈述来说非常麻烦。

有没有人知道如何强制reticulate使用Python的算术运算符来代替R对象?

1 个答案:

答案 0 :(得分:1)

一种选择是使用operator模块为Python对象定义自己的运算符:

`%py+%` = function(e1, e2) {
  op = import("operator")
  op$add(e1, e2)
}

doublerast = randrast %py+% randrast 

或者,或者,使用S3类重载算术运算符(如TensorFlow所做的那样)以支持python.builtin.object,例如

`+.python.builtin.object` = function(e1, e2) {
  op = import("operator")
  op$add(e1, e2)
}

但我担心操作顺序可能无法按预期运行。