[連載]フリーソフトによるデータ解析・マイニング...

7
6回に渡って連載した「Rと空間統計」は、 今回で最後となる。最後はテーマの構成上、 十分説明できなかったrgdalパッケージを利用 した機能を紹介する。rgdalパッケージをイン ストールし、RjpWikiの「空間的なデータの分 析」[1]の練習用データからrgdaldemo.txtをダ ウンロードして、C:/GISdataフォルダに入れ ておいてほしい。 1. maptoolsのkmlOverlay機能 Google EarthをRの出力系に利用する場合、 ベクターデータを用いると非常に美しく描画 されるが、ベクターデータのKMLを作成する には結構手間がかかる。 そこで、簡易にKMLデータを作成する方法 として、maptoolsパッケージのkmlOverlay( ) 関数が利用できる。 この関数は、Rのグラフィック画面で作成 されたPNG画像(ラスターデータ)をGoogle Earthのグリッド上に配置し、そのデータを KML出力することで、オーバーレイを実現す る。PNGデータは、透過度属性(transparent) を設定できるため、背景を透明にしたオーバ ーレイが可能である。 さて、それではGoogle Earth上にポイント データをオーバーレイさせてみる(表1の rgdaldemo.txtを参照)。 まずライブラリの宣言を行う。 次に、出力用のファイル名をセットする。 kmlfileはGoogle Earthに読み込むKML本体 で、kmlpngはオーバーレイするためのラスタ ーデータである。 次に、データセットのquakesを呼び出す。 データセットの内容は、 と実行すれば、R data setsウィンドウが表示 されるので、そこで確認できる。 52 ESTRELA 2008年2月(No.167) データキューブ㈱医療情報システム部主任 牧山 文彦 (Makiyama Fumihiko) ■琉球大学医学部大学院保健学研究科修了。女子栄養大学大 学院保健学研究科修了、保健学博士(学術)。琉球大学医学 部保健管理学助手、秀和綜合病院企画・電算室学術情報主任、 ちばなクリニック健康管理センター事務チーフを経て、2007 年4月より現職。E-mail:[email protected] [連載]フリーソフトによるデータ解析・マイニング 第55回 >library(maptools) >library(rgdal) >kmlfile <- "C:/GISdata/kmlOverlay.kml" >kmlpng <-"C:/GISdata/kmlOverlay.png" >data()

Upload: others

Post on 22-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: [連載]フリーソフトによるデータ解析・マイニング …mjin/R/PDF/200802_55.pdfGoogle Earthが起動し、「場所」タブ内に kmlOverlayVector.kmlレイヤが表示され、群

6回に渡って連載した「Rと空間統計」は、

今回で最後となる。最後はテーマの構成上、

十分説明できなかったrgdalパッケージを利用

した機能を紹介する。rgdalパッケージをイン

ストールし、RjpWikiの「空間的なデータの分

析」[1]の練習用データからrgdaldemo.txtをダ

ウンロードして、C:/GISdataフォルダに入れ

ておいてほしい。

1. maptoolsのkmlOverlay機能Google EarthをRの出力系に利用する場合、

ベクターデータを用いると非常に美しく描画

されるが、ベクターデータのKMLを作成する

には結構手間がかかる。

そこで、簡易にKMLデータを作成する方法

として、maptoolsパッケージのkmlOverlay( )

関数が利用できる。

この関数は、Rのグラフィック画面で作成

されたPNG画像(ラスターデータ)をGoogle

Earthのグリッド上に配置し、そのデータを

KML出力することで、オーバーレイを実現す

る。PNGデータは、透過度属性(transparent)

を設定できるため、背景を透明にしたオーバ

ーレイが可能である。

さて、それではGoogle Earth上にポイント

データをオーバーレイさせてみる(表1の

rgdaldemo.txtを参照)。

まずライブラリの宣言を行う。

次に、出力用のファイル名をセットする。

kmlfileはGoogle Earthに読み込むKML本体

で、kmlpngはオーバーレイするためのラスタ

