見出し画像

MIERUNEインターン #002 酒井肇さん

MIERUNEでは、弊社への就業に興味がある方向けに、1週間程度のインターンを実施しております。このたび、2023年9月25日から29日までの5日間、酒井さんにインターンへご参加いただきました。
本記事は酒井さんご自身によるレポートになります。

自己紹介

酒井肇(さかい じょう)さん
文系博士課程の学生。データ分析関連でpythonは1年半ほど触っていた。Qiitaの記事でMIERUNEを知り、インターンが可能かどうか問い合わせして、その後2回面談してMIERUNEのインターンに参加。

インターン概要

期間:2023/9/25-29の5日間
内容:PythonによるQGISプラグイン開発 (JAXA Earth APIプラグインの更新)
メンター:井口さん(位置エン本の著者)

成果物:

  • JAXA Earth APIのQGISプラグインのデータ選択ボタンのUI改善

  • JAXA Earth API for Pythonの問題の発見(年を跨いでデータの日付選択をすると、同じ画像が2回返されてしまうバグ)

  • 衛星画像データを用いたGIFの作成

(ブータンとその周辺国における2021年1月〜12月までのNDVIの変化)

JAXA Earth APIプラグインとは?

昨年、MIERUNEがJAXA Earth APIのQGISプラグインを開発した。これにより、QGISから数クリックで標高/地表面温度/植生指数/降水量/土地被覆分類図など74種類ものデータを手軽に検索・閲覧できる。今回のインターンでは、このプラグインを更新した。

QGISプラグインのイメージ

インターンで実施した内容の詳細

準備(Day1, 2 & 適宜)

  • プラグイン開発の基礎トレーニング、衛星データの構造の理解、Githibの理解

    • QGISのプラグイン開発に関する基礎的なトレーニングを行った。PyQt5などのpythonライブラリを使用し、開発では主にQgsProject / QgisInterfaceというクラスを使用する。

    • 衛星データに関して、COG /STACの説明・解説。jsonが数珠繋ぎになっている()。

    • GitHubの使い方。commit, pull, branch, main,などの用語の確認、デモ、解説。前にGithubを使用したことがあったがだいぶ忘れていたので有り難かったです。

STACの説明をしている風景

JAXA Earth APIのQGISプラグイン開発(Day2~5)

  • 今回のインターンでは、このプラグインが抱えていた2つの課題を解決し、更新した。

    • 1.データの選択機能の課題

    • 2.動画作成の課題

  • 課題1−1:データセットを検索しづらい

    • すでにプラグインでは、70以上ある衛星データセットの中から欲しいものを選んでダウンロードしてQGIS上に表示できた。

    • しかし、「日本限定のデータセット」と「全球(世界)をカバーしているデータセット」を一見で見分けづらかった

このプルダウンには70以上の要素が分類なしに含まれている
  • 解決1−1:そこでデータセットをglobal, local , unknownの3つに分類して検索できるようにした

    • 具体的には、データセットのbbox内部の経度の幅(-180<longitude<180, longitude =[180, -180], その他)を元にデータセットを分類しComboxの表示を3つにした。

    • ちなみに、一番下のUnknownは、北極を中心にした特殊なEPSG / 投影法で、bbox内部の値が異常に高く(低く)なる。

    • この時、Qtというアプリ開発用のツールキットを初めて利用。

    • 問題がないかのチェックする方法として、QGISプラグインのコードを更新するたびに、「Manage and Install Plugins」からチェックを消して、また入れ直すことで、Pluginを一回リフレッシュして、確かめるという方法を採用。

Global, Local, Unknownでカテゴリ分けして探しやすくなった
Qt DesignerによるUIデザイン
  • 課題1−2:「日時の設定範囲ボタン」がデータセットとリンクしていない

    • 各々のデータセットは観測期間の開始(&終了)が異なる。

    • 例えば、「Aerosol Optical Depth at 500 nm (Daytime/Daily)」では、APIで配信されているデータは「2018/01/01 - 2023/09/30」の期間である。しかし、以前のプラグインでは日時の設定範囲をすると、各々のデータセットに合わせて設定されておらず(以前は2017年内で制限)、毎回試しにダウンロードするかHPを調べなけらばならなかった。

    • 解決1ー2:データセットに合わせて日時を設定可能になった。

      • 配信されている時間の情報をもとに、データセットに合わせて日時を設定した。

データに応じた時間範囲で検索
  • 課題2:時系列データなのに時系列で見られない

    • Loadした衛星データの画像はQGIS上で表示できるが、せっかく時系列データをダウンロードしているのにアニメーションなどが出来ず、時系列変化を見たいときは、いちいちレイヤーを切り替える必要があった。

    • 解決2:QGISの標準機能であるTemoporal Controllerで時系列変化を手軽に見れるようにした

      • まず、そもそもTemporal Controllerをどう出現させるか。Temporal Controllerを出すにはボタンなどがないところで右クリックして、「Temporal Controller Panel」を選べば良い。

