点群 LAS ファイルの仕様の詳細解説

LiDAR (Light Detection and Ranging) は、レーザー光を用いて地表や物体の形状を計測するリモートセンシング技術です。取得されたデータは、点群データとして保存され、様々な用途で使用されています。LiDAR 点群データの標準的なファイルフォーマットとして広く利用されているのが LAS (LASer) ファイルです。他に点群データとして LAZ (LASzip) ファイルもありますが、これは LAS ファイルを**可逆圧縮**したものになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/dbc8954c-e84b-cde6-c291-34d42b720a21.png" width="100%" />

この解説記事では、LAS ファイルの仕様について詳細に解説していきます。

# 1. LAS ファイルの概要

LAS ファイルは、バイナリ形式で保存される点群データファイルです。ファイルフォーマットは、米国測地測量局 (NGS: National Geodetic Survey) によって策定されています。LAS ファイルには、点群データの座標情報、強度情報、分類情報など、様々な属性情報が格納されています。

LAS ファイルには、複数のバージョンがあります。現時点（2024年2月）で最新バージョンは 1.4 ですが、広く利用されているのは 1.2 と 1.3 です。バージョンによって、ファイルヘッダの内容や属性情報のフォーマットなどが異なります。

:::note info
QGIS や ArcGIS 等の GIS ツールで LAS ファイルのバージョンを確認することができます。
QGIS の場合、レイヤプロパティから確認することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/0dd2f4b9-e0f5-8fe2-92ad-dc78b59f1e66.png" width="500px" />
:::

:::note info
Python の laspy パッケージを使用して、LAS ファイルのバージョンを確認することもできます。
```python
import laspy
las = laspy.read('<LAS ファイル名>')
las.header.version
### 出力:
### Version(major=1, minor=3)
```
:::

# 2. LAS ファイルの構造

LAS ファイルは、バージョン 1.4 の場合、以下の４つの要素により構成されています。
（バージョン 1.3 以前の場合は、1～3 の３つの要素で構成されています。）

1. **ファイルヘッダ (Header)**: ファイルの基本情報、バージョン、ポイントデータの構造と数、地理的位置を含むファイルの冒頭部分
2. **可変長レコード(VLR: Variable Length Records)**: 追加メタデータやカスタム情報を含む、柔軟な長さを持つレコード
3. **ポイントデータ・レコード(PDR: Point Data Records)**: 実際の地点情報、座標、反射強度、分類などを含むポイントデータのセクション
4. **拡張可変長レコード (EVLR: Extended Variable Length Records)**: VLR よりも多くのデータを格納できる、ファイルの末尾に配置される拡張レコード

## 2.1. ファイルヘッダ (Header)

ファイルヘッダは、ファイルの冒頭に位置しており、ファイルに関する基本情報を提供します。これには、ファイルの識別子、ファイルの作成日、所有者、プロジェクト ID、LAS のバージョン、ポイントデータのフォーマット、ポイントデータの数、ポイントデータの地理的な位置、スケールファクタ、使用される座標系などが含まれています。

<ins>LAS 1.0～1.2</ins>

| 項目 | データ型 | サイズ [byte] |
|:--|:--|:--|
| File Signature | char[4] | 4 |
| File Source Id | unsigned short[1] | 2 |
| (Reserved または Global Encoding) | unsigned short[1] | 2 |
| Gps Time Type | (Global Encoding の一部) ||
| Project Id (4 combined fields) | ulong+ushort+ushort+char[8] | 16 |
| Verion Major | unsigned char[1] | 1 |
| Version Minor | unsigned char[1] | 1 |
| Version Major + Minor | unsigned char[1] | 1 |
| System Identifier | char[32] | 32 |
| Generating Software | char[32] | 32 |
| File Creation Day of Year | unsigned short[1] | 2 |
| File Creation Year | unsigned short[1] | 2 |
| Creation Day + Year | unsigned short[1] | 2 |
| Header Size | unsigned short[1] | 2 |
| Offset to Point Data | unsigned long[1] | 4 |
| Number of Variable Length Recs | unsigned long[1] | 4 |
| Point Data Format Id | unsigned char[1] | 1 |
| Data Record Length | unsigned short[1] | 2 |
| Number of point records | unsigned long[1] | 4 |
| Number of Points by Return Ct. | unsigned long[5 or 7] | 20 or 28 |
| Scale Factor (X, Y, Z) | double[3] | 24 |
| Offset (X, Y, Z) | double[3] | 24 |
| Max (X, Y, Z) | double[3] | 24 |
| Min (X, Y, Z) | double[3] | 24 |

