読者です 読者をやめる 読者になる 読者になる

Windowsでrgrass7を動かす時のメモ(途中で挫折)

以前にLinuxでのやり方は調べたんですが、その後手元のR環境がWindowsになったので使えなくなりました。

notchained.hatenablog.com

で、Windowsでもできないか調べてましたが、つらすぎました。。とりあえずやったところまでメモっておきます。

GRASSをインストール

WindowsGIS環境を整えるのに手っ取り早いのはOSGeo4Wでしょう。

OSGeo4W

OSGeo4W_jp – OSGeo4W

ただし、2015年9月27日現在、64bit版のGRASSのバージョンは6.4でした。64bit版のGRASS 7がほしければ、個別にインストールする必要があります。その場合でも、依存パッケージがいろいろややこしいので、OSGeo4WをインストールしたあとにGRASS 7をインストールするほうが確実な気がします。

GRASS GIS - Download GRASS GIS for MS-Windows

詳細は割愛します。

環境変数の設定

再掲になりますが、以下の環境変数を設定する必要があります。

It is possible to access GRASS modules without explicitly starting a "GRASS session". GRASS libraries require certain environment variables to be set. In fact a "GRASS session" is just a set of processes (e.g. a shell and/or GUI) which have the necessary environment settings, specifically:

  • GISBASE needs to be set to the top-level directory of the GRASS installation.
  • GISRC needs to contain the absolute path to a file containing settings for GISDBASE, LOCATION_NAME and MAPSET.
  • PATH needs to include $GISBASE/bin and $GISBASE/scripts.

If the GRASS libraries are shared libraries, the loader needs to be able to find them. This normally means that LD_LIBRARY_PATH (Linux, Solaris), DYLD_LIBRARY_PATH (MacOSX) or PATH (Windows) need to contain $GISBASE/lib, although there are other means to the same end (e.g. on Linux, putting $GISBASE/lib (with $GISBASE replaced by its actual value) into /etc/ld.so.conf then running ldconfig).

(Working with GRASS without starting it explicitly - GRASS-Wiki)

Windowsの場合はライブラリへのパスもPATHに入れる必要があります(LinuxのときはLD_LIBRARY_PATHでした)。

で、ドキュメントのどのへんに書いてあるのかよく分からないんですが、他にもGDALとかPROJ.4の場所とかを環境変数で指定しないといけなかったり、こまごま必要な設定があります。たぶん、Ubuntuでやってたときは、その辺りはパッケージをインストールするときに勝手にやってくれてたんだろうな…

よく分かりませんが、こんな.Renvironを置いておけば動くようになりました。.Renvironは、Rのセッションが始まった際に設定する環境変数を書くファイルです。

GISRC           = grassrc
GISBASE         = "C:\Program Files (x86)\GRASS GIS 7.0.1"
GRASS_PYTHON    = ${GISBASE}\extrabin\python.exe
PYTHONHOME      = ${GISBASE}\Pythonexport
GRASS_PROJSHARE = ${GISBASE}\share\prexport
PROJ_LIB        = ${GISBASE}\share\proj
GDAL_DATA       = ${GISBASE}\share\gdal
GEOTIFF_CSV     = ${GISBASE}\share\epsg_cexport
PATH            = "${PATH};${GISBASE}\bin;${GISBASE}\scripts;${GISBASE}\lib;${GISBASE}\extrabin"

詳細は割愛しますが、grassrcは、GRASS用の設定ファイルです。カレントディレクトリに置きます。

MAPSET: user1
GISDBASE: grassdata
LOCATION_NAME: nc_basic_spm_grass7
GUI: text

grassdataはデータを置いておく場所です。↓こんな感じのファイル配置になっています。

.
\_grassdata
   \_nc_basic_spm_grass7
      \_user1
         \_...(データ)
\_.Renviron
\_grassrc

rgrass7を動かしてみる

これで、readRAST()は動くようになります。

library(rgrass7)
#> Loading required package: sp
#> Loading required package: XML
#> GRASS GIS interface loaded with GRASS version: GRASS 7.0.1 (2015)
#> and location: nc_basic_spm_grass7

