(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【R言語】山岳立体データを取得して可視化する

スポンサーリンク

山頂立体地図データ

以下の国土地理院のサイトにて日本の山岳データが取得できます。
立体地図(日本の主な山岳)

*山名をクリックすると、「地理院地図」で、山頂付近が表示されます。
【3D表示】をクリックすると、山頂付近が立体地図表示されます。

例えば富士山を選択して3D表示すると以下のようにブラウザに表示されます。
f:id:mtiit:20190420085432p:plain
マウスで任意の角度にぐりぐりと動かすことも可能です。

このデータが素晴らしいのは、元データをダウンロード可能な点にあります。

フォーマットとしては3種類、STL*1VRML*2WebGLです。

STLファイル 色を付けられない3Dプリンタ用のデータ .stl
VRMLファイル フルカラーの3Dプリンタ用のデータ .wrl / .png / .pgw
WebGL用ファイル ブラウザでぐるぐる回す用のファイル .html / .csv / .png / .pgw

今回は扱いやすそうなWebGL用のファイルを利用し、標高データを二次元配列に格納して可視化を行います。

R言語のコマンドに関しては以下記事もご参考ください。

標高データを3次元プロット

今回使うのはdem.csvファイルです。標高データが格納されています。
ただし、データの形式等を確認するためにindex.htmlファイルもダウンロードしました。

$ cat dem.csv | wc
      0       1 1220775
$ cat dem.csv
21.392565615589863,21.30734226230675,21.283279197850344,21.25495496572978,21.25495496572978...

このようにdem.csvにはカンマ区切り、改行なしで標高に関する値が格納されています。

構造を確認すべく、index.htmlファイルの中身を見てみます。

    var vTextureSizeW              = 2048;
    var vTextureSizeH              = 2048;
    /****************************************************/
    var vMeshSizeW              = 256;
    var vMeshSizeH              = 256;

データはどうやら縦横同じサイズのようです。

カンマを改行に変換して行数を確認すると66049行でした。

$ cat dem.csv | awk 'BEGIN{RS=",";ORS="\n"}{print $0}' | wc
  66049   66049 1220776

数字に強い方ならピンとくる通り、66049とは257の二乗なのでデータは257x257として格納されているようです。

> sqrt(66049)
[1] 257

この前提にてデータを配列に落とし込みます。

> mt_fj <- matrix(scan("C:\\Users\\XXXX\\Downloads\\dem.csv",sep=","),nrow=257)
Read 66049 items
> persp(mt_fj)

f:id:mtiit:20190420092334p:plain

問題なく可視化できました。

日本三名山を可視化

日本三名山と謳われる

  • 富士山
  • 白山
  • 立山

を立体画像にし、回転動画として可視化してみます。

山名(山頂名) 都道府県 標高
富士山(剣ヶ峯) 山梨県,静岡県 3776m
白山(御前峰) 石川県,岐阜県 2702m
立山(大汝山) 富山県 3015m
回転用GIF作成スクリプト例
library(animation)
plot3d360 <- function() {
  for (i in 1:360)  {
    persp(mt_fj, theta = i-1, phi = 30, expand = 0.5)
  }
}
saveGIF(plot3d360(), interval=0.05,movietype="gif", outdir=getwd(),width=640, height=480)
富士山

f:id:mtiit:20190420104642g:plain

白山

f:id:mtiit:20190420123727g:plain

立山

f:id:mtiit:20190420125407g:plain

終わりに

本記事ではオープンデータである山岳データを配列データとして格納し、persp関数でプロットしました。
尚、山の高さは引数にて「expand=0.5」としただけなので実際の縮尺にはなっていません。ただ、富士山の美しさを再認識しました。

生データがあればアイデア次第で可視化できるので、同様のことに興味がある方の参考になったなら幸いです。以上です。

*1:STL : Standard Triangulated Languageの略

*2:VRML : Virtual Reality Modeling Languageの略