<ins>LAS 1.3 (追加項目)</ins>

| 追加項目 | データ型 | サイズ [byte] |
|:--|:--|:--|
| Start of waveform data record | unsigned long long[1] | 8 |

<ins>LAS 1.4 (追加項目)</ins>

| 追加項目 | データ型 | サイズ [byte] |
|:--|:--|:--|
| Start of first EVLR | unsigned long long[1] | 8 |
| Number of EVLRs | unsigned long[1] | 4 |
| Number of point records | unsigned long long[1] | 8 |
| Number of points by return ct. | unsigned long long[15] | 120 |

## 2.2. 可変長レコード (VLR)

変数長レコード (VLR) は、カスタム情報、拡張データ、またはファイル内のポイントデータなど、追加のメタデータを格納するために使用されます。VLR は柔軟性が高く、ユーザ定義のデータを含めることができるため、LAS ファイルの拡張性の大幅な向上につながっています。

VLR は 2 つの部分に分かれています。

- ヘッダ
- ペイロード

:::note info
VLR のペイロードのサイズ上限は 65,535 バイト ($2^{16} - 1$ バイト) となっています。
:::

## 2.3. ポイントデータ・レコード (PDR)

ポイントデータ・レコード（PDR）には、ファイル内の実際のポイントデータが含まれています。

PDR には、「LAS 仕様で指定されている 10 種類の PDR フォーマット (PDRF)」（**表2-1** 参照）の点群データが保持されています。

**表2-1. PDRF**

| PDRF | 主な特徴 | 対応 LAS バージョン |
|:--|:--|:--|
| 0 | PDRF の 0～5 で共有される 20 バイトのコア | 1.2 以降 |
| 1 | GPS 時刻情報を追加 | 1.2 以降 |
| 2 | RGB 値（カラー化されたポイント）を格納するための３つのカラーチャンネルを追加 | 1.2 以降 |
| 3 | GPS 時刻と RGB チャンネルを追加 | 1.2 以降 |
| 4 | GPS 時刻とウェーブパケット（波形データ用）を追加 | 1.3 以降 |
| 5 | GPS 時刻、RGB チャンネル、波形パケットを追加 | 1.3 以降 |
| 6 | 必須 GPS 時刻を含む、PDRF 6～10 で共有される 30 バイトのコア | 1.4 以降 |
| 7 | RGB 値（カラー化されたポイント）を格納するための３つのカラー・チャンネルを追加 | 1.4 以降 |
| 8 | RGB チャンネルと４番目の NIR チャンネルを追加 | 1.4 以降 |
| 9 | 波形パケットを追加 | 1.4 以降 |
| 10 | 波形パケットと RGB チャンネルを追加 | 1.4 以降 |

### 2.3.1. PDRF 0

| 項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| X | signed | 32 |
| Y | signed | 32 |
| Z | signed | 32 |
| intensity | unsigned | 16 |
| return_number | unsigned | 3 |
| number_of_returns | unsigned | 3 |
| scan_direction_flag | bool | 1 |
| edge_of_flight_line | bool | 1 |
| classification | unsigned | 5 |
| synthetic | bool | 1 |
| key_point | bool | 1 |
| withheld | bool | 1 |
| scan_angle_rank | signed | 8 |
| user_data | unsigned | 8 |
| point_source_id | unsigned | 8 |

PDRF 1～5 は PDRF 0 と同じ項目にいくつかの追加項目を加えたものとなっています。

### 2.3.2. PDRF 1

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| gps_time | Floating | 64 |

### 2.3.3. PDRF 2

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| red | unsigned | 16 |
| green | unsigned | 16 |
| blue | unsigned | 16 |

### 2.3.4. PDRF 3

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| gps_time | Floating | 64 |
| red | unsigned | 16 |
| green | unsigned | 16 |
| blue | unsigned | 16 |

### 2.3.5. PDRF 4

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| gps_time | Floating | 64 |
| wavepacket_index | unsigned | 8 |
| wavepacket_offset | unsigned | 64 |
| wavepacket_size | unsigned | 32 |
| return_point_wave_location | floating | 32 |
| x_t | floating | 32 |
| y_t | floating | 32 |
| z_t | floating | 32 |

