LP(航空レーザ)のグリッドデータから、砂防フロンティアの区域設定アプリで変換できるTINテキストを作るプログラム
砂防フロンティアの区域設定支援システムに地形データを入れるため、航空レーザ測量の成果を調べた。手元にはLASのほかに、org.txt、grd.txt、0.5g.txt、lemなど、似た名前のファイルが並んでいる。今回はその違いを確認し、0.5m格子のTXTから三角形のTIN用テキストを作るPythonツールを用意した。
元データには何が入っていたか
大まかな流れは、レーザで取得した点群から地物などを取り除いて地表面の点を作り、その点をもとに一定間隔の格子標高を作る、というもの。DEMは地面の高さを数値で表したデータの呼び名で、ここでは0.5m格子のTXTやLEMがそれに当たる。ファイルごとの違いを、データの並びも含めて整理した。
| ファイル例 | どんなデータか | 記録の並び・形式 | 主な使い道 |
|---|---|---|---|
09ME6444.las | 航空レーザの点群。地面のほか、樹木や建物などに当たった点も含み得る。 | LASというバイナリ形式。点ごとの座標X・Y・Z、反射強度、リターン番号などを記録する。テキストの1行ずつではない。 | 点群の保管・交換、分類、地表面点の抽出。 |
09me6444_org.txt | オリジナルのレーザ計測点。地表以外も含む不規則な点の集まり。 | 1点1行のカンマ区切り:id,x,y,z,p。末尾のpはパルス識別番号。 | フィルタリングして地表面点を作る元データ。樹木や建物の高さの解析にも使う。 |
09me6444_grd.txt | グラウンドデータ。地表面として抽出された不規則な点群。grdは格子の意味ではない。 | 1点1行のカンマ区切り:id,x,y,z。各点の位置と標高を記録。 | 地面の点を直接調べる、格子標高やTINを作る材料にする。 |
09me6444_0.5g.txt | 0.5m間隔に整えた格子標高(DEM)。 | 1格子点1行:id,x,y,z,A。例:1,19000.25,-80250.25,162.00,0。Aは地表面点の有無などを示す属性値。 | 地形表示・断面・傾斜の計算。今回のTIN作成元。 |
09me6444_0.5g.csv | LEMに対応する格子データのヘッダー。 | 格子の行列数、間隔、位置、測量年、座標系番号などの項目と値を記録。標高を1点ずつ並べたTXTとは役割が違う。 | LEMの標高が地図上のどの位置にあるかを読み取る。 |
09me6444_0.5g.lem | 同じ格子標高(DEM)の標高値本体。 | 行番号の後に西から東へ2,000個の標高を並べ、北から南へ1,500行。標高は0.1m単位の整数で、1620は162.0m。 | DEMの保存・受け渡し。ヘッダーと組にしてGIS等へ読み込み、地形表示や等高線作成に使う。 |
TinME8523.txt | 区域設定側で使う三角形TINの形式見本。 | 1行が1つの三角形:X1 Y1 Z1 X2 Y2 Z2 X3 Y3 Z3。 | SFFのTin変換に渡す形式の見本。今回のPythonは0.5g.txtからこの並びのTXTを作る。 |
つまり、orgとgrdは不規則な点群、0.5g.txtとLEM+CSVは規則的な格子標高(DEM)、最後のTin...txtは三角形の集まりだ。LEM自体に各点のXY座標は書かれていないため、対応するヘッダーを使って格子の位置を決める。TINとはデータの並びが異なる。表中のx,yはファイルの列名を表すので、GISでの東西・南北の軸との対応は座標範囲で確認する。
なぜ0.5g.txtを選んだか
以前、航空写真から地形を図化するときは、技術者が地形の折れ目を読んでブレークラインを入れると聞いたことがある。調べてみると、その理解には根拠があった。国土地理院は空中写真を立体的に見ながら位置や高さを取得する図化を説明しており、公共測量の資料にも、写真測量による数値地形モデル作成でブレークライン等を計測する工程が記載されている。ただし、写真測量なら必ず全て手で入れる、という意味ではない。
一方、航空レーザでは、計測した点群からブレークラインが自動的に出来上がるわけではない。必要なら写真や点群などを使って別途作り、レーザ点群と組み合わせる方法もある。今回は受け取ったファイル一覧に独立したブレークライン成果を確認できなかったため、ブレークライン入りの元TINをそのまま再現する処理はしていない。grd.txtの不規則点からTINを作る方法もあるが、点の間をどう結ぶか、欠測部や長い三角形をどう扱うかを別途検討する必要がある。
そこで今回は、規則的に並んだ0.5g.txtを選んだ。格子の四角形を2つの三角形に分ければ、変換の仕方が一定になる。変換元として扱いやすく、今回の作業には妥当と判断した。ただし、「元の地形を最も忠実に再現する」と比較検証したわけではない。崖や谷筋など重要な場所は、変換後の標高や断面を元データ・地図と照合する必要がある。
Pythonツールで行うこと
【画像挿入:グリッドデータからTINTXT.png】
ファイルを1件ずつ、複数件まとめて、またはフォルダごと選べる。ファイル名は0.5gに限定せず、中身が0.5m格子形式のTXTなら対象になる。一般の文章ファイルやgrd.txtを変換できるという意味ではない。格子の四角形を三角形に分け、3頂点の座標・標高を1行に記録したTin...txtを作る。これはSFF本体のTIN変換前に使う前処理で、Pythonツール自体はgb32を作らない。
ポリゴンの範囲だけに絞る
【画像挿入:ポリゴンのはんいから作成.png】
0.5m格子は細かく、元の1図郭を丸ごと三角形にするとファイルがかなり大きくなる。実際、データが重すぎて砂防フロンティアのソフトで変換できないことがあった。そこで、区域設定に使う場所だけを残すため、作業範囲のSHPポリゴンで三角形を切り取る機能を付けた。赤線の外側は出力せず、境界をまたぐ三角形は境界で切り取る。SFFへ渡すTINの量を減らし、変換できなかった問題を避ける狙いだ。
ただし、「必ずエラーがなくなる」と確認したものではない。ポリゴンと格子の座標系・系番号・単位を合わせる必要があり、SFFへの本番投入後もログと地形表示を確認する。今回のポリゴンと9図郭の範囲照合では8図郭が重なり、1図郭は範囲外だった。境界付近の実データを使った切り取りも確認したが、全図郭をSFFへ通した結果までを保証するものではない。
ツールのダウンロード
配布ファイルはGoogleドライブで公開範囲を制限している。ZIPにはgrid_to_tin.py、起動用start.bat、ポリゴン機能の準備用setup_polygon.bat、説明書が入っている。
- ZIPを展開し、WindowsでPythonを使える状態にする。
- ポリゴンで切り取る場合は
setup_polygon.batで追加ライブラリを準備する。 start.batを開き、0.5m格子形式のTXTまたはそのフォルダを選ぶ。- 必要ならSHPポリゴンの範囲指定にチェックを入れ、SHPを選ぶ。
- 変換後のTXTだけを入れる専用フォルダを保存先に選び、SFFの「Tin変換」に読み込ませる。
ポリゴン指定には同じ平面直角座標系のSHPを使う。SFF側でフォルダを選ぶと、その中のTXTが変換対象になるので、元の格子TXTや説明書は出力先に混ぜない。業務データへの適用は、点・線・面の位置と標高を照合し、変換ログも確認してから進める。
コメント
コメントを投稿