メモ:先月作成したコードたち
OpenGLとMediapipeを用いたリアルタイム3Dモデル操作
このプロジェクトでは、OpenCVでウェブカメラの映像を取得し、Mediapipeを用いてリアルタイムで人体の骨格を検出します。さらに、OpenGLを使用してシンプルな3Dモデルを描画し、骨格情報に基づいてモデルを操作する基盤を提供しています。ここでは、コードの各部分に触れながら、その仕組みを説明します。
1. 必要なライブラリのインポート
まず、使用するライブラリをインポートします。このプロジェクトでは、次のライブラリが必要です。
OpenCV(cv2): カメラから映像を取得するために使用。
Mediapipe: 骨格検出(姿勢検出)を行うために使用。
OpenGL: 3Dモデルの描画と操作を担当。
sys: システム引数を処理する標準Pythonライブラリ。
import cv2
import mediapipe as mp
import sys
from OpenGL.GL import *
from OpenGL.GLUT import *
2. Mediapipeのセットアップ
次に、Mediapipeを使用してポーズ検出をセットアップします。このプロジェクトでは、人体の姿勢を検出するためにMediapipeのPoseモジュールを使用しています。
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
3. OpenGLでの描画関数
OpenGLの`draw`関数は、画面上に2Dの三角形を描画します。この描画は非常にシンプルですが、今後、Mediapipeの骨格データに基づいて3Dモデルを操作するための基盤になります。
def draw():
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_TRIANGLES)
glVertex2f(-0.5, -0.5)
glVertex2f(0.5, -0.5)
glVertex2f(0.0, 0.5)
glEnd()
glutSwapBuffers()
4. メイン関数
この部分がプロジェクトの中心となるメインのループです。次の手順で処理が行われます。
ウェブカメラの初期化: OpenCVを使ってウェブカメラから映像を取得します。
OpenGLのセットアップ: `glut`関数を用いてOpenGLのウィンドウを作成し、描画機能を設定します。
骨格検出: カメラ映像からフレームを取得し、Mediapipeを使って人体の骨格を検出します。骨格情報が存在する場合、そのデータを基に3Dモデルを操作することが可能です(現在はまだ未実装の部分です)。
描画の更新: OpenGLの描画とイベント処理を行います。
def main():
cap = cv2.VideoCapture(0) # カメラを開く
# OpenGLの初期化
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutCreateWindow('3D Model')
glutDisplayFunc(draw)
while True:
ret, frame = cap.read() # カメラからフレームを読み込む
if not ret:
continue
# Mediapipeによる骨格検出
results = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
if results.pose_landmarks:
# 骨格データに基づいて3Dモデルを操作する処理をここに追加予定
pass
# OpenGLの描画とイベント処理
glutMainLoopEvent()
glutPostRedisplay()
cap.release() # 終了時にカメラを解放
5. スクリプトの実行部分
最後に、スクリプトが直接実行された場合に`main()`関数が呼び出されるようにします。このブロックは、Jupyter NotebookやPythonスクリプトとして実行されるときに動作します。
if __name__ == "__main__":
main()
現在の課題
ModuleNotFoundError: コードを実行する際に、`mediapipe`モジュールがインストールされていないためエラーが発生しました。`mediapipe`をインストールする必要があります。
拡張の可能性: 骨格データを使用して3Dモデルを操作する部分は、まだ未実装ですが、`if results.pose_landmarks:` の下にそのロジックを追加することで、モデル操作が可能になります。
結論
このプロジェクトは、OpenCV、Mediapipe、およびOpenGLを組み合わせて、リアルタイムでカメラ映像を処理し、人体の動きに応じた3Dモデル操作を実現するための基礎を構築しています。シンプルな三角形描画から始まり、今後、骨格検出を用いてインタラクティブな3Dグラフィックスを実現する可能性があります。
Pythonで地理空間データを解析・可視化する
概要
この記事では、Pythonを使用して地理空間データ(特にShapefile形式のデータ)を扱い、その可視化方法について説明します。GeoPandasとMatplotlibを用いることで、地理空間データを効率的に操作し、視覚化する方法を学びます。
使用するライブラリ
GeoPandas: 地理空間データを扱うためのPythonライブラリ。Pandasを拡張して、地理的なデータの読み込みや操作を可能にします。
Matplotlib: グラフや地図など、データの可視化を行うためのライブラリ。
ステップ1: Shapefileデータの読み込み
最初のステップは、`.shp`ファイルをGeoPandasを使って読み込むことです。このShapefileには、地理的な特徴(多角形や点など)が含まれています。以下のコードでは、Shapefileを読み込み、データの一部を確認します。
import geopandas as gpd
# .shp ファイルを読み込む
gdf = gpd.read_file("path_to_shapefile", encoding="shift-jis")
# データの先頭5行を表示する
print(gdf.head())
ここでは、`gpd.read_file()`を使ってShapefileを読み込んでいます。`gdf`はGeoDataFrame(Pandasの拡張版)であり、地理的なデータを効率的に管理・操作することができます。エンコーディングは`shift-jis`で指定されていますが、これは日本語データを正しく扱うために必要です。
ステップ2: 地理空間データの可視化
次に、読み込んだデータを可視化します。GeoPandasは、Matplotlibとの統合がスムーズで、簡単に地理空間データを地図上にプロットすることができます。以下のコードを使用して、Shapefileに含まれる地理的なポリゴンを可視化します。
import matplotlib.pyplot as plt
# データをプロットする
gdf.plot()
plt.show()
このコードでは、`gdf.plot()`を使ってデータを地図上に描画しています。結果として、多角形で表現された地域が地図上に表示されます。これにより、Shapefileに含まれる地理的特徴(例:海岸線、標高など)を視覚的に確認することができます。
ステップ3: データの操作
GeoPandasを使用すると、地理空間データをPandas DataFrameと同様に操作することができます。例えば、不要な列を削除したり、特定の条件に基づいてデータをフィルタリングすることが可能です。以下のコードは、不要な列を削除する例です。
# 不要な列 A31_201 を削除する
gdf = gdf.drop(columns=['A31_201'])
この操作により、`A31_201`という列を削除しています。データを簡潔にし、解析をより効率的に行えるようにします。
ステップ4: Shapefileデータの詳細可視化
さらに、`.shp`ファイルに含まれるデータの細かい部分に注目し、特定のエリアを拡大してプロットすることも可能です。GeoPandasのフィルタ機能を活用し、例えば標高や水域に基づいてデータを絞り込むことができます。
# 5m以上10m未満の地域を抽出し、プロット
gdf_filtered = gdf[gdf['A49_003'] == '5m以上10m未満']
gdf_filtered.plot()
plt.show()
このコードでは、`A49_003`という列の値が「5m以上10m未満」である行を抽出し、それらの地域だけをプロットしています。これにより、特定の標高範囲の地理的な領域を視覚化することができます。
ステップ5: 地図のスタイル設定
最後に、可視化の際に使用する地図のスタイルや色をカスタマイズすることもできます。これにより、より見やすく、情報を強調した表示が可能です。
# プロットのスタイルを設定
gdf.plot(edgecolor='black', cmap='OrRd')
plt.show()
ここでは、`edgecolor='black'`を指定して、ポリゴンの境界線を黒くし、カラーマップ(`cmap`)として`OrRd`(オレンジから赤へのグラデーション)を使用しています。これにより、地図上の地域の違いをよりはっきりと表現できます。
結論
この記事では、Pythonを使った地理空間データの操作と可視化の基本的な技術を紹介しました。GeoPandasを使用することで、Shapefileデータを簡単に読み込み、視覚化し、必要に応じて操作することができます。Matplotlibとのスムーズな統合により、強力なデータ解析と視覚化が可能です。
Shapefileのような地理空間データは、海岸線や標高、地域境界など、さまざまな地理的情報を含んでおり、それらを正しく解析することで、より深い洞察が得られるでしょう。
以下では、アップロードされたノートブックの全てのコードを解説しながら、日本語でブログ形式にまとめていきます。
タイトル: 日本におけるメッシュ単位の災害リスク分析に向けた空間データの前処理
1. はじめに
空間データの前処理は、災害リスク分析や対策計画の基盤となります。特に日本では、洪水や土砂災害など、地域ごとに異なるリスクに対処するため、空間データの正確な処理が求められます。このブログでは、Jupyterノートブック内で行われた、地理空間データの前処理について解説します。各ステップで、異なる地図情報の重ね合わせや計算処理を行い、最終的に都道府県ごとのエリア面積を計算する方法を紹介します。
2. ライブラリのインポート
まず、地理情報を扱うために必要なライブラリをインポートします。
import geopandas as gpd
import matplotlib.pyplot as plt
geopandas は、地理空間データの操作に特化したPythonのライブラリです。シェープファイルの読み込みや、空間演算が可能です。
matplotlib.pyplot は、データの視覚化に使用され、地図を描画するために利用されます。
3. シェープファイルの読み込み
次に、GIS(地理情報システム)用のシェープファイルを読み込みます。このシェープファイルには、土地利用や洪水の浸水想定区域などが含まれています。
_01 = gpd.read_file("土地利用/5740", encoding="shift-jis")
_01 = _01[_01["土地利用種"] == "0700"]
gpd.read_file を使って、土地利用に関するシェープファイルを読み込みます。
データには複数の土地利用種別が含まれますが、ここでは特定の土地利用種(0700)のデータだけを抽出しています。これは、おそらく「宅地」や「住宅地域」など、災害リスクに直結する土地利用カテゴリーです。
4. 洪水浸水想定区域のデータの読み込み
続いて、洪水の最大浸水区域データを読み込みます。
_02 = gpd.read_file("洪水浸水想定区域用/5740/20_想定最大規模", encoding="shift-jis")
洪水浸水想定区域 シェープファイルは、洪水時の浸水想定区域を示します。これにより、浸水が予測される区域を土地利用データと重ねて、どの地域が最も影響を受けやすいかを分析します。
5. 空間的な差分を計算する
次に、これらのデータセットを組み合わせ、土地利用区域から洪水浸水区域を差し引くことで、影響を受ける可能性のある地域を把握します。
_ = harmonize_crs_and_overlay(_01, _02, operation='difference')
ここでは、harmonize_crs_and_overlay 関数を使い、土地利用と洪水区域の座標参照系 (CRS) を整え、空間的な差分演算を行います。この演算により、洪水リスクのある区域が取り除かれた土地利用エリアが得られます。
6. さらに他の災害リスクのデータを処理する
土砂災害リスクも考慮して、同様の操作を繰り返します。
_ = harmonize_crs_and_overlay(_, _03, operation='difference')
土砂災害区域のデータを読み込み、同じく土地利用データに差し引いて災害の影響を受けやすい区域を除外します。
7. 高潮や津波データの統合
次に、高潮や津波のデータも処理します。これにより、さらに詳細な災害リスク分析が可能になります。
_ = harmonize_crs_and_overlay(_, _04, operation='difference')
_ = harmonize_crs_and_overlay(_, _05, operation='difference')
これらの操作により、土地利用データから、洪水、土砂災害、高潮、津波の影響を受ける可能性のある区域がすべて除外され、災害リスクが低い地域が得られます。
8. 市区町村レベルでの属性情報の追加
次に、結果として得られた空間データに、市区町村ごとの属性情報を重ねます。
result_gdf = gpd.overlay(_, muni_gdf, how='intersection')
市区町村のデータ (muni_gdf) を用いて、結果データフレームと交差演算を行い、各地域の属性情報(市区町村名など)を付与します。
9. 面積の計算
得られたデータを使い、各地域の面積を計算します。
result_gdf_projected = result_gdf.to_crs(epsg=3099)
result_gdf_projected['area'] = result_gdf_projected.geometry.area
EPSG:3099 への座標変換を行い、面積計算を実施します。この座標系は日本に適しており、面積計算が正確に行えるためです。
geometry.area を用いて、各地域の面積を平方メートル単位で計算します。
10. 都道府県ごとの面積集計
都道府県単位で面積を集計し、最終的な結果を得ます。
area_sum_df = result_gdf_projected.groupby('KEN')['area'].sum().reset_index()
area_sum_df['area_km2'] = area_sum_df['area'] / 10**6
groupby 関数を使って、都道府県 (KEN) ごとに面積を集計します。
計算結果は平方メートルで得られるため、平方キロメートルに変換しています。
11. 結果の保存
最後に、計算結果をJSONファイルに保存します。
area_sum_df.to_json("area_sum.json", orient="records")
結果を保存することで、他のアプリケーションや分析に使用できるようにします。
まとめ
このノートブックでは、日本における災害リスク分析のために、土地利用データと災害リスクデータを統合し、都道府県ごとの安全なエリアを計算しました。複数のシェープファイルを重ね合わせ、影響を受ける可能性のある区域を除外することで、災害対策の基盤となるデータを作成しています。このプロセスは、地域ごとの災害対策やハザードマップ作成において非常に有用です。
この一連の処理を通じて、GISデータの正確な処理と、それを利用したリスクの可視化が、どれほど重要であるかが理解できます。