### 2.3.6. PDRF 5

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| gps_time | Floating | 64 |
| red | unsigned | 16 |
| green | unsigned | 16 |
| blue | unsigned | 16 |
| wavepacket_index | unsigned | 8 |
| wavepacket_offset | unsigned | 64 |
| wavepacket_size | unsigned | 32 |
| return_point_wave_location | unsigned | 32 |
| x_t | floating | 32 |
| y_t | floating | 32 |
| z_t | floating | 32 |

### 2.3.7. PDRF 6

PDRF 6 は、LAS 1.4 で導入された PDRF 6～10 のベースとなる PDRF です。

| 項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| X | signed | 32 |
| Y | signed | 32 |
| Z | signed | 32 |
| intensity | unsigned | 16 |
| return_number | unsigned | 4 |
| number_of_returns | unsigned | 4 |
| synthetic | bool | 1 |
| key_point | bool | 1 |
| withheld | bool | 1 |
| overlap | bool | 1 |
| scanner_channel | unsigned | 2 |
| scan_direction_flag | bool | 1 |
| edge_of_flight_line | bool | 1 |
| classification | unsigned | 8 |
| user_data | unsigned | 8 |
| scan_angle | signed | 16 |
| point_source_id | unsigned | 8 |
| gps_time | Floating | 64 |

PDRF 0 と PDRF 6 からの主な変更点として、`gps_time` が項目されたことや、いくつかの項目でサイズが拡張されたこと等があります。

<ins>項目削除</ins>

| 項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| scan_angle_rank | signed | 8 |

<ins>項目追加</ins>

| 項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| overlap | bool | 1 |
| scanner_channel | unsigned | 2 |
| scan_angle | signed | 16 |
| gps_time | Floating | 64 |

