4

Python スクリプトから R スクリプトを実行したいと考えています。異なる座標系で緯度経度座標を投影するには、R スクリプトが必要です。これを行うための 2 つのオプションを検討しました。最初のオプションでは、緯度と経度の座標を以下に示す 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)
}

2 番目のオプションとして、緯度と経度が既に含まれている R スクリプトを下部に使用することを検討しました。これを python から subprocess.Popen('Rscript project.r', shell=True).wait() で実行しようとしましたが、うまくいかないようです。xy.txt ファイルは書き込まれません。ただし、これを cmd ラインから実行すると、R スクリプトが機能します。これら 2 つのオプションのいずれかについて、誰が手伝ってくれますか?

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]ベクター全体を取得するために使用します。これは、単一の値ではなく、 とlatのベクトルを渡すことを前提としています。lonのベクトルを渡してはいけない理由はここにはありませんlat lon

  • return(x,y)R は複数のオブジェクトを返すことをサポートしていません。代わりに、ただreturn(cbind(x,y)).

  • 関数内で使用しますrequire

Python からコードを実行することに関しては、Rpyを見てみたいと思います。これにより、Python 内から R コードを呼び出すことができます。Rpy は、R オブジェクトをやり取りするという大変な作業の多くを行ってくれるので、この場合には良いオプションです。

私がRpyでとるアプローチは、ファイルを入れproject.Rsourceそのファイルを呼び出してproject.

于 2013-05-08T17:31:37.413 に答える
0

最初の解決策として、R を取得して座標をコンソールに出力し (print または cat または R にあるものを使用)、それを Python でキャプチャします (こちらを参照してください: Python からシェル コマンドを実行し、出力をキャプチャする) 。

これにより、緯度/経度の座標を含む文字列が得られます。適切な Python 関数を使用してそれらを解析するだけです。

于 2013-05-08T17:26:43.613 に答える