ーデータである。

次に、データセットのquakesを呼び出す。

データセットの内容は、

と実行すれば、R data setsウィンドウが表示

されるので、そこで確認できる。

52 ● ESTRELA 2008年2月(No.167)

データキューブ㈱医療情報システム部主任

牧山 文彦(Makiyama Fumihiko)

■琉球大学医学部大学院保健学研究科修了。女子栄養大学大学院保健学研究科修了、保健学博士(学術)。琉球大学医学部保健管理学助手、秀和綜合病院企画・電算室学術情報主任、ちばなクリニック健康管理センター事務チーフを経て、2007年4月より現職。E-mail:[email protected]

[連載]フリーソフトによるデータ解析・マイニング 第55回

>library(maptools)>library(rgdal)

>kmlfile <- "C:/GISdata/kmlOverlay.kml">kmlpng <-"C:/GISdata/kmlOverlay.png"

>data()

p52-58 解析(牧山)20-2135 08.2.7 10:54 AM ページ 52

Page 2: [連載]フリーソフトによるデータ解析・マイニング …mjin/R/PDF/200802_55.pdfGoogle Earthが起動し、「場所」タブ内に kmlOverlayVector.kmlレイヤが表示され、群

ちなみに、quakesの内容は「Locations of

Earthquakes off Fiji」であり、フィジー諸島周

辺の地震が発生した地点のデータである。

さて、まず、quakesのデータをSpatialPoints

DataFrameに変換する。

これで、SpatialPointsDataFrameが作成され

た。ただ、このままではプロジェクション

(地図の座標系・投影法)が指定されていない

ので、更に指定を行う(プロジェクションに

ついては後の節にて詳しく扱う)。

これで、プロジェクションの指定ができた。

確認してみると、

2008年2月(No.167) ESTRELA ● 53

>qk <- SpatialPointsDataFrame(quakes[, c(2:1)], quakes)

>proj4string(qk) <- CRS("+proj=longlat")

表1 rgdaldemo.txt

#kmlOverlaylibrary(maptools)library(rgdal)kmlfile <- "C:/GISdata/kmlOverlay.kml"kmlpng <-"C:/GISdata/kmlOverlay.png"qk <- SpatialPointsDataFrame(quakes[, c(2:1)], quakes)proj4string(qk) <- CRS("+proj=longlat")SGqk <- GE_SpatialGrid(qk,maxPixels = 600)#<=ここがミソpng(file=paste(kmlpng, sep=""), width=SGqk$width, height=SGqk$height,bg="transparent")par(mar=c(0,0,0,0), xaxs="i", yaxs="i")plot(qk, xlim=SGqk$xlim, ylim=SGqk$ylim,pch="+",col="red")dev.off()kmlOverlay(SGqk, kmlfile,kmlpng)system(paste('"C:/Program Files/Google/Google Earth/GoogleEarth.exe"',kmlfile),wait=FALSE)

#writeOGRlibrary(maptools) library(rgdal)x<-readShapePoly("C:/GISdata/gunma.shp")proj4string(x)<-CRS("+proj=longlat")kmlfileV <- "C:/GISdata/kmlOverlayVector.kml"writeOGR(x,kmlfileV,"gunma","KML")system(paste('"C:/Program Files/Google/Google Earth/GoogleEarth.exe"',kmlfileV),wait=FALSE)

#EPSGコード epsg<-make_EPSG()epsg[1,1:3]

#プロジェクションの変換 library(maptools)x<-readShapePoly("C:/GISdata/gunma.shp")proj4string(x)<-CRS("+init=epsg:4612")plot(x)

>str(qk)Formal class 'SpatialPointsDataFrame'[package "sp"] with 5 slots..@ data : 'data.frame': 1000 obs. of 5variables:. . . .$ lat : num [1:1000] -20.4 -20.6 -26.0

-18.0 -20.4 .... . . .$ long : num [1:1000] 182 181 184 182

182 .... . . .$ depth : int [1:1000] 562 650 42 626