PDRF 0 で提供されていた `scan_angle_rank` が、PDRF 6 では `scan_angle` となっています。
PDRF 0 の `scan_angle_rank` は、-90° から +90° までの整数でスキャン角度を表すのに対し、PDRF 6 の `scan_angle` は -30,000 から +30,000 までの整数（スケールファクタは 0.006°）と、より高い精度でスキャン角度を表すことができるようになっています。（詳細は [3.4. スキャン角度](#34-スキャン角度)を参照。）

<ins>サイズ拡張</ins>

| 項目 | データ型 | サイズ [bit] (PDRF 0) | サイズ [bit] (PDRF 6) |
|:--|:--|:--|:--|
| return_number | unsigned | 3 | 4 |
| number_of_returns | unsigned | 3 | 4 |
| classification | unsigned | 5 | 8 |

### 2.3.8. PDRF 7

PDRF 6 に RGB 項目が追加されています。

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| red | unsigned | 16 |
| green | unsigned | 16 |
| blue | unsigned | 16 |

### 2.3.9. PDRF 8

PDRF 6 に RGB および NIR (近赤外線) が追加されています。

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| red | unsigned | 16 |
| green | unsigned | 16 |
| blue | unsigned | 16 |
| nir | unsigned | 16 |

### 2.3.10. PDRF 9

ポイントとして波形データが追加されています。

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| wavepacket_index | unsigned | 8 |
| wavepacket_offset | unsigned | 64 |
| wavepacket_size | unsigned | 32 |
| return_point_wave_location | unsigned | 32 |
| x_t | floating | 32 |
| y_t | floating | 32 |
| z_t | floating | 32 |

### 2.3.11. PDRF 10

PDRF6 に RGB、NIR (近赤外線)、波形データが追加されています。

| 追加項目 | データ型 | サイズ [bit] |
|:--|:--|:--|
| red | unsigned | 16 |
| green | unsigned | 16 |
| blue | unsigned | 16 |
| nir | unsigned | 16 |
| wavepacket_index | unsigned | 8 |
| wavepacket_offset | unsigned | 64 |
| wavepacket_size | unsigned | 32 |
| return_point_wave_location | unsigned | 32 |
| x_t | floating | 32 |
| y_t | floating | 32 |
| z_t | floating | 32 |

## 2.4. 拡張可変長レコード (EVLR)

拡張変数長レコード (EVLR) は、LAS 1.4 以降のバージョンで導入されました。EVLR は VLR と同じような機能を有していますが、より大きなデータ容量を保持することができ、ファイルの末尾に配置されます。

EVLR も VLR と同様に以下の２つの部分で構成されています。

- ヘッダ
- ペイロード

:::note info
EVLR のペイロードのサイズ上限は 4,294,967,295 バイト ($2^{32} - 1$ バイト、約 4 GiB) となっています。
:::

# 3. 点群データの属性情報

LAS ファイルには、点群データの属性情報が格納されています。
代表的な属性情報は以下の通りです。

- **座標**: ポイントが地球上のどの位置にあるかを示す X, Y, Z の 3 次元空間座標
- **反射**: レーザー光が物体から反射して戻ってきた際の反射強度
- **分類**: ポイントがどの種類の物体に属するか（地面、植生、建物など）を示すカテゴリー
- **スキャン角度**: レーザーが発射された角度
- **GPS 時刻**: レーザーポイントが記録された GPS 時刻
- **ポイント属性**: ポイントごとに付加される波形データへのリンクや複数反射情報などの追加情報
- **ユーザデータ**: 特定のプロジェクトや目的に特化した情報を含む、ユーザが任意に追加できるデータ項目
- **反射強度**: レーザーの反射率
- **RGB**: 色情報
- **NIR チャンネル**: 近赤外線チャンネルのデータ
- **ポイント・ソース ID**: 特定のフライトラインや装置など、そのポイントデータが生成されたデータソースを識別する ID
- **波形データ**: レーザー反射の波形記録データ

## 3.1. 座標
```text
・X, Y, Z 項目
```

**座標の形式:**
座標（X, Y, Z）は、点群データの核となる部分であり、地球上の物理的な位置を表すために用いられます。これらの座標は、通常、地理座標系や投影座標系などの特定の参照システムにおけるポイントの位置を示します。

- **X, Y 座標**: 地球上のポイントの水平位置を示す。通常、東西 (X 軸) および南北 (Y 軸) の位置を示すために使用される。
- **Z 座標**: ポイントの高さまたは深さを示し、地表や海面からの相対的な高さ（または深さ）を表す。

**座標の変換:**

- 座標値は、ファイルヘッダで指定されている**スケールファクタ (`Scale Factor (X, Y, Z)`)** や**オフセット (`Offset (X, Y, Z)`)** を適用して変換される。
    - **スケールファクタ**: 各座標軸（X, Y, Z）に適用される倍率で、整数値を実際の座標値に変換する際に使用される。スケールファクタは、座標値の精度を決定する。
    - **オフセット**: 各座標軸（X, Y, Z）に適用される加算値で、データセット全体を特定の基準点からの相対位置に変換するために使用される。オフセットは、座標値をより扱いやすい数値範囲に調整するのに役立つ。
- 実際の座標範囲は以下のように計算される。
    ```math
    実際の座標=(格納された整数値×スケールファクタ)+オフセット
    ```
- スケールファクタが小さいほど、より高い精度で座標を表現できるが、表現できる実際の範囲は狭くなる。
- オフセットは、座標系の原点からの相対位置を調整し、実用的な数値範囲内でデータを保持するために使用される。

## 3.2. 反射
```text
・return_number (反射順序) 項目
・number_of_returns (反射数) 項目
```

LAS は離散的なポイント・データを扱うために設計されています。2次元や3次元のポイント・データに加え、Extra Byte 機能を使って多次元データに対応することもできますが、特に動的測定や離散反射、飛行時間を測定する LiDAR システムに焦点を当てています。このような現代の LiDAR システムでは、一度の送信で複数の反射を捉えることができます。**図3-1**は、一度の送信で５回反射するケースについて表しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/2b9b3f55-8ce9-0131-b905-41422431fbcd.png" width="550px" />


**図3-1. 一度の送信で 5 回反射するケース**

PDRF 0～5 では、一つの送信パルスにつき最大 5 回の反射を記録することができ、PDRF 6～10 では、一つの送信パルスにつき最大 15 回の反射を記録することができるようになっています。

パルスごとの反射数は、ファイルヘッダ内の `Number of points by return ct.` 項目（反射数を示す配列）に記載されています。

同一送信パルスからの複数の反射はすべて同じ GPS 時刻を共有しており、複数の反射パルスを関連付けるのに利用されます。タイル分割によってデータも分割され、同じ送信パルスからの複数の反射がタイルの境界にまたがる場合、同じ送信パルスからの反射が複数の LAS ファイルに記録されることもあり、そうした際に効果を発揮します。

## 3.3. 分類
```text
・classification 項目
```

LAS 1.0 の仕様で、クラスに 8 ビットが割り当てられ、地面や低植生などの反射面の種類を識別できるようになりました。その際、クラスは **モデル・キーポイント (Model Key-Point)** や **オーバーラップ・ポイント (Overlap Point)** のような特別なポイントをマークする目的でも使用されました。各 PDR にはこうした情報を格納するスペースが確保されていますが、どのような値を保存するかはユーザに委ねられていました。
これは、当初 LAS 1.0 は、LiDAR センサのメーカーや処理ツール開発者間のデータ交換プロトコルを目的としており、LiDAR データのエンドユーザ向けのフォーマットとは考えられていなかったことに起因するものです。

**表3-1. ASPRS 標準の PDRF 0～5 におけるクラス定義**

| クラス値 | 意味 |
|:--:|:--|
| 0 | 分類不可 |
| 1 | 未割り当て |
| 2 | 地表 |
| 3 | 低植生 |
| 4 | 中植生 |
| 5 | 高植生 |
| 6 | 建物 |
| 7 | 低点 (ノイズ) |
| 8 | モデル・キーポイント |
| 9 | 水面 |
| 10 | ASPRS で将来的な使用のために予約 |
| 11 | ASPRS で将来的な使用のために予約 |
| 12 | オーバーラップ・ポイント |
| 13～31 | ASPRS で将来的な使用のために予約 |

しかし、LAS は急速に LiDAR データ処理および配布の**標準フォーマット**となり、クラス項目の値を標準化する必要が出てきました。LAS 1.0 のクラス項目では、分類と状態（「地表」かつ「モデル・キーポイント」である等）を同時に表現できないという問題がありました。
こうした問題を解決するため、もともと LAS 1.0 で 8 ビットあったのクラス項目が、5 ビットの「クラス」項目と、3 ビットの「フラグ」項目に分割されました。これにより、クラス項目は 0 から 31 の範囲で指定することとなりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/f2bdc22a-036a-5840-90fe-eacb522bfd57.png" width="400px" />

**図3-2. LAS 1.1～1.3 の `calssification` 項目**

その後、モバイルマッピングや送電線のコーディングなど新しい用途が出現し、追加のクラスが求められるようになってきたため、LAS 1.4 では、新しい PDRF 6～10 で、クラスを 8 バイトの専用項目に戻し、0～63 は ASPRS の使用領域としての予約領域、64～255 はユーザ定義が可能な領域としました。
ASPRS で定義されたクラスを使用することで、どのソフトウェアでもクラスの意味を一貫して表示できるようになります。

PDRF 6～10 のクラス定義を**表3-2**に示します。

**表3-2. ASPRS 標準の PDRF 6～10 におけるクラス定義**

| クラス値 | 意味 | 備考 |
|:--:|:--|:--|
| 0 | 分類不可 |  |
| 1 | 未割り当て |  |
| 2 | 地表 |  |
| 3 | 低植生 |  |
| 4 | 中植生 |  |
| 5 | 高植生 |  |
| 6 | 建物 |  |
| 7 | 低点 (ノイズ) |  |
| 8 | 予約済み |  |
| 9 | 水面 |  |
| 10 | レール |  |
| 11 | 道路 |  |
| 12 | 予約済み |  |
| 13 | 保護線 (シールド) |  |
| 14 | 導線 (フェーズ) |  |
| 15 | 送信塔 |  |
| 16 | ワイヤー構造コネクタ | 絶縁体など |
| 17 | ブリッジデッキ |  |
| 18 | 高ノイズ |  |
| 19 | オーバーヘッド構造物 | コンベア、鉱山機械、信号機など |
| 20 | 無視された地面 | ブレークライン近接ポイント |
| 21 | 雪 |  |
| 22 | 一時的除外 | 水位、地すべり、永久凍土など、時間変化により無くなっていくもの |
| 23～63 | 予約済み |  |
| 64～255 | ユーザ定義可能 |  |

PDRF 6～10 では、PDRF 0～5 で使用していた **モデル・キーポイント（クラス値: 8）** と **オーバーラップ・ポイント（クラス値: 12）** が削除されています。PDRF 6～10 では、キーポイントとオーバーラップの記載は属性ビットでなされます。

また、PDRF 6～10 では、レールや保護線/導線などの新しい ASPRS 標準クラスコードが追加されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/de73f10c-9cd3-c64f-f89a-2ce86db0e59a.png" width="500px" />

## 3.4. スキャン角度
```text
・scan_angle_rank 項目  <PDRF 0～5>
・scan_angle 項目       <PDRF 6～10>
```

PDRF 0～5 ではスキャン角度 (`scan_angle_rank`) は 1 バイトでしたが、PDRF 6～10 ではスキャン角度 (`scan_angle`) が 2 バイトに拡張され、スキャン角度の精度が大幅に向上しました。

スキャン角度は、データの座標系の垂直方向に対するレーザーの回転位置を表しており、センサの背面から見て、反時計回りの回転が正となります。

- PDRF 0 の場合:
    - データ座標系の基点は 0° の位置
    - 正方向の最大値は 90°)
    - 負方向の最大値は -90°)
    - スケールファクタは 1°
