今回は DAT と Python を使った簡単なデータビジュアライゼーションをやります!
サンプルファイル
chimanaco/takara-univ-media-programming-2021
13が本日のディレクトリです。
今回はロケーションデータを持った CSV を使って、簡単なデータビジュアライゼーションをしてみたいと思います。地球を模した Sphere に位置情報をプロットしていきます。
CSV とは
CSV は Comma Separated Value、つまりカンマで区切られたテキストファイルで、Excel や Google Spreadsheet などを始めとして、メモ帳などのアプリでも開くことができます。Excel 標準の xlsx ファイルより軽量なテキストデータであるため使い勝手がとてもいいです。また、Google Spreadsheet などからも CSV を書き出すこともできます。
無料で使えるデータを取得する
世の中では様々なデータが無料で配布されているのですが、今回は以下の世界の空港の所在地のデータを使用します。
data/airports-dafif.dat
をダウンロードして、拡張子を .csv に変更しています。データは今日のサンプルファイルの data ディレクトリにありますので、みなさんはそちらを使用してください。
データを読み込んで、経度と緯度を取得する
csv ファイルを読み込むには File In DAT
を使用して、読みこみたいファイルを指定します。
そこに Select DAT
を2つ接続し、それぞれ latitude
(緯度)、 longitude
(経度)と名前をつけます。両方とも Select Cols
を by Index
にして、latitude
では Start Col Index
と End Col Index
を5に、longitude
では4にします。これは使用している CSV データの何 column 目にあるかという意味です。
これらをそれぞれ DAT To CHOP
で CHOP に変換し、Merge CHOP
で2ch のデータにします。
latitude と longitude から、3D 空間上の座標を取得する
Script CHOP
を接続し、callbacks に以下の Python のコードをコピペします。
import math
def onCook(scriptOp):
input = scriptOp.inputs[0]
scriptOp.clear()
scriptOp.numSamples = input.numSamples
lat = input[0]
lon = input[1]
tx = scriptOp.appendChan('tx')
ty = scriptOp.appendChan('ty')
tz = scriptOp.appendChan('tz')
for i in range(scriptOp.numSamples):
theta = (-lat[i] + 90) / 180.0 * math.pi
phi = (lon[i] + 90) / 180.0 * math.pi
tx[i] = math.sin(theta) * math.sin(phi)
ty[i] = math.cos(theta)
tz[i] = math.sin(theta) * math.cos(phi)
結果 tx, ty, tz の座標が取得できます。
3D 空間上に配置する
これらを使用して、geometry instancing で小さくした Sphere を配置していきます。
このままだと少しわかりにくいので、陸地を追加します。サンプルファイルの中にある landmask4k
を使用します。
Material を Constant MAT
にして、Color Map
は landmask4k
にします。このままだと陸地と座標が合わないので、Transform SOP
を使用して Scale の x と z に -1 を入れて反転させます。
また、Constant MAT
も blending の設定をして alpha がいい感じに表示されるようにします。
カメラを追加して完成です。
特定の国だけ表示する
使用している csv ファイルは国の情報も入っているので、特定の国だけ抜き出して表示することもできます。
今度は File In DAT
の後に Script DAT
を使用します。callback には以下のように記述します。
def onCook(scriptOp):
scriptOp.clear()
# get input DAT
indat = scriptOp.inputs[0]
# test each row
for r in indat.rows():
# see if any of the cell strings are in our list
found = False
for cell in r:
if (cell.val == "JA"):
found = True
# add row if found
if found:
scriptOp.appendRow(r)
return
この結果を使って latitude
と longitude
に反映させると日本だけの位置情報が表示されます。
徐々に表示させる
Trim CHOP
や LFO CHOP
、Reorder CHOP
などを使用すると少しずつポイントを表示させることもできます。
本日の課題
日本以外の国を表示させてみてください country-capitals.csv には世界の首都の情報が入っています。この CSV を使用して地球上に首都を表示させてみてください