649 195 82 194 211 622 .... . . .$ mag : num [1:1000] 4.8 4.2 5.4 4.1 4 4

4.8 4.4 4.7 4.3 .... . . .$ stations: int [1:1000] 41 15 43 19 11 12

43 15 35 19 .....@ coords.nrs : num(0) ..@ coords : num [1:1000, 1:2] 182 181 184182 182 ...

p52-58 解析(牧山)20-2135 08.2.7 10:54 AM ページ 53

Page 3: [連載]フリーソフトによるデータ解析・マイニング …mjin/R/PDF/200802_55.pdfGoogle Earthが起動し、「場所」タブ内に kmlOverlayVector.kmlレイヤが表示され、群

であり、一番下の@projargsの中に"+proj =

longlat +ellps =WGS84"が設定されているこ

とがわかる(+ellps=WGS84は自動的に設定

される)。

さて、次に、作成したqkをGoogle Earth上

のグリッドに割り当てる。

ちなみに、maxPixelsでPNG画像の密度を指

定することができる。

さて、これで準備が整ったので、実際に

PNG画像を出力させる。

PNG画像のwidth, heightは作成した

SGqkのものを使う。また、背景を透明

にするため、bg =" transparent "を指定

する。また、par( )関数で、mar, xaxs,

yaxsを指定する。そして、plot( )関数を

実行させ、dev.off( )関数でグラフィッ

クデバイスを終了させる。

最後に、kmlOverlay( )関数でKMLを

出力する。

このように、タグ付きのKMLデータが作成

され、指定したファイル名に出力される。

それでは、Google Earthで表示してみよう。

Rから直接Google Earthを起動するためには、

下記のコードを使う。

Google Earthが起動し、フィジー諸島の周

辺に赤い「+」で地震が発生した地点が表示

されたと思う(図1)。

54 ● ESTRELA 2008年2月(No.167)

. . . . - attr(*, "dimnames")=List of 2

. . . . . . $ : NULL

. . . . . . $ : chr [1:2] "long" "lat"

. .@ bbox : num [1:2, 1:2] 165.7 -38.6 188.1-10.7

. . . . - attr(*, "dimnames")=List of 2

. . . . . . $ : chr [1:2] "long" "lat"

. . . . . . $ : chr [1:2] "min" "max"

. .@ proj4string:Formal class 'CRS' [package"sp"] with 1 slots

.. .. . .@ projargs: chr " +proj=longlat+ellps=WGS84"

>SGqk <- GE_SpatialGrid(qk,maxPixels = 600)

>kmlOverlay(SGqk, kmlfile,kmlpng)[1] "<?xml version='1.0' encoding='UTF-8'?>"[2] "<kml xmlns='http://earth.google.com/kml/2.0'>"[3] "<GroundOverlay>"[4] "<name>R image</name>"[5] "<Icon><href>c:/GISdata/kmlOverlay.png</href><viewBoundScale>0.75</viewBoundScale></Icon>"[6] "<LatLonBox><north>-10.72</north>< s o u t h > - 3 8 . 5 9 < / s o u t h > < e a s t > 1 8 8 .158103454744</east><west>165.67</west></LatLonBox>"[7] "</GroundOverlay></kml>"

>system(paste('"C:/Program Files/Google/Google Earth/GoogleEarth.exe"',kmlfile),wait=FALSE)

>png(file=paste(kmlpng,sep=""),width=SGqk$width,height=SGqk$height,bg="transparent")>par(mar=c(0,0,0,0), xaxs="i", yaxs="i")>plot(qk, xl im=SGqk$xlim, yl im=SGqk$ylim,pch="+",col="red")>dev.off()null device

1

図1 kmlOverlay

p52-58 解析(牧山)20-2135 08.2.7 10:54 AM ページ 54

Page 4: [連載]フリーソフトによるデータ解析・マイニング …mjin/R/PDF/200802_55.pdfGoogle Earthが起動し、「場所」タブ内に kmlOverlayVector.kmlレイヤが表示され、群