Temporal Controllerが表示される
  • このTemporal Controllerでアニメーションを表示できるように、各レイヤーに時間情報を持たせた。(ただ、酒井作成時点では、必要な時間情報の取得がややこしいために暫定的に架空の時間情報を持たせてアニメーション作成をしていたが、その後メンターの井口さんが改善。)

レイヤーのプロパティに、そのレイヤーが表す時系列情報を自動設定
  • このことで、QGISのTemporal Controllerでアニメーションを表示できるようになった。

  • さらに、ローカルでGIFを作成した。まず、このTemoporal Controllerの保存ボタンにによって作成された複数のpngをダウンロードする(自分の場合は, ”bhuan_pngs"という名前で保存)。

各コマのPNG画像を出力することができる
  • 次に、pythonを用いて自分のローカル環境(conda)でGIFを作成。

import os
from PIL import Image

#変数。適宜変更
number_of_files =48
duration= 200
loop= 0


# Specify the folder path where the PNG files are located
folder_path = "./bhuan_pngs"  #パスは適宜変更

# Initialize an empty list to store the PIL Image objects
images_list = []

# List all files in the folder
file_list = os.listdir(folder_path)

file_list = sorted(file_list)

# Filter for PNG files (you can customize this filter if needed)
png_files = [file for file in file_list if file.lower().endswith(".png")]

# Ensure you have 48 files or fewer, adjust the range if needed
for i in range( min(number_of_files,len(png_files))):
    # Construct the full file path
    file_path = os.path.join(folder_path, png_files[i])

    # Open the PNG file as a PIL Image and append it to the list
    try:
        img = Image.open(file_path)
        images_list.append(img)
    except Exception as e:
        print(f"Error reading {file_path}: {e}")

        
# print(png_files)
images_list[0].save('./bhutan.gif', #パスは適宜変更
               save_all=True, append_images=images_list[1:], optimize=False, duration=duration)
(ブータンとその周辺国における2021年1月〜12月までのNDVIの変化)※冒頭画像
  • 理想的にはQGISでGIFを作り、ダウンロードできるようにしたかったが、厳しかったため、このようにローカルで作成した。

  • 幸いアニメーション・GIFを作成したことにより、 JAXAのAPIに問題(年を跨いで日付選択すると、同じ画像が返されてしまうバグ)があることに気がついた。

まとめ:

  • QGIS特有のPythonライブラリ、Qt Designerなどを使用してUIの改善を行った。

  • STACに準拠して配信されているデータセットを扱い、GIF画像の作成まで行った。

今後できればいいな、ということ。

  • resolutionの情報を加えたい。

  • 衛星画像データを利用した異常値の検出。過去に観測された時系列データからモデルを作り(ARIMAなど)、次の値を予測してその値と実際に観測された値の差を見る、など。

  • まだVS Code、GitHubの使い方が使いこなせていないので、使えるようにしたい。

MIERUNE&札幌に関する印象

  • GISのナレッジ・ノウハウ・人材が社内で充実している。

  • 札幌という街にある事は魅力的。例えば、札幌は通勤がしんどくなさそう。遠くて1時間、近くて10分くらい(コンパクトな都市)という通勤時間だけでなく、首都圏に比べて公共交通機関の広告が少ない(デジタルサイネージが少ない)。

  • 社内の情報流通量が多い。社員数が少ないこともあるが、情報流通量が増えるように意図的な設計をしている。例えば、定期的にゆるいミーティングを入れていることで、雑談・コミュニケーションがしやすくしていて、それが機能している。

  • 会社のカルチャーとして、コミュニティという感覚がある。会社の成り立ちとして、技術者コミュニティから始まっていることもあるし、また穏やかな社員さんが多い。これも、おそらく人口3800万人いる東京圏ではなく、人口200万弱の札幌に所在していることが一因。

最後になりますが、MIERUNEの皆様に大変お世話になりました。インターン中はメンターの井口さんにかなりお世話になりっぱなしでしたし、またオフィスの内外でいろんな社員の皆さんとお話できて嬉しかったです。5日間、本当にありがとうございました!

酒井さんのメンターをつとめました、CTOの@kanahiro_iguchiです。GISに興味を持ち、色々調べているうちに弊社へ辿り着き、面談・インターン…と、とても行動力のある方で、こちらも見習うことがたくさんありました。弊社が大事にしている、位置情報技術とオープンソースとそれらから成るカルチャーをご理解いただく時間になっていたら幸いです。今後もQGISや位置情報技術と関わっていっていただければと思います。この度はご参加ありがとうございました!

この記事が気に入ったらサポートをしてみませんか?