OSGeo4WのPythonでR、GRASS、GDALを連携させる方法

windows7 64bit PCで、OSGeo4Wを使ったpython、r、grass、gdalを連携させるための環境設定メモと、その他もろもろです。
ようするにQGISのプロセッシング(SEXTANTE)をQGISを起動させずにpythonスクリプトでやりたいということです。

※この記事はまだ途中書きですが、忘れそうなので、とりあえずアップします。

RとPythonの連携

1. OSGeo4W 32bit版をインストール。64bit版だとGRASSが上手く動作しない場合があったので。http://trac.osgeo.org/osgeo4w/
2. OSGeo4Wからeasy_installとpipを利用できるように設定。https://trac.osgeo.org/osgeo4w/wiki/ExternalPythonPackages
3. R3.0.2をインストール。http://www.r-project.org/
4. OSGeo4WでRの環境変数を設定

set PATH=C:\Program Files\R\R-3.0.2\bin;%PATH%
set R_HOME=C:\Program Files\R\R-3.0.2

5. rpy2のバイナリをダウンロードしてインストール。http://www.lfd.uci.edu/~gohlke/pythonlibs/

easy_install rpy2-2.3.8.win32-py2.7.exe

6. pythonで以下のコードを打って動作確認

import rpy2.robjects as robjects
robjects.r("""library("MASS")""")
stepAIC = robjects.r("stepAIC")
robjects.r("""data("iris")""")
rslt = robjects.r("""lm(Sepal.Length~.,data=iris)""")
print(stepAIC(rslt))

http://www.slideshare.net/gepuro/rpython

ついでに

Rとは関係ないけど、そのうち使いそうな以下のパッケージもインストール。
ただし、OSGeo4Wで入るものとバージョンが違うものがあるので、そのあとQGISとかGRASSが正しく動くかどうかは?
(いまのところ大丈夫だけど。。。)

easy_install scipy-0.13.2.win32-py2.7.exe
easy_install pandas-0.13.0.win32-py2.7.exe
easy_install numpy-MKL-1.8.0.win32-py2.7.exe
easy_install matplotlib-1.3.1.win32-py2.7.exe
pip install ipython #これもeasy_installでいいとおもうけど、pipで入ったのでpipでいれた
補足

pyr2ではなくpyperというのもあるらしい
http://mia-0032.hatenablog.jp/entry/2013/08/30/000000

OSGeo4Wでのpipを使ったコンパイル&インストール

単にpip install rpy2とかだと、コンパイラがないため"Unable to find vcvarsall.bat"のエラーがでる。
VC2008Express Editionを入れてコンパイルしても相性が悪い?せいかうまくいかない。
記事によるとMinGWgccを使えばうまくいくらしい。けど試していない。

http://ultrainfinitum.blogspot.jp/2012/12/python-error-unable-to-find-vcvarsallbat.html
http://lists.faunalia.it/pipermail/animov/2013-August/001125.html

pythonディストリビューションを利用する

OSGeo4Wのpythonにこだわらなければ、windows用のpythonディストリビューションを利用すればよいのかも。
https://www.enthought.com/downloads/
https://store.continuum.io/
ただし、rpy2は入ってないみたい。

GRASSとPythonの連携

OSGeo4Wで以下の環境変数を設定する。バッチファイルにしておくと便利かも

REM インストーラーバージョンの場合はOSGEO4W_ROOTは↓に置き換えてください。
REM set OSGEO4W_ROOT=C:\Program Files (x86)\QGIS Dufour\
set OSGEO4W_ROOT=C:\OSGeo4W
set GISBASE=%OSGEO4W_ROOT%\apps\grass\grass-6.4.3
set GISRC=%APPDATA%\GRASS6\grassrc6
set LD_LIBRARY_PATH=%GISBASE%\lib;%LD_LIBRARY_PATH%
set PATH=%GISBASE%\bin;%GISBASE%\etc;%GISBASE%\etc\python;%GISBASE%\lib;%GISBASE%\extralib;%OSGEO4W_ROOT%\apps\msys\bin;%PATH%
set GRASS_SH=%OSGEO4W_ROOT%\apps\msys\bin\sh.exe
set PYTHONPATH=%GISBASE%\etc\python

動作確認

import grass.script as grass
import grass.script.setup as gsetup
import os,sys

gisbase = os.environ['GISBASE']
gisdb = "C:/Users/hogehoge/grassdata"
location = "newLocation"
mapset = "testmapset"
gsetup.init(gisbase, gisdb, location, mapset)
  
r = grass.read_command("g.list", type='rast')
print r

ポイントでラスタ値を抽出してグラフにする

その1 RとRGDALとPython

http://www.r-bloggers.com/extracting-raster-values-from-points-in-r-and-grass/
Rのコード

require(rgdal)
r<-readGDAL("dem5.tif")
r<-readGDAL("tci.tif")
p<-readOGR("test","sansyouuo")
proj4string(p) <- proj4string(r)
print(over(p,r))

R & Pythonのコード(途中、グラフ部分追加)

import rpy2.robjects as robjects
r = robjects.r
r("""require("rgdal")""")
rast = r.readGDAL("dem5.tif")
point = r.readOGR("test","sansyouuo")
r.proj4string(point)[0] = r.proj4string(rast)[0]
data = r.over(point,rast)
print data[0]
その2 PythonとGDALで

http://wiki.gis-lab.info/w/Extract_raster_values_at_vector_points_location_with_Python/GDAL

    • そのままだとエラーなので書き直し
気が向いたらコードを修正
その3 GRASSとPython

やらない

ipython notebookを使ってみる

http://blog.godo-tys.jp/2013/07/10/3073/