- PDRF 6 の場合:
    - データ座標系の基点は 0.0 (0°) の位置
    - 正方向の最大値は 30,000 (180°)
    - 負方向の最大値は -30,000 (-180°)
    - スケールファクタは 0.006°

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/7f53aa94-9408-682a-7f06-9726ae797d15.png)

## 3.5. GPS 時刻
```text
・gps_time 項目  <PDRF 6～10>
```

ほとんどの PDRF で、パルスの時刻に関する項目を有しています。この時刻は、ファイルヘッダの `Global Encoding` 項目で示されるように、GPS Week-Second 時刻または標準 GPS 時刻としてエンコードされます。

GPS 時刻は LiDAR センサによってパルスが放出された時間を表しています。すなわち、同一反射パルスによる複数の反射パルスは同じ GPS 時刻を持つことになります。
現時点では、GPS 時刻が、複数の反射を関連付ける唯一の方法となっています。

## 3.6. ポイント属性
```text
・synthetic (合成フラグ)
・key_point (重要度フラグ)
・withheld (除外フラグ)
・overlap (オーバーラップ・フラグ)
・scanner_channel (スキャナ・チャンネル)  <PDRF 6～10>
・scan_direction_flag (スキャン方向フラグ)
・edge_of_flight_line (飛行ライン・エッジ)
```

