テキストファイルやDBの緯度経度情報を空間ファイルに変換せずにTableauで開く方法 - その1
Tableauと緯度経度情報の関係
Tableau 10.2からShape fileやKMLと言った空間ファイルをサポートしました
空間ファイルを利用することで、お手軽・高速にTableau上で扱うことができるようになりました
緯度経度情報が含まれているデータが空間ファイルであれば良いのですが、テキストファイルやDBの場合にライン・ポリゴン形状の緯度経度情報をお手軽・高速にTableau上で扱うには空間ファイルに変換するか、Tableau Extract Data(tde)形式の空間ファイルを必要があります
記事の内容
この記事ではTableauと緯度経度情報を取り扱う方法として以下の内容が記載されています
チュートリアルとして、空港の緯度経度情報をTableauで表示するまでを二つのステップに分けて説明いたします
- Mac OS上でTableau SDK for pythonをインストール
- Tableau SDK for pythonでテキストファイル(CSV)をTableau Data Extract (TDE) fileに変換
プログラムの説明
OpenFlights Data(https://openflights.org/data.html)のairports.dat (CSV)をTableau上で表示します
記事の対象
何らかのコマンドラインプログラムを書いたことがあるTableau User
前提
PythonからTableau Extract Data(tde)形式の空間ファイルを作成するには以下の環境が必要になります
- TableauSDK for python
- python 2.7
この記事の実行環境
この記事は以下の環境で実行しています
- Mac OS X
- Python 2.7.12 (Anaconda 4.2.0 (x86_64))
- Tableau 10.4
- TableauSDK-10300.17.0915.2101
Tableau SDKのインストール
zipファイルのダウンロード
Installing the Tableau SDKからPython版のSDKファイルをダウンロードします
Mac OS Xは、Mac OS X (64-bit)を選択しました
※Windows/Mac/Linuxごとにファイルがあります。
アーカイブの展開
Mac OS XのSafariでダウンロードしたところ、ダウンロードフォルダに"Tableau-SDK-Python-OSX-64Bit-10-3-3.tar.gz"というファイルができました
こちらを"~/work"フォルダ展開します
Mac OS Xの場合はターミナルを開いて以下のコマンドを実行してください
```bash
tar xvzf ~/Downloads/Tableau-SDK-Python-OSX-64Bit-10-3-3.tar.gz -C ~/work
※ファイル名が異なる場合はダウンロードしたSDKのファイル名(*.tar.gz)で読み替えてください
## Tableau SDKのインストール
解凍フォルダに移動して、 Tableau SDKをインストールします
pythonのバージョンは以下のコマンドで確認できます
```bash
python --version
Python 2.7.12 :: Anaconda 4.2.0 (x86_64)
pythonが2.7ではない場合は、pyenvなどを利用し、python2.7にしてください
https://qiita.com/mogom625/items/b1b673f530a05ec6b423
インストール
cd ~/work/TableauSDK-10300.17.0915.2101/
python setup.py build
python setup.py install
sudo python setup.py install
※1 出力ログは非表示
※2 sudoは、不要の場合あり
Tableau SDKを用いてテキストファイルをTDEに変換する
作業フォルダ
作業フォルダは"work/tableau_sdk_test"とします
Mac OS Xの場合はターミナルを開いて以下のコマンドを実行してください
mkdir ~/work/tableau_sdk_test/
cd ~/work/tableau_sdk_test
空港の空港の緯度経度情報を入手する
OpenFlights Data(https://openflights.org/data.html)から[airports.dat](https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat)ダウンロードをして、作業フォルダにおきます
pythonコード
airports.datを保存したフォルダと同じ場所にairport2tde.pyを作成します
内容は以下です
#!/usr/bin/env python
# -*- coding: utf-8 -*-
###
# @nishiokya
#
# OpenFlights Data(https://openflights.org/data.html)のairports.dat (CSV)をTableau上で表示できるようになる
#
# Python = 2.7
###
from tableausdk import Type
from tableausdk.Extract import *
import csv,codecs
# Where the origin data comes from
#csvLocation = 'https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat'
csvLocation = 'airports.dat'
# Where the TDE will be written
extractLocation = 'all_airport.tde'
# csv column number for origin/destination coordinates (start count at 0 for the first col in your csv)
#####################################################################
## Process the data and write the TDE
#####################################################################
# 1. ExtractAPIの初期化
ExtractAPI.initialize()
# 2. TDEファイルの作成
new_extract = Extract(extractLocation)
# 3. TDEファイルのテーブル定義
# https://openflights.org/data.html
table_definition = TableDefinition()
table_definition.addColumn('Airport ID', Type.INTEGER) # column 0
table_definition.addColumn('Name', Type.UNICODE_STRING)#1
table_definition.addColumn('City', Type.UNICODE_STRING)#2
table_definition.addColumn('Country', Type.UNICODE_STRING)#3
table_definition.addColumn('IATA', Type.UNICODE_STRING)#4
table_definition.addColumn('ICAO', Type.UNICODE_STRING)#5
table_definition.addColumn('geometry', Type.SPATIAL)#6
table_definition.addColumn('Timezone', Type.INTEGER)#7
table_definition.addColumn('DST', Type.UNICODE_STRING)#8
table_definition.addColumn('Tz database time zone', Type.UNICODE_STRING)
table_definition.addColumn('Type', Type.UNICODE_STRING)#10
table_definition.addColumn('Source', Type.UNICODE_STRING)#11
# 4.抽出ファイルがあれば追記、なければ新規
if (new_extract.hasTable('Extract') == False):
new_table = new_extract.addTable('Extract', table_definition)
else:
new_table = new_extract.openTable('Extract')
# 5. 新規レコードを作成する
new_row = Row(table_definition)
# 6. 空港データを読み込んでTDEに抽出
with codecs.open(csvLocation, 'r') as csvfile:
csvreader = csv.reader(csvfile, delimiter=',')
for row in (csvreader):
"""WKT POINT(LON LAT)"
https://ja.wikipedia.org/wiki/Well-known_text
"""
point = 'POINT('+(row[7])+' '+(row[6])+')'
print (point)
new_row.setInteger(0, int(row[0]))
new_row.setString(1, row[1].decode('utf-8'))
new_row.setString(2, row[2].decode('utf-8'))
new_row.setString(3, row[3].decode('utf-8'))
new_row.setString(4, row[4])
new_row.setString(5, row[5])
new_row.setSpatial(6, point)
new_row.setInteger(7, int(row[8]))
new_row.setString(8, row[9])
new_row.setString(9, row[10])
new_row.setString(10, row[11])
new_row.setString(11, row[12])
new_table.insert(new_row)
# 7. TDEファイルの保存
new_extract.close()
# 8. ExtractAPI のクリーン
ExtractAPI.cleanup()
pythonの実行
Mac OS Xの場合はターミナルを開いて以下のコマンドを実行してください
成功すれば、all_airport.tdeというファイルができるはずです
python airport2tde.py
Tableauでの確認
デザインは興味ないんで。。。。
お願い
今回の記事は緯度経度情報を、空間ファイルではなくTDEに変換する手法の使い方を説明しました
ただしTableau SDKによるプログラム作成が必要なので面倒な作業です
CSVファイルやDB内部の緯度経度情報を変換処理を介さずにTableauで表示できたほうがよいですよね?
CSVファイルやDB内部の緯度経度情報をTableauで表示のことを実現したい人が以下のTableau IDEASに要望を出しています
Plot WKT fields directly/Tableau Community
Tableauでは、新機能をコミュニティーからの要望が多いものから実現するそうです、もし賛同いただけるようでしたら、1票いれてください
ログインが必要ですが、投票よろしくお願いします