Ateam Lifestyle Advent Calendar 2019 の12日目は株式会社エイチームライフスタイルでWebエンジニアをしている @water_resistant が担当します。
はじめに
12月といえばクリスマスがあり、街中光がキラキラして楽しくなる季節ですね。
ただクリスマスは1日しかないので、どうせなら一番キラキラしている場所*(聖地と定義)*で楽しみたいかと思います。
今回はそんな人のためにIT技術を使って文字通り最高にキラキラしている場所を探していきます。
使ったツール
今回は一番キラキラしている場所を探すために、Google Earth Engineを使いました。
GoogleEarthEngineとは
公式ページの紹介をみてみます
Google Earth Engineは、衛星画像と地理空間データセットの数ペタバイトのカタログと惑星規模の分析機能を組み合わせて、科学者、研究者、開発者が変化を検出し、傾向を地図化し、地球表面の差異を定量化できるようにします
(Google翻訳済)
つまり衛星画像をデータソースとして様々な分析をできるプラットフォームというわけですね。
今回はこのEarthEngineをキラキラスポット探索の為に利用します。
GooleEarthEngineを使う準備
SingUpフォームにメールアドレスなどの情報と使用用途を記載するだけです。
今回の目的には「明かりをたくさん使っている=電気を沢山使っている場所を調査する」ためと記述。
1日程度時間が空いてから登録完了のメールがきました。
これを受け取った後でないとAPIを呼び出しても認証エラーになります。↓
実はこれだけで衛星画像へのアクセスや加工が簡単にできるようになります。
すごいですね。
今回は触るのが初めてということもあるので、APIではなくIDEからおこなってみます。
今回使用する人工衛星データ
IDEを表示できたので、キラキラスポットを探すために利用するデータを探します。
DataCatalogで「light」と検索をしたところ、いくつかデータを発見。
今回の用途に適してそうなデータ↓
VIIRS Stray Light Corrected Nighttime Day/Night Band Composites Version 1
- 衛星名称
- 使用機材
- Visible/Infrared Imager and Radiometer Suite(VIIRS) / マルチチャンネルイメージャ・放射計
規約についても問題なさそうなのでこれに決定。
NOAAのデータ、情報、および製品は、配信方法に関係なく、著作権の対象ではなく、その後の一般の使用に対する制限はありません。一度取得すると、それらは合法的に使用できます。前述のデータはパブリックドメインにあり、使用と配布に制限なく提供されています。
(Google翻訳済)
データを絞り込むための事前準備
キラキラスポットを探すためには、市区町村(スポット)で区切られたデータで絞り込む必要があります。
そのために行政区域データをダウンロードしてEarthEngineに取り込みます。
規約的にも問題なく信用できそうなデータが政府統計GISデータダウンロードにあったので今回はこれを利用。
(いい感じのサイトが他にありましたが 規約的に今回の用途では無理そうなので断念)
あとはデータをダウンロードしてからEarthEngineのIDEからアップロードするだけです。
データが多すぎるのも困るので今回は愛知県のデータのみアップロードします。 (文字コードのみ注意)
これでプログラムから「区画区切りデータ」を利用することができるようになりました。
実際にデータを取得する
公式ドキュメント などを見ながらコードを書いていく
今回は2014年~2018年の年別データを取得して、光量が多いところや増加傾向のところをキラキラスポットとする。
// 衛星データのBAND: avg_radから日付を指定してImageCollection取得
var y_2014 = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMCFG').select('avg_rad').filter(ee.Filter.date('2014-12-01T00:00:00+09:00','2014-12-01T23:59:59+09:00')).median();
var y_2015 = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMCFG').select('avg_rad').filter(ee.Filter.date('2015-12-01T00:00:00+09:00','2015-12-01T23:59:59+09:00')).median();
var y_2016 = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMCFG').select('avg_rad').filter(ee.Filter.date('2016-12-01T00:00:00+09:00','2016-12-01T23:59:59+09:00')).median();
var y_2017 = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMCFG').select('avg_rad').filter(ee.Filter.date('2017-12-01T00:00:00+09:00','2017-12-01T23:59:59+09:00')).median();
var y_2018 = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMCFG').select('avg_rad').filter(ee.Filter.date('2018-12-01T00:00:00+09:00','2018-12-01T23:59:59+09:00')).median();
// IDE上のMap表示のオプション
var nighttimeVis = {min: 0.0, max: 60.0, opacity: 0.8};
Map.setCenter(136.8809966,35.174377);
Map.setZoom(10);
// IDE上のMapにデータを表示
Map.addLayer(y_2014.clip(aichi_pref_shape), nighttimeVis, '[YEAR] 2014');
Map.addLayer(y_2015.clip(aichi_pref_shape), nighttimeVis, '[YEAR] 2015');
Map.addLayer(y_2016.clip(aichi_pref_shape), nighttimeVis, '[YEAR] 2016');
Map.addLayer(y_2017.clip(aichi_pref_shape), nighttimeVis, '[YEAR] 2017');
Map.addLayer(y_2018.clip(aichi_pref_shape), nighttimeVis, '[YEAR] 2018');
// データ集約方法定義
var reducers_fnc = ee.Reducer.mean().combine({
reducer2: ee.Reducer.minMax(),
sharedInputs: true
}).combine({
reducer2: ee.Reducer.median(),
sharedInputs: true
});
// データ集約
function reduce_collection(image) {
return image.reduceRegions({
collection: aichi_pref_shape,
reducer: reducers_fnc,
scale: 500
})
}
// データ出力タスク定義 (GoogleDrive出力)
function export_table(table, description) {
return Export.table.toDrive({
collection: ee.FeatureCollection(table),
folder: 'EarthEngineExport',
description: description,
selectors: (["KEY_CODE", "CITY", "CITY_NAME", "S_NAME", "JINKO", "SETAI", "mean", "max", "min"])
})
}
// 定義ファイルを参考
// https://www.e-stat.go.jp/gis/statmap-search/data?datatype=2&serveyId=A002005212015&downloadType=1
// データ出力タスク呼び出し
export_table(reduce_collection(y_2014), 'stray_light_2014');
export_table(reduce_collection(y_2015), 'stray_light_2015');
export_table(reduce_collection(y_2016), 'stray_light_2016');
export_table(reduce_collection(y_2017), 'stray_light_2017');
export_table(reduce_collection(y_2018), 'stray_light_2018');
上記コードを実行すると、愛知県区画に絞られたデータが結果に出てきます。↓
あとはIDEの「Task Run」からデータ出力用の関数を実行します。
GoogleDriveに格納されているのを確認できました。↓
IDEはグラフィカルに見ることができるのがいいですが、定量的に測る際は適切ではないので今回はCSV出力してそこでデータを比較することにしました。
いざデータ加工
出力されたCSVファイルを結合して年別推移を見られるようにしたのが下のキャプチャです。
CAGRでソートしてみたところ、「岡崎市 宮石町」が2016年から4倍跳ね上がっていたので調べてみます。
該当住所をGoogleMapで調べたところ、エリア内にSA(サービスエリア)を見つけました。↓
NEXCO中日本、2016年2月13日15時にオープンする新東名「岡崎SA」
なるほど面白いですね。
ただCAGRランキング上位を見ても、私が求めているキラキラとは少し違うので、別の観点「過去5年間の平均値」で見ていきます。
上位5件はこうなりました。
- 中区 錦3丁目
- 中区 新栄町1丁目
- 中区 栄4丁目
- 一宮市 丹陽町三ツ井字平山
- 中区 新栄町2丁目
中区 錦3丁目 | 中区 新栄町1丁目 | 中区 栄4丁目 | 一宮市 丹陽町三ツ井字平山 | 中区 新栄町2丁目 |
---|---|---|---|---|
「栄」や「錦」が出ることは予想してましたが、、 4位は完全に予想外です。何か変な建物が見えますが...。
(実は一宮は4位だけでなく、それ以降もそれなりにでてきます。)
ただひょっとしたら**キラキラスポット(聖地)**の答えがここにあるかもしれないと思ったので少し探ります。
衛星の分解能が400m-800mで、区間分割がうまく行かずに明るくなっていると思われるので
該当の住所をEarthEngine側で拡大してみましょう。
IC(インターチェンジ)近くが無茶苦茶明るい様子。
確かに豪華絢爛なお城が多いですもんね。
知りたくなかった。
まとめ
GoogleEarthEngineは、水温や気温を始めとして凄く沢山のデータがあります。
例えば下のようなデータについては図書館に行かずともPCの前に居ながら出すことができます。
- 森林がどれだけ減っているのか
- 気温/海温はどれだけ変動しているのか
使い方は簡単ながらも、非常に多くを知ることができるので、自分の視点で地球を一度見てみるのも面白いかと思います。
(本来はその用途のツールです)
あとクリスマスに向けてのキラキラスポット(聖地)調査は全くもって役に立たなかった。
Ateam Lifestyle Advent Calendar 2019 の 13日目は、 @poncoがお送りします!
私のネタエントリとは違う、しっかりした記事を書いてきてくれることでしょう!
そんな”挑戦”を大事にするエイチームグループでは、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。興味を持たれた方はぜひエイチームグループ採用サイトを御覧ください。
今回のコード
今回作成したデータやコードへのリンクを貼っておきます。
(EarthEngineはアカウント登録してないと見れないです。)