ポイント属性ビットは、LAS 1.1 で初めて分類フラグを含むように拡張されました。さらに LAS 1.4 (PDRF6～10) で、オーバーラップ領域のポイントであることを示すフラグが追加されています。PDRF 6～10 の属性は**表4**の通り。最初の 4 ビットは分類フラグとして割り当てられています。

**表4. PDRF 6～10 のポイント属性**

| 略称 | 項目 | サイズ [bit] | ビット番号 |
|:--|:--|:--|:--|
| 分類フラグ | classification | 4 | 0～3 |
|　・合成フラグ | 　・synthetic | 1 | 0 |
|　・重要度フラグ | 　・key_point | 1 | 1 |
|　・除外フラグ | 　・withheld | 1 | 2 |
|　・オーバーラップ・フラグ | 　・overlap | 1 | 3 |
| スキャナ・チャンネル | scanner_channel | 2 | 4～5 |
| スキャン方向フラグ | scan_direction_flag | 1 | 6 |
| 飛行ライン・エッジ | edge_of_flight_line | 1 | 7 |

- １番目のフラグ：**合成フラグ (`synthetic`)** 
    - このフラグが "有効 (`1`)" に設定されている場合、関連するポイントはファイルヘッダのシステム識別子 (System Identifier) 項目に示されている方法で収集されたものではなく、他のメカニズムによって追加されたことを示している。
    - 一般的には LiDAR ポイントを移動する際に使用されるケースが多い。
　
- ２番目のフラグ：**重要度フラグ (`key_point`)**
    - これは、標高ファイルを形成する際、「元のクラス属性を維持するポイント」としてマーキングする目的で使用される。これにより、あるポイントにおいて、「水面」というクラスを維持したまま、「重要ポイント」としてフラグを立てるといったことができるようになる
    - 重要ポイントのメカニズムは、指定された精度基準を維持するために必要な最小限のポイントにデータを間引く
    - 典型的なアプローチは、すべてのポイント (地面など目的のクラス) を使用して不規則三角形網 (TIN: Triangulated Irregular Network) を作成し、再生成された TIN が指定されたエラー許容範囲に違反しないポイントを繰り返し削除することである
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/f100d8a9-781c-c0a4-715f-f9f4d961db2e.png" width="300px" />

- ３番目のフラグ：**除外フラグ (`withheld`)**
    - ポイントは LAS ファイルから削除せず、除外フラグを立てるのが望ましい
    - 例えば、「水面」のポイントを削除したい場合、ポイントを「水面」として分類された状態のまま (CLASS=9)、除外フラグを "有効 (`1`)" に設定することで、以降のモデリングから、そのポイントを省略することができる
　
