第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 Colsby Index にして、latitude では Start Col IndexEnd 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 Maplandmask4k にします。このままだと陸地と座標が合わないので、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

この結果を使って latitudelongitude に反映させると日本だけの位置情報が表示されます。

徐々に表示させる

Trim CHOPLFO CHOPReorder CHOP などを使用すると少しずつポイントを表示させることもできます。

本日の課題

日本以外の国を表示させてみてください country-capitals.csv には世界の首都の情報が入っています。この CSV を使用して地球上に首都を表示させてみてください

参考

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