GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

【ArcMapとArcpy】オープンデータを使って自分だけの地図を作ろう! ~世界の空港編~

今回はオープンデータについてです。オープンデータとは誰もが自由に利用でき、再利用や再配布が許可されているデータのことを指します。つまり、著作権フリーで自由に利用可能」ということです。素晴らしいですね!オープンデータをうまく活用すれば地図上にこんなことをすることが可能です。

①「世界のサッカー場を配置してみる」
②「世界のダイビングポイントを配置してみる」
③「世界のお酒の名店を配置してみる」

ただし、それぞれ座標を調べる必要があるので、そういったものが公開されているデータを利用するのが現実的かと思います。←①を作りたいのですが、公開されているデータがなく断念しました。
とりあえず、今回は世界の空港が配置された世界地図を作ってみようと思います。まずは素の世界地図をthematicmapping.orgからダウンロードします。

いい感じですね!
f:id:sanvarie:20160116153906p:plain

続いて、空港のデータをOpenFlights: Airport and airline dataからダウンロードします。

datになっていますね。
f:id:sanvarie:20160116154151p:plain

コピペしてCSVを作成します。以下のような感じですね。
f:id:sanvarie:20160116155208p:plain

そして、マップレイヤに作成したCSVを追加してください。
f:id:sanvarie:20160116170853p:plain

CSVを右クリックして「XYデータの表示」をクリックしてください。←これArcpyでできないのかなぁ。
f:id:sanvarie:20160116171028p:plain

こんな感じでOKをおしてください。
f:id:sanvarie:20160116171100p:plain

エラーが出ますが、無視してかまいません。
f:id:sanvarie:20160116171128p:plain

ポイントが配置されました。空港ってこんなあるんですね(笑)
f:id:sanvarie:20160116171241p:plain

日本だけでもこんなにあります。
f:id:sanvarie:20160116171735p:plain

とりあえず国別の空港数と1空港あたりの利用人数を抽出してみました。

サンプルコード

numpyとpandasが必要です。

# -*- coding: utf-8 -*-
import arcpy
import pandas as pd
import numpy as np

#フィーチャの属性をpandasに食べさせる
arrAir = arcpy.da.TableToNumPyArray("AirPort", ('Country'))
df = pd.DataFrame(arrAir)

#国ごとの空港数を集計する
dfAir = pd.DataFrame(df['Country'].value_counts())
dfAir.columns = ['AirPortNum']
dfAir['Country'] = 0
for key,rowD in dfAir.iterrows():
    dfAir['Country'][key] = key

#フィーチャの属性をpandasに食べさせる
arrCountry = arcpy.da.TableToNumPyArray("TM_WORLD_BORDERS-0.3", ('NAME','POP2005'))
dfCountry = pd.DataFrame(arrCountry)
dfCountry.columns = ['Country', 'POP2005']

#データフレームを結合させる
dfMerge= pd.merge(dfAir,dfCountry,on='Country',how='right')

#1空港あたりの利用人数を計算
dfMerge['CAL'] = dfMerge['POP2005'] / dfMerge['AirPortNum']

#CSV出力
dfMerge.to_csv('D:\python\global\AirPortByCountry.csv',encoding="SHIFT-JIS")

出力したCSVを確認してみるとアメリカが圧倒的ですね。AirPortNumが空港数、POP2005が2005年の人口、CALが1空港あたりの利用人数です。これを元に国の色分けをしたらおもしろそうなので、以下スクリプトを追加してください。
f:id:sanvarie:20160116184249p:plain

#カラム追加
arcpy.AddField_management("TM_WORLD_BORDERS-0.3", "CAL", "Double")

for key,rowD in dfMerge.iterrows():
    cursorJ = arcpy.UpdateCursor("TM_WORLD_BORDERS-0.3")
    for rowJ in cursorJ:
        if rowD.Country == rowJ.NAME:
            rowJ.setValue("CAL", rowD.CAL)
            cursorJ.updateRow(rowJ)

こうなったら成功です。
f:id:sanvarie:20160116185234p:plain

シンボル設定をこのようにしてみました。
f:id:sanvarie:20160116185430p:plain

結果を見ると中国、インドなど人口の多い国が1空港あたりの利用人数が多いということがわかりました。また、欧米は1空港あたりの利用人数が少ないことがわかりました。なんでもヨーロッパなんかは線路を引くのが面倒だから飛行機を飛ばしちまえみたいな感覚だとかなんとか。
f:id:sanvarie:20160116185459p:plain

データの保存

データ>データのエクスポート を行います。これでデータの作成が完了しました。
f:id:sanvarie:20160116171408p:plain

f:id:sanvarie:20160116171517p:plain

こんな感じでシンボルを設定してもおもしろいですね。
f:id:sanvarie:20160116172054p:plain

上記ではShapeに出力しましたが、GDBに保存して、シンボル設定をしたレイヤファイルを作成した方がいいかもしれませんね。そして、今回はたまたま空港のデータを使用しましたが、色々探せばおもしろいデータを発見することができそうですね。例えば、国ごとの犯罪率や地震発生率などを視覚化することができますし、また、サッカーW杯優勝回数やその国に属するクラブの世界ランキングを考慮した上の国ごとの世界ランキングなんかも作れると思います。その場合、やはりヨーロッパ、南米が強いということが視覚的にわかるのではないでしょうか。次回以降も色々やってみたいと思います。

以上、本日は「【ArcMapとArcpy】オープンデータを使って自分だけの地図を作ろう! ~世界の空港編~」でした。