- ４番目のフラグ：**オーバーラップ・フラグ (`overlap`)** <LAS 1.4 で新規追加>
    - LiDAR 飛行ラインのオーバーラップ領域のデータを間引くことが望まれるケースが多々ある
    - この操作は、LiDAR データの統計的精度を向上させたり、これらの領域の多重密度データを薄くするために使用される
    - LAS 1.3 以前の手法でもあった、オーバーラップであることを示すためにクラスを使用することは、ポイントの実際のクラス (「地表」など) を失うという問題を引き起こした
    - これはオーバーラップ領域の精度を分析する際の問題につながる

また、LAS 1.4 では新たにスキャナ・チャンネル (`scanner_channel`) を指定できるようになりました。これは、複数のレーザースキャナを持つモバイルマッピングシステムでの使用を想定しています。
このインジケータには 2 ビットが使用されるため、４台のスキャナのうちの１つを指定することができます。単一のスキャナの場合、チャンネルは `0` に設定します。

属性項目の最後の 2 ビットは、スキャン方向フラグ (`scan_direction_flag`) と飛行ライン・エッジ (`edge_of_flight_line`) です。

スキャン方向フラグは、回転ミラースキャナ用に定義されたもので、飛行方向が目から出た場合 (軌跡に沿って移動する航空機の後方を見た場合)、反時計回りの回転を正とするように定義されています。

飛行ライン・エッジは、360° 以外のスキャナではかなり重要なものとなっており、LiDAR フライトのエッジを素早く計算し、描画するのに使用できます (**図3**参照)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/807f351f-a3f2-9d6b-28bc-3169d354fa20.png)
**図3. LiDAR 光線の端**

## 3.7. ユーザデータ
```
・user_data 項目
```

各 PDRF は、1 バイトのユーザ・データを持っており、処理ソフトウェア側において、任意の目的で使用することができます。しかし、この項目の利用法は各々に一任されているため、アプリケーション・ソフトウェアとの連携等で使用できる保証はないことに留意しておく必要があります。

## 3.8. 反射強度、RGB、NIR チャンネル
```text
・intensity (反射強度) 項目
・red, green, blue (RGB) 項目  <PDRF 7, 8, 10>
・nir (近赤外線) 項目           <PDRF 8, 10>
```

`intensity` 値は、パルス反射の大きさを整数で表したものです。この値はシステム固有の値です。
RGB や近赤外線 (NIR) も、特定のポイントのフォーマットで保存することができます。これらのチェンネルは、１つまたは複数の補助光学センサ (カメラ) によるポイントのカラー化から得られた値を保存するためのものです。
例えば、360° カメラからの RGB 反射率データで LiDAR データをカラー化することは、モバイル・マッピングでは一般的な作業です。
このデータが含まれる場合、常に $65,536/(センサの強度ダイナミックレンジ)$ を乗じて 16 ビット、符号なしの値に正規化されます。例えば、センサのダイナミックレンジが 10 ビットの場合、スケーリング値は$(65,536/1,024)$ となります。この正規化は、異なるセンサからのデータを正しくマージできるようにするために必要です。反射強度や色データが含まれていない場合、これらの値は `0` に設定されなければなりません。
LASは、画像相関器からの 3D ポイントのようなレーザー以外のデータから点群を表現するためにますます頻繁に使用されています。PDRF 8 を使用することで、最大 5 チャンネルの情報 (`intensity`, `red`, `green`, `blue`, `nir` 項目) を保存することができます。

## 3.9. ポイント・ソース ID
```
・point_source_id 項目
```

`point_source_id` 項目 (2 バイト) は、プロジェクト・データセット内でポイントが元々作成されたソースファイルを識別するために使用されます。

例えば、あるプロジェクトに飛行ラインから生成された LiDAR ポイントのソースファイルがあり、その飛行ラインに 77 番が割り当てられていた場合、そのオリジナルファイル内のすべてのポイントは、そのポイントが伝播したファイルの数に関係なく、すべての処理を通じて 77 というポイント・ソース ID を保持します。

この機能により、マージや抽出といった複合的な処理によって LAS ファイルが作成された場合でも、そのポイントの元のソースにマッピングすることができます。

最も一般的な例は、多数の飛行ラインをタイルにマージして形成された処理タイルです。
ポイント・ソース ID を使用することで、各ポイントを元のソースとして一意に識別することができます。したがって、これはソフトウェアで「飛行ラインの色分け」といった操作を行う際に使用される項目です。