この手法は、Rのグラフィック画面で表示

されたポイントデータを簡単にGoogle Earth

上に表示できるため、色々な場面で利用でき

ると考えられる。

2. rgdalのwriteOGRを用いたShapeFileの変換

さて、次に、rgdalパッケージのwriteOGRを

用いてShapeFileを直接KMLに変換してみる。

まず、前節と同様にライブラリ宣言を行う。

次に、ShapeFileを読み込む(ここでは以前

に利用した群馬県のShapeFileデータを用い

る)。

これで、群馬県のShapeFileデータがSpatial

PolygonDataFrameに設定された。

次に、出力用のKMLファイル名を指定し、

KML出力を実行する。

ワーニングメッセージが表示され、KMLフ

ァイルが出力される。さて、早速KMLファイ

ルを開いてみよう。

Google Earthが起動し、「場所」タブ内に

kmlOverlayVector.kmlレイヤが表示され、群

馬県の行政界が赤い線で表示される(図2)。

さて、現状のwriteOGRには、いくつかの問

題が見つかっている。

まず、「場所」タブ内にkmlOverlayVector.

kmlレイヤを開いて各行政界の情報を見てみ

ると、文字化けを起こしていると思う。これ

は、Google EarthのKMLの文字コードが標準

でUTF-8になっており、kmlOverlayVector.kml

は、Shift-JISで出力されていることに起因する。

これを回避するには、秀丸エディタ等のテキ

ストエディタでKMLの文字コードをUTF-8に

変換し、保存すればよい。

また、他の問題として、ワーニングメッセ

ージにもあるように、ShapeFileのcoordinate

には高さ情報がないため、そのままKML変換

をしてもKMLの<coordinates>タグの中には高

さ情報のないデータの形で変換されてしまう。

そのため、KMLデータの後利用時に支障が出

る恐れがある。

このように、writeOGRを用いた変換には多く

の問題が存在するが、これらの問題はGDAL/

OGRライブラリのバージョンが上がれば解決

していくと思われるので、GDAL/OGRライブ

ラリの開発者側の作業の進行を待ちたい。

2008年2月(No.167) ESTRELA ● 55

フリーソフトによるデータ解析・マイニングフリーソフトによるデータ解析・マイニング

>library(maptools)>library(rgdal)

>x<-readShapePoly("C:/GISdata/gunma.shp")>proj4string(x)<-CRS("+proj=longlat")

>system(paste('"C:/Program Files/Google/GoogleEarth/GoogleEarth.exe"',kmlfileV),wait=FALSE)

>kmlfileV <- "C:/GISdata/kmlOverlayVector.kml">writeOGR(x, kmlfileV, "gunma", "KML")Warning message:Unknown coordinate reference system: forKML driver should be geographical in: writeOGR(x, paste(kmlfileV, sep = ""), "gunma","KML")

図2 writeOGR

p52-58 解析(牧山)20-2135 08.2.7 10:54 AM ページ 55

Page 5: [連載]フリーソフトによるデータ解析・マイニング …mjin/R/PDF/200802_55.pdfGoogle Earthが起動し、「場所」タブ内に kmlOverlayVector.kmlレイヤが表示され、群

3. CRSクラスと地図の座標系・投影法の変換

rgdalは、多くのオープンソース系GISに用

いられている汎用ラスター/ベクターデータ

変換ライブラリGDAL/OGR[2]および地図投影

変換ライブラリPROJ.4をRで利用可能にした

パッケージである。

では、まず最初に、rgdalで利用できるラス

ターデータ、ベクターデータのフォーマット

およびプロジェクションのリストを表示して

みる。

このように、多くのフォーマットに対応し

ていることがわかる。

さて、実際にプロジェクションの指定を行

うためには、CRSクラスを利用する。CRSと

はCoordinate Reference Systemの略で、プロ

ジェクションを指定するクラスであり、spパ

ッケージも同じクラスを持っている。

プロジェクションの指定にはいくつかの方

