第13回 DAT + Python 基礎2

Monday, July 26, 2021

今回は DAT と Python を使った簡単なデータビジュアライゼーションをやります!

サンプルファイル

chimanaco/takara-univ-media-programming-2021
13が本日のディレクトリです。

今回はロケーションデータを持った CSV を使って、簡単なデータビジュアライゼーションをしてみたいと思います。地球を模した Sphere に位置情報をプロットしていきます。

CSV とは

CSV は Comma Separated Value、つまりカンマで区切られたテキストファイルで、Excel や Google Spreadsheet などを始めとして、メモ帳などのアプリでも開くことができます。Excel 標準の xlsx ファイルより軽量なテキストデータであるため使い勝手がとてもいいです。また、Google Spreadsheet などからも CSV を書き出すこともできます。

無料で使えるデータを取得する

世の中では様々なデータが無料で配布されているのですが、今回は以下の世界の空港の所在地のデータを使用します。

jpatokal/openflights: Website for storing flight information, rendering paths on a zoomable world map and calculating statistics, with plenty of free airline, airport and route data.

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 のデータにします。

Network

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 を配置していきます。

Network

このままだと少しわかりにくいので、陸地を追加します。サンプルファイルの中にある landmask4k を使用します。

Network

Material を Constant MAT にして、Color Map は landmask4k にします。このままだと陸地と座標が合わないので、Transform SOP を使用して Scale の x と z に -1 を入れて反転させます。

Network

また、Constant MAT も blending の設定をして alpha がいい感じに表示されるようにします。

Network

カメラを追加して完成です。

特定の国だけ表示する

使用している 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 を使用して地球上に首都を表示させてみてください

参考

第12回 DMXを使った照明器具のコントロール実習