网格上的Arcpy映射代数
我试图通过网状结构使用R中的arcpy。在大多数情况下,它工作得非常好。然而,我在尝试做光栅代数时遇到了一些问题。考虑下面的代码:网格上的Arcpy映射代数,r,arcpy,reticulate,R,Arcpy,Reticulate,我试图通过网状结构使用R中的arcpy。在大多数情况下,它工作得非常好。然而,我在尝试做光栅代数时遇到了一些问题。考虑下面的代码: library(reticulate) use_python("C:/Python27/ArcGISx6410.2") arcpy = import("arcpy") arcpy$CheckOutExtension("Spatial") arcpy$management$CreateRandomRaster("in_memory", "randrast",
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中出错:二进制运算符的非数值参数
看起来,即使Netracte认识到光栅是Python对象Python.builtin.Raster Python.builtin.object,它也不知道使用Python的+运算符而不是R运算符。我尝试使用convert=FALSE导入arcpy,但错误相同
我可以通过定义Python函数来模拟基本的算术运算符来解决这个问题
tmp = tempfile(fileext = ".py")
cat("def add(x, y):\n return x + y\n", file = tmp)
source_python(tmp)
doublerast = add(randrast, randrast)
但显然,对于更复杂的语句,这会变得相当麻烦
有人知道有什么方法可以强制Networkate对Python对象使用Python的算术运算符而不是R吗?一个选项是使用运算符模块为Python对象定义我自己的运算符: 或者,使用S3类重载算术运算符,就像支持python.builtin.object一样,例如 但我担心操作顺序可能不会像预期的那样发挥作用
`%py+%` = function(e1, e2) {
op = import("operator")
op$add(e1, e2)
}
doublerast = randrast %py+% randrast
`+.python.builtin.object` = function(e1, e2) {
op = import("operator")
op$add(e1, e2)
}