Tableau可視化に用いるKMLファイルをTableau Prepで作成する #tableau
下記エントリではTableau Desktop v2018.2で「空間情報におけるPolyline(線)やPolygon(面)のレンダリング方法が変わった」旨ご紹介する内容となりましたが、検証・確認に使ったKMLファイルについては紹介を割愛していました。
当エントリでは、その"割愛した"部分、下記のTableau公式ブログで紹介されている「フライトデータをTableauで可視化するためにTableau Prepを用いる」という手順について、実際に手元で試してみた内容をご紹介したいと思います。
目次
入力データの入手・準備
手順に倣い、情報を公開している「OpenFlighs」へアクセス。
空港データ(airports)
空港のマスタ的な情報を格納しているファイル「airports.dat」をCSVファイル(拡張子:*.csv)として保存します。
こちらのファイルについては、ヘッダが存在していません。ページ内にはヘッダに関する情報自体は存在しているので、これを使ってヘッダ行の文字列を作成します。
以下の形でヘッダ行を冒頭に追加し、ファイルとして用意しました。
"Airport ID","Name","City","Country","IATA","ICAO","Latitude","Longitude","Altitude","Timezone","DST","Tz database time zone","Type","Source" 1,"Goroka Airport","Goroka","Papua New Guinea","GKA","AYGA",-6.081689834590001,145.391998291,5282,10,"U","Pacific/Port_Moresby","airport","OurAirports" 2,"Madang Airport","Madang","Papua New Guinea","MAG","AYMD",-5.20707988739,145.789001465,20,10,"U","Pacific/Port_Moresby","airport","OurAirports" 3,"Mount Hagen Kagamuga Airport","Mount Hagen","Papua New Guinea","HGU","AYMH",-5.826789855957031,144.29600524902344,5388,10,"U","Pacific/Port_Moresby","airport","OurAirports" 4,"Nadzab Airport","Nadzab","Papua New Guinea","LAE","AYNZ",-6.569803,146.725977,239,10,"U","Pacific/Port_Moresby","airport","OurAirports" 5,"Port Moresby Jacksons International Airport","Port Moresby","Papua New Guinea","POM","AYPY",-9.443380355834961,147.22000122070312,146,10,"U","Pacific/Port_Moresby","airport","OurAirports" :
経路データ(routes)
同様に、経路に関する情報を格納している「routes.dat」もCSVファイル(拡張子:*.csv)として保存します。
ヘッダ行情報はこちらを参考に、
以下の形で先頭に追加しました。
"Airline","Airline ID","Source airport","Source airport ID","Destination airport","Destination airport ID","Codeshare","Stops","Equipment" 2B,410,AER,2965,KZN,2990,,0,CR2 2B,410,ASF,2966,KZN,2990,,0,CR2 2B,410,ASF,2966,MRV,2962,,0,CR2 2B,410,CEK,2968,KZN,2990,,0,CR2 2B,410,CEK,2968,OVB,4078,,0,CR2 :
出力データ(の仕様)について
出力データ(Tableau Desktopからすると入力データ)となるKMLについては、以下公式情報をご参照ください。
この仕様を元に、以下の様な構成を持つ(>Placemark/<要素が複数件存在する形)、拡張子*.kmlのファイルをTableau Prepで作成して行きます。
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Placemark> <name>HND - LAX</name> <description>Tokyo Haneda International Airport - Los Angeles International Airport</description> <LineString> <coordinates>139.779999,35.552298999999998 -118.4079971,33.942501069999999</coordinates> </LineString> </Placemark> : : </kml>
Tableau Prep フロー作成実践
KML情報生成のためのデータ準備
まずはKMLの情報を作成するために必要となる空港ルート情報を準備します。経路情報(routes)と空港情報(airports)をそれぞれTableau Prepから開き、入力情報として定義します。
source/destinationのベースとなる情報は「routes」側なので、こちらの情報にsource/destinationそれぞれの空港情報を紐付ける形でデータを構成していきます。routes側の「+」印をクリックし「結合の追加」を選択。
追加した結合に対し、airportsのデータをドラッグアンドドロップする形で結合スペースに連携。
以下の様な形で結合設定を行う事が出来るようになります。ここではまずroutes側は「Source airport ID」(出発側の空港ID)、airports側は「Airport ID」を選択。結合条件に合致するデータが右側のウインドウに表示されます。内容を確認後、「ステップの追加」を選択。
後続の処理を分りやすくするために、結合処理で得られたairportsの項目名に一律「Source 」という文字列を手動で付与します。
項目名変更が終わりました。同じ手順で今度はDestination(到着側)のデータを準備します。「結合の追加」を選択。
各種処理の色味は「ステップカラーの編集」で任意の色を選択する事が可能です。
routes側に「Destination airport ID」(出発側の空港ID)、airports側に「Airport ID」を選択し、到着側の空港情報を紐付け。名称についても同様に「Dest 」というプレフィックスを各種項目に付与しました。
計算フィールドを用いた表示要素の作成
これで処理に必要な情報が出来ました。ステップを別途用意し、そのステップで計算フィールドを用いた文字列情報を2つ、作成します。まずは1つ目、「ルート情報」を作成します。「計算フィールドの作成」を選択。
準備した項目を用いて以下の様な文字列情報を生成する計算フィールド「Route」を作成します。
同じ手順でステップを作成し、今度は「KML Placemark」という計算フィールドを作成します。ここで指定した内容はエントリ序盤で解説したKML定義に倣うものとなっています。
実際欲しい情報はこの「KML Placemark」だけですので、他の項目は不要です。Shift押下しながら選択していく事で複数要素を選択可能ですので、別途新しいステップを用意した上でこの項目以外をまとめて選択し、「フィールドの削除」を実施。
すると、以下の様な形で不要な項目が全てクリアされました。
集計処理を用いて重複削除
残った情報の詳細を確認してみます。並び替えを行ってみると、一部データについては同じ内容が複数件あるようです。これは重複排除しておきたいところですね。
「集計処理を追加」して項目のグルーピングを行う事でこの重複を排除する事が出来ます。グループ化するフィールドに該当項目をドラッグアンドドロップする事で処理が行われ、
処理後の内容を確認してみると重複が見られる件数のデータが無くなった事を確認出来ました。
ユニオンを使ってヘッダー・フッター情報を追加
主だった部分の処理はここまでで粗方出来ているのですが、KMLのファイルとしては不完全です。元エントリではユニオンを使って、足りない部分となる「KMLファイルのヘッダー部分とフッター部分」を連結させていますので当エントリでもその手順に倣って実践してみたいと思います。ヘッダーはこちらの内容、
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2">
そしてフッターはこちらの内容を使います。
</kml>
ヘッダーファイルを入力情報として定義。空白文字を含む項目名にしていたので、区切り文字はそこを誤認しないような設定に変更しました。
用意したファイルに対し、前述までの処理を終えた要素をドラッグアンドドロップで「ユニオン」に連携。
以下の様な形で、情報が連結されている事が客員出来ました。
同じ手順でフッター情報も連携します。こちらの意図としては「ヘッダー部分」+「KML Placemarkで作成した中身の部分」+「フッター部分」という順序で連結させたかったのですが、上手く設定する事が出来ませんでした。ひとまずはこの「Table Names」という項目も不要ですので、新規ステップを用意した上で「フィールドの削除」を行います。
ファイル出力
ここまで出来たら後はこれをファイル出力すればオッケーです。「出力の追加」を選択し、
CSV形式でファイルを出力します。(現行はtde, hyper, csvのみ選択可能となっているようです...)
フローが実行され、程無くして処理が完了し、CSVの出力も確認出来ました。
これでこのファイルをそのままTableauで可視化出来るぜ!...と思いきや、幾つかの追加処理を経ないと実際のところは利用出来ませんでした。対応したのは以下2点。
ヘッダー行・フッター行の位置を修正
前述の通り、ユニオンの処理では現状「順序」を指定出来ないようです。また、処理のヘッダ行として用いていた「KML Placemark」という情報も残ったままです。イメージとしてはこんな感じ。
$ vi kml-airport-routes.csv ---- KML Placemark </kml> "<Placemark><name>SJW - HRB</name><description>Shijiazhuang Daguocun International Airport - Taiping Airport</description><LineString><coordinates>114.69699859619141,38.28070068359375 126.25,45.623401641845703</coordinates></LineString></Placemark>" "<Placemark><name>VCE - CDG</name><description>Venice Marco Polo Airport - Charles de Gaulle International Airport</description><LineString><coordinates>12.351900000000001,45.505299000000001 2.5499999523199999,49.012798309300003</coordinates></LineString></Placemark>" "<Placemark><name>LAD - MAD</name><description>Quatro de Fevereiro Airport - Adolfo Suárez Madrid–Barajas Airport</description><LineString><coordinates>13.231200218199998,-8.8583698272699998 -3.56264,40.471926000000003</coordinates></LineString></Placemark>" "<Placemark><name>PHL - RIC</name><description>Philadelphia International Airport - Richmond International Airport</description><LineString><coordinates>-75.241096496582031,39.871898651123047 -77.3197021484375,37.505199432373047</coordinates></LineString></Placemark>" : : <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2">
これを、正しい順序となるように加工しました。
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> "<Placemark><name>SJW - HRB</name><description>Shijiazhuang Daguocun International Airport - Taiping Airport</description><LineString><coordinates>114.69699859619141,38.28070068359375 126.25,45.623401641845703</coordinates></LineString></Placemark>" "<Placemark><name>VCE - CDG</name><description>Venice Marco Polo Airport - Charles de Gaulle International Airport</description><LineString><coordinates>12.351900000000001,45.505299000000001 2.5499999523199999,49.012798309300003</coordinates></LineString></Placemark>" "<Placemark><name>LAD - MAD</name><description>Quatro de Fevereiro Airport - Adolfo Suárez Madrid–Barajas Airport</description><LineString><coordinates>13.231200218199998,-8.8583698272699998 -3.56264,40.471926000000003</coordinates></LineString></Placemark>" : : "<Placemark><name>PHL - RIC</name><description>Philadelphia International Airport - Richmond International Airport</description><LineString><coordinates>-75.241096496582031,39.871898651123047 -77.3197021484375,37.505199432373047</coordinates></LineString></Placemark>" </kml>
不要な文字列を除去・変換
また、動作検証を進めて行く上で以下2点の問題に直面しました。
- データ行の先頭と末尾にダブルクオートが含まれているが、これは不要。
- データ項目の値に一部「&」が含まれるものがあり、これが入っているとデータとして上手く認識してくれない。
これはsedを用いて問題無い形に変換処理をかます事で対応。(ヘッダー部分2行の中に含まれるダブルクオートは必要なので、一旦変換掛ける前にこの2行は別途退避の後実行しました)
ファイルの拡張子についても、このタイミングでKMLファイルの拡張子である*.kmlに変更しています。
$ sed -e 's/"//g' kml-airport-routes.csv | sed -e 's/&/and/g' > kml-airport-routes.kml
以上の手順を踏まえ、欲しかったKMLファイルを作り上げる事が出来ました!
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Placemark><name>SJW - HRB</name><description>Shijiazhuang Daguocun International Airport - Taiping Airport</description><LineString><coordinates>114.69699859619141,38.28070068359375 126.25,45.623401641845703</coordinates></LineString></Placemark> <Placemark><name>VCE - CDG</name><description>Venice Marco Polo Airport - Charles de Gaulle International Airport</description><LineString><coordinates>12.351900000000001,45.505299000000001 2.5499999523199999,49.012798309300003</coordinates></LineString></Placemark> <Placemark><name>LAD - MAD</name><description>Quatro de Fevereiro Airport - Adolfo Suárez Madrid–Barajas Airport</description><LineString><coordinates>13.231200218199998,-8.8583698272699998 -3.56264,40.471926000000003</coordinates></LineString></Placemark> : : <Placemark><name>DLC - CJU</name><description>Zhoushuizi Airport - Jeju International Airport</description><LineString><coordinates>121.53900146484375,38.9656982421875 126.49299621582031,33.511299133300781</coordinates></LineString></Placemark> <Placemark><name>DSM - DCA</name><description>Des Moines International Airport - Ronald Reagan Washington National Airport</description><LineString><coordinates>-93.663101196289062,41.534000396728516 -77.037696999999994,38.8521</coordinates></LineString></Placemark> </kml>
まとめ
という訳で、Tableau Prepを使って任意のデータからKMLファイルを作成する手順についてのご紹介でした。基本的には「KMLの仕様を満たす文字列情報を組み立てていく」というものとなりましたが、Tableau Prepを使って行くことでスムーズなフローを介して生成する事が出来ました。一方で細かい取り回しについては気になる部分もありましたのでその辺りの改善は今後に期待、という感じですね。