はじめに
これまで私は、気象データやnetCDFデータを使った解析やGIS処理を中心に業務をしてきました。
ただ、解析した結果を「他の人が使える形で提供する」という経験がほとんどありませんでした。
そこで今回、
netCDFデータから特定の地点・日時・成分を取得できるAPIを作ることにしました。
あわせて、
- FastAPIによるAPI開発
- Git/GitHubによるコード管理
も実践的に身につけることを目的としています。
作るもの(全体像)
今回作るAPIのイメージです。
クライアント(ブラウザ / アプリ)
↓
FastAPI(Python)
↓
netCDFデータ
↓
GeoJSON形式で返す
- 指定された地点(緯度・経度)
- 指定された日時(または期間)
- 指定された気象・大気成分
を元にデータを取り出し、GeoJSON形式で返すAPIを目指します。
GeoJSONを採用する理由
GISツール(QGISなど)やWeb地図との相性が良いためです。
また、RFC 7946に準拠した形式として扱えるようにします。
※ 座標は [lon, lat] の順です
技術選定
FastAPIを選んだ理由
- Pythonで扱いやすい
- 型ヒント+Pydanticによるバリデーション
- Swagger UIが自動生成される
Flaskも少し考えましたが、
今回は「まず動かす」ことを優先してFastAPIにしています。
環境構築
前提
- Python 3.11以上(3.12推奨)
ディレクトリ構成(先に全体像)
satellite-nc-api/
├── app/
│ └── main.py
├── docs/
├── requirements.txt
└── README.md
役割
- app/:API本体
- docs/:作業メモ・設計
- requirements.txt:ライブラリ一覧
- README.md:概要
プロジェクト作成
mkdir satellite-nc-api
cd satellite-nc-api
仮想環境の作成
python -m venv .venv
仮想環境の有効化
# Mac / Linux
source .venv/bin/activate
# Windows(PowerShell)
.venv\Scripts\Activate.ps1
# Windows(cmd)
.venv\Scripts\activate.bat
最初は「毎回有効化するの面倒だな」と思っていたのですが、
環境の違いでハマるよりは圧倒的に楽でした。
ライブラリのインストール
pip install fastapi uvicorn[standard]
requirements.txt作成
pip freeze > requirements.txt
requirements.txtは、このプロジェクトで使っているライブラリの一覧を記録するためのファイルです。
venv環境でインストールしたものをまとめておくことで、後から同じ環境を再現できるようにしています。
最初はこのファイルの意味がよく分からなかったのですが、
「環境のスナップショット」と考えると理解しやすかったです。
FastAPIで最初のAPIを作る
app/main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
サーバ起動
uvicorn app.main:app --reload
※ satellite-nc-api ディレクトリで実行します
動作確認
ブラウザで以下にアクセス
http://127.0.0.1:8000/
↓
{"message": "Hello World"}
Swagger(自動ドキュメント)
http://127.0.0.1:8000/docs
にアクセスすると、APIの一覧が表示されます。
「Try it out」からブラウザ上でAPIを実行できます。
ブラウザから直接叩けるので、
curlを書かなくていいのはかなり楽でした。
今後やること
- netCDFの読み込み(xarray)
- 地点・日時・成分指定
- GeoJSONレスポンス
- Pydanticによるバリデーション
- ルーター分割(APIRouter)
- DB連携(PostgreSQL / PostGIS)
まとめ
- FastAPIでAPIの雛形を作成
- 仮想環境+requirements.txtで環境を管理
- Swaggerで動作確認
ここからようやく「データを扱うAPI」に入っていきます。