法 が あ る が 、 SRID( Spatial Reference

Identifier:空間参照識別子/世界中の種々の

空間参照系を整理してユニークな番号を割り

振ったもの)で一般的に用いられているEPSG

コード[3]を利用すると、比較的簡単に指定で

きることが知られている。表2には比較的ポ

ピュラーなEPSGコードを示した。実際に

rgdalで呼び出してみると、

と表示される。

これは、実際に用いられているEPSGコード

の1番の中身を見たものである。EPSGコード

をCRSクラスに適応させる場合は、

と指定すれば、EPSGコードに対応したプロジ

ェクションが設定される。

56 ● ESTRELA 2008年2月(No.167)

>getGDALDriverNames()name long_name create copy

1 AAIGrid Arc/Info ASCII Grid FALSE TRUE2 AIG Arc/Info Binary Grid

FALSE FALSE3 AirSAR AirSAR Polarimetric Image

FALSE FALSE4 BMP MS Windows Device Independent Bitmap

TRUE FALSE5 BSB Maptech BSB Nautical Charts

FALSE FALSE6 BT VTP .bt (Binary Terrain) 1.3 Format

TRUE FALSE<以下省略>

>ogrDrivers()name write

1 AVCBin FALSE2 CSV TRUE3 DGN TRUE4 ESRI Shapefile TRUE5 GML TRUE6 KML TRUE7 MapInfo File TRUE<以下省略>

>projInfo() name description

1 aea Albers Equal Area2 aeqd Azimuthal Equidistant3 airy Airy

4 aitoff Aitoff5 alsk Mod. Stererographics of Alaska6 apian Apian Globular I7 august August Epicycloidal8 bacon Bacon Globular<以下省略>

>library(rgdal)>epsg<-make_EPSG()>epsg[1,1:3]code note prj41 4001# Unknown datum based

upon the Airy 1830 ellipsoid+ proj=longlat +ellps=airy +no_defs

CRS("+init=epsg:コード番号")

p52-58 解析(牧山)20-2135 08.2.7 10:54 AM ページ 56

Page 6: [連載]フリーソフトによるデータ解析・マイニング …mjin/R/PDF/200802_55.pdfGoogle Earthが起動し、「場所」タブ内に kmlOverlayVector.kmlレイヤが表示され、群

2008年2月(No.167) ESTRELA ● 57

フリーソフトによるデータ解析・マイニングフリーソフトによるデータ解析・マイニング

EPSG分類 ESRI proj ellps datum units 備考

4326WGS84 4326 longlat WGS84 WGS84 緯度・経度 GPS、海図、Google Earth

32651 32652 32653 32654 32655 32656

UTM 102151 102152 102153 102154 102155 102156 32651 32652 32653 32654 32655 32656

utm utm utm utm utm utm utm utm utm utm utm utm

bessel bessel bessel bessel bessel bessel WGS84 WGS84 WGS84 WGS84 WGS84 WGS84

WGS84 WGS84 WGS84 WGS84 WGS84 WGS84

m m m m m m m m m m m m

Zone 51N 東経120~126 Zone 52N 東経126~132 Zone 53N 東経132~138 Zone 54N 東経138~144 Zone 55N 東経144~150 Zone 56N 東経150~156 Zone 51N 東経120~126 Zone 52N 東経126~132 Zone 53N 東経132~138 Zone 54N 東経138~144 Zone 55N 東経144~150 Zone 56N 東経150~156

4301 30161 30162 30163 30164 30165 30166 30167 30168 30169 30170 30171 30172 30173 30174 30175 30176 30177 30178 30179

日本国内 旧測地系 (Tokyo datum)

4301 30161 30162 30163 30164 30165 30166 30167 30168 30169 30170 30171 30172 30173 30174 30175 30176 30177 30178 30179

longlat tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc

bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel bessel

緯度・経度 m m m m m m m m m m m m m m m m m m m