example("readRAST")
...(略)
#> CZfg_217 CZlg_262 CZig_270 CZbg_405 CZve_583 CZam_720  CZg_766 CZam_862 CZbg_910   Km_921 CZbg_945 CZam_946 CZam_948 
#>   725562   198684   689373   253710    21609     4824     7074    61722    44964    12528        9     4068      873 
#> 217 CZfg 725562
#> 262 CZlg 198684
#> 270 CZig 689373
#> 405 CZbg 253710
#> 583 CZve 21609
#> 720 CZam 4824
#> 766 CZg 7074
#> 862 CZam 61722
#> 910 CZbg 44964
#> 921 Km 12528
#> 945 CZbg 9
#> 946 CZam 4068
#> 948 CZam 873
#> Hit <Return> to see next plot: 
#>  +----------------------------------------------------------------------------+
#>  | Map:      sqdemSP                        Date: Sun Sep 27 14:38:44 2015    |
#>  | Mapset:   user1                          Login of Creator: yutani          |
#>  | Location: nc_basic_spm_grass7                                              |
#>  | DataBase: grassdata                                                        |
#>  | Title:     ( sqdemSP )                                                     |
#>  | Timestamp: none                                                            |
#>  |----------------------------------------------------------------------------|
#>  |                                                                            |
#>  |   Type of Map:  raster               Number of Categories: 0               |
#>  |   Data Type:    DCELL                                                      |
#>  |   Rows:         1350                                                       |
#>  |   Columns:      1500                                                       |
#>  |   Total Cells:  2025000                                                    |
#>  |        Projection: Lambert Conformal Conic                                 |
#>  |            N:     228500    S:     215000   Res:    10                     |
#>  |            E:     645000    W:     630000   Res:    10                     |
#>  |   Range of data:    min = 7.45511854848878  max = 12.5031941719687         |
#>  |                                                                            |
#>  |   Data Description:                                                        |
#>  |    generated by RINBIN~1                                                   |
#>  |                                                                            |
#>  |   Comments:                                                                |
#>  |    RINBIN~1 -d input="grassdata/nc_basic_spm_grass7/user1/.tmp/unknown/\   |
#>  |    X73" output="sqdemSP" bytes=8 header=0 bands=1 order="native" north=\   |
#>  |    228500 south=215000 east=645000 west=630000 rows=1350 cols=1500 anul\   |
#>  |    l=6                                                                     |
#>  |                                                                            |
#>  +----------------------------------------------------------------------------+
...(略)

が、readVECTは動きません。。

readVECT("schools", plugin=NULL)
#> Error: !is.null(driver) is not TRUE

なにかの識別子を間違えてるというバグのような気がするんですが、深追いしていません。(参考

※追記(2015/10/17):修正されていました。

結論

WindowsがつらいのかGRASSがつらいのかよく分かりません。つらいです。

ほんとは↓これを使って河川勾配のグラフを描きたかったんですが力尽きました。

GRASS GIS manual: r.stream.channel


追記:readVECT、直ってました。

head(readVECT("schools", plugin=NULL))
#> WARNING: OGR layer <schools> already exists and will be overwritten
#> Exporting 167 features...
#> 
#> VOUTOG~1 complete. 167 features (Point type) written to <schools>
#> (ESRI_Shapefile format).
#> OGR data source with driver: ESRI Shapefile 
#> Source: "grassdata/nc_basic_spm_grass7/user1/.tmp/unknown", layer: "schools"
#> with 167 features
#> It has 29 fields
#>            coordinates cat TAG        NAMESHORT                    NAMELONG
#> 1 (633649.3, 221412.9)   1 568      SWIFT CREEK      SWIFT CREEK ELEMENTARY
#> 2 (628787.1, 223961.6)   2 340       BRIARCLIFF       BRIARCLIFF ELEMENTARY
#> 3 (629900.7, 222915.8)   3 414 FARMINGTON WOODS FARMINGTON WOODS ELEMENTARY
#> 4 (630686.5, 224447.8)   4 368             CARY                   CARY HIGH
#> 5 (631183.9, 224911.4)   5 304            ADAMS            ADAMS ELEMENTARY
#> 6 (622534.6, 218794.5)   6 308             APEX             APEX ELEMENTARY
#>   CORECAPACI MOBILEUNIT MOBILECAPA GLEVEL LOGRADE HIGRADE CALENDAR HASBASE ISMAGNET
#> 1        448          2         NA      E    <NA>    <NA>        T    <NA>     <NA>
#> 2        540          0         NA      E    <NA>    <NA>        T    <NA>     <NA>
#> 3        523          7         NA      E    <NA>    <NA>        T    <NA>     <NA>
#> 4       2287          4         NA      H    <NA>    <NA>        T    <NA>     <NA>
#> 5        722          9          0      E    <NA>    <NA>        Y    <NA>     <NA>
#> 6        586          2         NA      E    <NA>    <NA>        T    <NA>     <NA>
#>     PHONE ADDRNUMBER ADDRPREFIX          ADDRROOT ADDRTYPE ADDRSUFFIX ADDRCITY
#> 1 2334320       5601       <NA>          Tryon Rd     <NA>       <NA>  Raleigh
#> 2 4603443       1220       <NA>           Pond St     <NA>       <NA>     Cary
#> 3 4603469       1413       <NA> Hampton Valley Rd     <NA>       <NA>     Cary
#> 4 4603549        638       <NA>         Walnut St     <NA>       <NA>     Cary
#> 5 4603431        805       <NA>   Cary Towne Blvd     <NA>       <NA>     Cary
#> 6 3872150        700       <NA>         Tingen Rd     <NA>       <NA>     Apex
#>   ADDRZIPCOD SPED STATUS NODEID CAPACITYTO ESL BOARDDIS2 PROJ_CAP NOTES
#> 1      27606   NA      E  422.1        520   N         5      520  <NA>
#> 2      27511   NA      E  384.3        506   Y         9      506  <NA>
#> 3      27511   NA      E  384.2        721   Y         9      721     1
#> 4      27511   NA      H  370.2       2254   Y         9     2302    15
#> 5      27511   NA      E  369.1        830   Y         9      853     2
#> 6      27502   NA      E  386.0        632   Y         8      632  <NA>
#> Warning message:
#> In vColumns(vname) : vColumns: v.info -c output not in two columns:
#> Displaying column types/names for database connection of layer <1>: