4

我想从 Python 脚本运行 R 脚本。在不同的坐标系中投影经纬度坐标需要 R 脚本。我已经考虑了两种选择来做到这一点。在第一个选项中,我喜欢将 lat 和 lon 坐标解析为如下所示的 R 脚本。然后最后我希望 R 脚本将 x 和 y 返回给 python 脚本,但我不知道该怎么做。

project<-function(lat,lon){

library(sp)
library(rgdal)

xy <- cbind(x = lon, y = lat)
S <- SpatialPoints(xy)
proj4string(S) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
Snew <- spTransform(S, CRS("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs"))
x <- coordinates(Snew)[1]
y <- coordinates(Snew)[2]

return(x,y)
}

对于我的第二个选项,我考虑在底部使用 R 脚本,其中已经包含 lat 和 lon。我尝试使用 subprocess.Popen('Rscript project.r', shell=True).wait() 从 python 运行它,但这似乎不起作用。它不会写入 xy.txt 文件。但是,如果我从 cmd 行运行它,则 R 脚本可以完成这项工作。谁能帮我解决这两个选项之一?

library(sp)
library(rgdal)

lat <- 52.29999924
lon <- 4.76999998

xy <- cbind(x = lon, y = lat)
S <- SpatialPoints(xy)
proj4string(S) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
Snew <- spTransform(S, CRS("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs"))
x <- coordinates(Snew)[1]
y <- coordinates(Snew)[2]

cat(x, file="xy.txt",sep="")
cat(y,file="xy.txt",append=TRUE)
4

2 回答 2

1

在我看来你快到了,一些评论:

  • x <- coordinates(Snew)[1]选择第一项,用于x <- coordinates(Snew)[,1]获取整个向量。这假设您传递 和 的向量latlon而不是单个值。这里没有理由为什么我们不应该允许传递 的向量lat lon

  • return(x,y)无效,R 不支持返回多个对象。相反,只是return(cbind(x,y)).

  • 在我会使用的函数内部require

关于从 Python 运行代码,我会看一下Rpy。这允许您从 Python 中调用 R 代码。Rpy 为您来回传递 R 对象做了很多艰苦的工作,所以在这种情况下这是一个不错的选择。

我在 Rpy 中采用的方法是放入project一个.R文件,source那个文件,然后调用project.

于 2013-05-08T17:31:37.413 回答
0

对于您的第一个解决方案 - 让 R 将坐标输出到控制台(使用 print 或 cat 或 R 中的任何内容),然后在 Python 中捕获它(参见此处:从 Python 运行 shell 命令并捕获输出

这将为您提供一个带有 lat/lon 坐标的字符串,您只需使用适当的 Python 函数将它们解析出来。

于 2013-05-08T17:26:43.613 回答