前回、JAXA環境情報提供システム(JPMAP)ののAPIをPythonから呼び出して便利に使ってみました。
今回はこちらの記事作成のために作成したコードの解説をしてみようと思います。
- JAXAが提供する無料のデータプラットフォーム
- ブラウザからのアクセス(GUI)とコマンドラインからのアクセス(API)に対応している
- 任意の時間および場所の時系列の衛星データが取得できるオンラインシステム
目次
ディレクトリ構成
前回の記事でも記載したのですが、ディレクトリは以下のような構成になっています。
.
├── LICENSE
├── README.md
├── config.ini #設定ファイル
├── downloads #出力データ格納先
│ ├── data.csv
│ └── data.png
└── main.py #プログラム本体
今回の記事で解説するのはmain.py
の中身です。
コード解説
コードはいくつかの部分に分かれています。
- 設定読み込み
- URLの生成
- API接続の実行
- データの取り出し
- データの可視化と保存
一つ一つ確認していきます。
設定の読み込み
設定ファイルの設定方法は 前回の記事で説明しているのですが、設定を保存してあるconfig.ini
を読み込むコードが以下です。
ini = configparser.ConfigParser()
ini.read('./config.ini', 'UTF-8')
# 設定のロード
API_URL_POINT = str(ini['JPMAP']['API_URL_POINT'])
API_URL_AREA = str(ini['JPMAP']['API_URL_AREA'])
API_URL_AREA_CODE = str(ini['JPMAP']['API_URL_AREA_CODE'])
API_TYPE = str(ini['SETTING']['API_TYPE'])
PRODUCT = str(ini['SETTING']['PRODUCT'])
INTERVAL = str(ini['SETTING']['INTERVAL'])
START_DATE = str(ini['SETTING']['START_DATE'])
END_DATE = str(ini['SETTING']['END_DATE'])
SAVE_FILE_NAME = str(ini['SETTING']['SAVE_FILE_NAME'])
POINT_LAT = str(ini['POINT']['POINT_LAT'])
POINT_LON = str(ini['POINT']['POINT_LON'])
AREA_NLAT = str(ini['AREA']['AREA_NLAT'])
AREA_WLON = str(ini['AREA']['AREA_WLON'])
AREA_SLAT = str(ini['AREA']['AREA_SLAT'])
AREA_ELON = str(ini['AREA']['AREA_ELON'])
AREA_CODE_1 = str(ini['AREA_CODE']['AREA_CODE_1'])
AREA_CODE_2 = str(ini['AREA_CODE']['AREA_CODE_2'])
設定ファイルの読み込みにはconfigparserライブラリを使っています。
このコードによって config.ini
ファイル内の設定値を変数に代入しています。
URLの生成
読み込んだ設定値をベースにURLを生成している部分は以下です。
if API_TYPE == "0":
API_Endpoint = API_URL_POINT \
+ "?product=" + PRODUCT \
+ "&lat=" + POINT_LAT \
+ "&lon=" + POINT_LON \
+ "&interval="+ INTERVAL \
+ "&start=" + START_DATE \
+ "&end=" + END_DATE
elif API_TYPE == "1":
API_Endpoint = API_URL_AREA \
+ "?product=" + PRODUCT \
+ "&interval="+ INTERVAL \
+ "&nlat=" + AREA_NLAT \
+ "&wlon=" + AREA_WLON \
+ "&slat=" + AREA_SLAT \
+ "&elon=" + AREA_ELON \
+ "&start=" + START_DATE \
+ "&end=" + END_DATE
elif API_TYPE == "2":
API_Endpoint = API_URL_AREA_CODE \
+ "?product=" + PRODUCT \
+ "®ioncode=" + AREA_CODE_1 + "_" + AREA_CODE_2 \
+ "&interval="+ INTERVAL \
+ "&start=" + START_DATE \
+ "&end=" + END_DATE
設定ファイルにあるように検索タイプ(点、矩形、行政界)で呼び出してくるAPIのリクエストURLが違うので、検索タイプごとに分岐させています。
分岐した後はAPIのリクエストURLにプロダクト種類の指定や地理空間的な検索位置を文字列で繋げているだけです。
API接続の実行
生成したURLを使ってAPI接続している部分は以下のコードです。
response = requests.get(API_Endpoint).json()
URLをJAXA側に投げて、その結果をJSON形式でresponse
に代入しています。
データの取り出し
JSON形式で取得したデータから、必要なデータだけ抽出しているのが以下です。
response_df = pd.DataFrame(response['data'])
response_df['date'] = pd.to_datetime(response_df['date'], format='%Y-%m-%d')
response_df['value'] = response_df['value'].astype(np.float64)
response_df = response_df.set_index('date')
response_df = response_df[(np.abs(stats.zscore(response_df)) < 3).all(axis=1)]
このコードがまさにAPI活用の肝なので、少し詳しく解説します。
response_df = pd.DataFrame(response['data'])
この部分は取得したデータをPandasのDataFrame形式で処理しています。データの型変換とDataFrame自体を行っています。
response_df['value'] = response_df['value'].astype(np.float64)
response_df = response_df.set_index('date')
次に格納したデータの型変換とDataFrame自体を行っています。
DataFrameの”value”というサービスが行っています。
データの可視化と保存
最後に取得したデータの保存を行っている部分です。APIから取得したデータはCSV形式で出力されるようにしています。
save_file_name = SAVE_FILE_NAME
response_df.to_csv("./downloads/" + save_file_name + ".csv")
次は取得したデータを可視化している部分です。この辺りはMatplotlibを使っています。最後にplt. savefig
コマンドでPNG形式で可視化結果を描画しています。
response_df.plot()
plt.title(save_file_name)
plt.savefig("./downloads/" + save_file_name + ".png", bbox_inches='tight')
plt.close('all')
実行結果
実行は以下のコマンドから行えます。
conda activate api
python main.py
このとき、リポジトリの最上位のサイトに行う必要があります。
感想
設定ファイルだけを触れば自由に使うことが出来るプログラムを作成してみました。APIでとってこれるのは便利ですね。
グラフの種類なんかもいくつか実装できれば良いなぁと思いつつ、本日はこのあたりでやめておきます。