一般に、一度ポイントにポイント・ソース ID が割り当てられると、変更されることはありません。
また、ポイント・ソース ID は同じプロジェクト内以外では意味をなさないことに注意する必要があります (例えば、２つ以上のプロジェクトのポイントが混在している場合、ポイント・ソース ID を使って分離することはできません)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/714454fa-e323-ed0c-67a0-020daea32fd7.png)
**図3-3. 「移動した」ポイントを持つ合成ファイル**

純粋な LiDAR プロジェクト (すべてのデータソースが LiDAR 飛行ラインに由来する) の場合、ポイント・ソース ID は、合成フラグ (`synthetic`) の立ったポイントを除き、元の飛行ラインのデータを継承します (**図3-3**)。

この例では、ファイルソース ID が 1 と 2 の２つの飛行ライン ("Strip") があります。これら２つの飛行ラインのポイントは、ファイルソース ID が 500 のファイルにマージされています。

このマージ後のファイルでは、左端のポイントが下に**移動**しています。
これは、**元のポイントの除外フラグ (`withheld`) を `1` (TRUE) に設定**し、任意の位置に**合成フラグ (`synthetic`) を `1` (TRUE) に設定した新しいポイントを作成**することにより実現されます。新しいポイントは、ファイル・ソース ID が 500 のファイル上で作成されたため、ポイント・ソース ID として 500 が割り当てられ、合成フラグ (`synthetic`) が `1` (TRUE) に設定されます。

## 3.10. 波形データ
```text
・wavepacket_index 項目            <PDRF 9, 10>
・wavepacket_offset 項目           <PDRF 9, 10>
・wavepacket_size 項目             <PDRF 9, 10>
・return_point_wave_location 項目  <PDRF 9, 10>
```

LAS 1.3 以降、**波形**データの保存が導入されています。波形は基本的に、時間に対するレーザー・パルスの戻り強度をデジタル化したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659159/a426732a-c7f7-3f19-1557-c41bd890f5ae.png)
**図3-4. 波型エンコーディング**

波形全体を保存するのではなく、**特徴のある**イベントが含まれている波形パケットを保存します。**特徴のある**イベントは、ハードウェア・ベンダが任意に喜寿を決めることができますが、一般的には関心領域内のノイズ・レベルを超える振幅である (例えば、地上からの公称飛行高が 2,000 m の場合、航空機から 200 m のイベントは通常収集しない等)。
データの二重使用 (例えば、ポイント・モードと波形モード) を可能にするため、１つ以上のポイントで、波形パケットのインデックスが付与されています (**図3-4**参照)。

また、１つの LAS ファイルには、最大 255 の波形パケットスキームをエンコードすることができます。これらのスキームは、波形パケット記述子 (VLRS に格納) 内にエンコードされます。波形パケット記述子には、**表3-3**に示す項目が含まれます。サンプル時間間隔はピコ秒単位で、最大分解能は 0.03 cm です。


**表3-3. 波形パケット記述子 ユーザ定義レコード**

| アイテム | フォーマット | サイズ [byte] |
|:--|:--|:--|
| サンプルあたりのビット数（符号なし） | char | 1 |
| 波形圧縮タイプ（符号なし） | char | 1 |
| サンプル数（符号なし） | long | 4 |
| サンプル時間間隔（符号なし） | long | 4 |
| デジタイザー・ゲイン | double | 8 |
| デジタル・オフセット | double | 8 |

# 4. 参考資料

- **"LAS Specification"**, https://www.asprs.org/wp-content/uploads/2010/12/LAS_Specification.pdf
- **"LAS v1.4 Conversion Webinar"**, https://support.geocue.com/wp-content/uploads/2015/05/LAS-v1.4-Conversion-Webinar.pdf
- **"LiDAR Point Classification"**, https://desktop.arcgis.com/ja/arcmap/latest/manage-data/las-dataset/lidar-point-classification.htm#ESRI_SECTION1_570719D89812478598FB633D71EBAD06
- **"Welcome to Laspy’s documentation!"**, https://laspy.readthedocs.io/en/latest/intro.html
- **"LASSpecification1.4-R15"**, https://www.asprs.org/wp-content/uploads/2019/07/LAS_1_4_r15.pdf
- **"Background: What are LAS Files?"**, https://laspy.readthedocs.io/en/1.x/tut_background.html
- **"TIN"**, https://mogist.kkc.co.jp/word/3ac06a86-048a-46e6-8355-59c5da27f381.html