Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Calculating Roof Pitch and Azimuth from a Drone Point Cloud with Python

2026年10月21日に「Dev.to」が公開したITニュース「Calculating Roof Pitch and Azimuth from a Drone Point Cloud with Python」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

ドローンで取得した屋根の3D点群データから、PythonとNumPyを使い、屋根の傾斜(ピッチ)、向き(方位角)、面積を自動計算する方法を紹介。SVDやRANSACといった技術で屋根の平面を特定し、太陽光発電や屋根工事に役立つ情報を導き出すチュートリアルだ。

ITニュース解説

ドローンを使った屋根の調査は、建物全体を立体的に捉える点群データという形で結果をもたらす。点群データとは、屋根の表面を構成する無数の点の集まりであり、これらの点を分析することで、太陽光発電システムの設置設計や屋根の修理費用の見積もりに不可欠な情報、すなわち屋根の傾斜、どの方向を向いているか、そしてその表面積を正確に把握できるようになる。この解説では、Pythonというプログラミング言語と、数値計算に特化したライブラリNumPyなどを使って、これらの情報をどのように自動で算出するのかを説明する。

具体的に計算するのは、主に三つの情報である。 一つ目は「傾斜(ピッチ角)」だ。これは屋根面が水平面に対してどれくらい傾いているかを示す角度である。屋根の各平面は、その面から垂直に伸びる「法線ベクトル」という単位ベクトルによって特徴づけられる。この法線ベクトルと、真上を向くベクトルとのなす角が傾斜角となる。 二つ目は「12インチあたりの立ち上がり (Rise per 12)」で、これは屋根業界でよく使われる傾斜の表現方法だ。水平方向に12インチ進むごとに、屋根が垂直方向に何インチ上がるかを示す。例えば、6/12という表示は、12インチ進むと6インチ上がるといった意味になる。この値は傾斜角から三角関数を使って導き出せる。 三つ目は「方位角(Azimuth)」である。これは屋根面が真北を0度として、時計回りにどの方向を向いているかを示す角度だ。例えば、真東を向けば90度、真南を向けば180度となる。これも法線ベクトルの水平成分から計算できる。 さらに、屋根の「表面積」も重要な情報だ。これは屋根の真上から見たときの面積(フットプリント)を、傾斜角を使って補正することで、実際の傾斜した屋根面の面積を求めることができる。

これらの計算を行うためには、点群データが特定の座標系で表現されている必要がある。具体的には、x軸が東方向、y軸が北方向、z軸が上方向を指し、各軸の単位がメートルやフィートといった同じ単位で統一されている「投影座標系」が望ましい。もしデータが緯度経度で表現されている場合は、計算前にこの投影座標系に変換する必要がある。

この一連の計算プロセスは、いくつかのステップに分けて進められる。 最初のステップは、「点群から一つの平面をフィッティングする」ことだ。点群データの中から、ある特定の屋根平面を構成すると考えられる点だけを抜き出したとする。これらの点に対して、最も適切にフィットする平面を数学的に見つけ出す。この時、多数の点の集まりから、それらの点が最も「まとまっている」方向、あるいは最も「ばらつきが小さい」方向を数学的に見つけ出す「特異値分解(SVD)」という手法が用いられる。屋根の平面を構成する点群の場合、SVDを使うことで、その点群が形成する平面に最も垂直な方向、すなわち法線ベクトルを効率的に特定できる。法線は平面の両側に二つ存在するが、常に上向きを指すように調整することで、方位角の誤りを防ぐ。

次に重要なのが、「RANSAC(Random Sample Consensus)」というアルゴリズムを使って「主要な平面を見つける」ステップだ。実際の屋根は、一つの平らな面だけで構成されているわけではない。複数の傾斜面、煙突や通気口といった突起物、さらには測定ノイズなどが混在している。RANSACは、このような「ノイズ」や「外れ値」が多いデータから、最も支配的な構造(この場合は屋根の平面)を頑健に見つけ出すための強力な手法である。RANSACは、まず点群からランダムに三つの点を繰り返し選び出す。この三つの点を使って仮の平面を作り、次に、残りの点群の中で、この仮の平面にどれだけの点が「近い」かを数える。この「近い」と判断する距離を「閾値」と呼ぶが、例えば5センチメートルといった具体的な距離を設定する。最も多くの「支持点」(インライア)を持つ平面が、最も確からしい支配的な屋根平面として選ばれるわけだ。この処理を何百回、何千回と繰り返すことで、信頼性の高い平面を特定する。

支配的な平面が特定できたら、その平面を構成する「インライア」と呼ばれる点群だけを使って、改めて最適な平面をフィッティングし直す。そして、この再フィッティングされた平面の法線ベクトルから、先に説明した傾斜角、12インチあたりの立ち上がり、方位角、そして表面積を計算する。表面積の計算では、屋根平面の真上から見た形状(フットプリント)をまず2次元の「凸包(Convex Hull)」という手法で囲み、その面積を求めてから、傾斜角で補正することで、実際の斜面の面積を算出する。

最後に、複数の屋根平面を持つ建物に対応するため、「一度に一つの平面を剥がしていく」処理を行う。RANSACで一つの主要な平面が見つかったら、その平面を構成する点群を全体の点群から取り除き、残った点群に対して再びRANSACを実行する。これを繰り返すことで、建物の各屋根平面を順次識別し、それぞれの特性を計算していくことができる。この際、最大でいくつの平面を探すか、また一つの平面を構成するのに最低限必要な点の数といった条件を設定することで、不要な小さな突起物などを平面として誤検出するのを防ぐ。

これらのアルゴリズムが正しく機能するかを確認するためには、まず既知の形状を持つ「合成データ」で試すことが非常に重要だ。例えば、傾斜が6/12で、一方が北向き、もう一方が南向きの切妻屋根をシミュレートし、その点群データから計算結果が意図通りになるかを検証する。この合成データでの成功を確認してから、実際のドローンで取得した測量データに適用する。

実際の測量データを扱う際には、いくつかの注意点がある。まず、先述したように、データは必ずメートルなどの「投影座標系」である必要がある。緯度経度データは正確な距離計算に適さないため、必ず変換を行うべきだ。また、ドローンが取得する点群データには、屋根だけでなく地面や木々などの「植生」も含まれることが多い。RANSACは最も支配的な平面を見つけるため、建物全体を対象にすると、まず地面を平面として検出してしまう。そのため、点群データから地面や植生を前もって除去するか、屋根の領域に厳密に切り抜くといった前処理が必須となる。さらに、L字型のような複雑な形状の屋根平面の場合、凸包による面積計算では実際よりも広い面積を報告してしまうことがあるため、より高度な手法(アルファシェイプなど)の検討が必要となる場合もある。大規模な点群データを扱う際には、NumPyだけでなく、Open3Dのような専用のライブラリに組み込まれた高速な平面セグメンテーション機能を利用することも検討すべきだ。

これらの技術は、ドローンを使った点群データから、屋根の専門家や太陽光発電の設計者が実際に必要とする具体的な数値を自動で導き出すための強力なツールとなる。ドローンの飛行計画から点群データの生成、そしてこの解説で述べた屋根のセグメンテーションと計測、最終的なレポート作成までの一連のワークフローの中で、この平面フィッティングとRANSACによる抽出技術は中心的な役割を果たす。この技術を理解することで、専門的なツールがどのように動作しているのかを深く理解し、その出力結果の妥当性をより的確に判断できるようになるだろう。

関連コンテンツ

関連IT用語

関連ITニュース