旧公共座標系I 旧公共座標系II 旧公共座標系III 旧公共座標系IV 旧公共座標系V 旧公共座標系VI 旧公共座標系VII 旧公共座標系VIII 旧公共座標系IX 旧公共座標系X 旧公共座標系XI 旧公共座標系XII 旧公共座標系XIII 旧公共座標系XIV 旧公共座標系XV 旧公共座標系XVI 旧公共座標系XVII 旧公共座標系XVIII 旧公共座標系XIX

4612 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461

日本国内 新測地系 (JGD2000)

4612 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461

longlat tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc tmerc

GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80 GRS80

緯度・経度 m m m m m m m m m m m m m m m m m m m

新公共座標系I 新公共座標系II 新公共座標系III 新公共座標系IV 新公共座標系V 新公共座標系VI 新公共座標系VII 新公共座標系VIII 新公共座標系IX 新公共座標系X 新公共座標系XI 新公共座標系XII 新公共座標系XIII 新公共座標系XIV 新公共座標系XV 新公共座標系XVI 新公共座標系XVII 新公共座標系XVIII 新公共座標系XIX

表2 EPSGコード表(抜粋)

出典)Bubble://ちずろぐ/別館/(http://bubble.atnifty.com/)

p52-58 解析(牧山)20-2135 08.2.7 10:54 AM ページ 57

Page 7: [連載]フリーソフトによるデータ解析・マイニング …mjin/R/PDF/200802_55.pdfGoogle Earthが起動し、「場所」タブ内に kmlOverlayVector.kmlレイヤが表示され、群

たとえば、Google Earthに用いられている

WGS84(World Geodetic System 1984:地球

重心に原点を持つ測地座標系)は、EPSGコー

ドの4,326番で、CRS(" + init =epsg:4326 ")

と指定することになり、前節の

の部分は、

と表現することができる。

また、以前に行った群馬県の描画では、

と す る こ と で 、 日 本 国 内 の 新 測 地 系

(JGD2000)での描画が実行され、ゆがみの

ない行政界を表示させることが可能となる

(図3)。

4. おわりにさて、6カ月に渡ってRと空間統計に関連

するテーマでお話をさせていただきましたが、

Rの空間統計関連パッケージの各専門分野の

事柄については、残念ながら詳しく紹介でき

ませんでした。

そのため、各専門分野の方々には消化不良

の部分が多々あったかと思いますが、Rを利

用した空間統計の可能性については紹介する

ことができたと思います。

ご存知の通り、Rの進化はとどまるところ

を知りません。Rを利用した研究は全世界で

行われているため、明日にも新しいパッケー

ジが公開されているかもしれません。

2007年12月現在、パッケージ数は1,250を超

え更に増え続け、専門的なパッケージを細か

く紹介することは難しくなってきています。

そのため、新しいパッケージや興味あるパッ

ケージを発見したら、ぜひRjpWikiに投稿して

ください。Rを進化させるのは「あなた」で

す。

最後に、このような執筆の機会を与えてく

ださった同志社大学文化情報学部教授 金 明哲

先生に心から感謝申し上げます。ありがとう

ございました。

*参考文献・URL[1] RjpWiki:空間的なデータの分析(http://www.

okada.jp.org/RWiki/?%B6%F5%B4%D6%C5%AA%A4%CA%A5%C7%A1%BC%A5%BF%A4%CE%CA%AC%C0%CF).

[2] GDAL - Geospatial Data Abstraction Library(http://www.gdal.org/).

[3] Tyler Mitchell(大塚恒平他訳):入門Webマッピング 自分で作るオリジナルのデジタル地図:オライリー・ジャパン社, pp.297 - 298.

58 ● ESTRELA 2008年2月(No.167)

>proj4string(x)<-CRS("+proj=longlat")

>proj4string(x)<-CRS("+init=epsg:4326")

>library(maptools)>x<-readShapePoly("C:/GISdata/gunma.shp")>proj4string(x)<-CRS("+init=epsg:4612")>plot(x)

図3 プロジェクションの変換

p52-58 解析(牧山)20-2135 08.2.7 10:54 AM ページ 58