bablon.jsで地形データを表示したい１

# はじめに

babylon.jsを使って、地形データを表示します。
仕事の都合で、学習中。

# データ

## フリーデータ

まずは何を表示する？ということで、フリーのデータを探して、こちらを見つけました。

静岡県ポイントクラウドデータベース
https://pointcloud.pref.shizuoka.jp/

![スクリーンショット 2020-09-21 13.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45425/fd4f659a-a0a8-c935-c230-a053ce3267f1.png)

静岡県の施工現場の地形データをlas形式で公開しているサイト。「閲覧・DL」からlas形式のファイルをダウンロードできます。las形式は、バイナリ形式の地形データで、3Dビューワではそのまま表示できるものもあるようですが、babylon.jsで表示したいので、読める形式に変換できないか調べます。

## las2txt

http://www.cs.unc.edu/~isenburg/lastools/
las形式のファイルをテキスト形式に変換するツール。

![スクリーンショット 2020-09-21 13.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45425/e1135523-6f03-3539-8f25-c9118301c345.png)

ダウンロードすると、windows用のバイナリファイルがありますが、centosで実行したいので、コンパイルします。Makefileもついている。centos6では、gccのバージョンが古く、コンパイル失敗。こちらを参考に解決。

動かざることバグの如し - CentOS6のgccをアップデートする
https://thr3a.hatenablog.com/entry/20180308/1520506543

コマンドを実行すると、入力ファイルと出力ファイルを求められるので、入力するだけです。

```
$ las2txt
las2txt is better run in the command line
enter input file: 31S2212011301-1.las
enter output file: 31S2212011301-1.txt
<press ENTER>
```

スペース区切りのx, y, z形式になります。値はセンサーからの距離でしょうか。

```
$ head 31S2212011301-1.txt
-20715.16 -89999.21 636.720
-20714.88 -89999.70 637.140
-20714.67 -89998.82 636.980
-20714.66 -89997.34 635.280
-20714.64 -89999.29 637.120
-20714.50 -89998.43 636.830
-20714.45 -89996.97 635.180
-20714.43 -89998.00 636.670
-20714.33 -89999.73 637.670
-20714.31 -89996.47 635.270
```

# 点群データ表示

babylon.jsで点群データを表示するには、`Points Cloud Particle System`を使います。
https://doc.babylonjs.com/how_to/point_cloud_particles

```js
    // 点群データの表示
    var pcs = new BABYLON.PointsCloudSystem("pcs", 1, scene);

    var myfunc = function(particle, ii) {
      particle.position = new BABYLON.Vector3(data[ii][0] - x_mid, data[ii][1] - y_mid, data[ii][2] - z_mid);
    }

    pcs.addPoints(data.length, myfunc);
    pcs.buildMeshAsync();
```

`data`にlas2txtで変換したデータを設定。そのままの値を利用すると値がデカいので、`x_mid`, `y_mid`, `z_mid`にそれぞれの軸の中心点を設定して、引きました。中心点からの距離になっているはず。


できました。
`令和元年度［第３１-Ｓ２２１２-０１号］口坂本No．2事業間連携砂防等事業（地すべり）に伴う測量業務委託（航空レーザ測量）`
![スクリーンショット 2020-09-21 14.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45425/7e32a713-a0f1-ec85-98e1-bbb893175592.png)

地図上ではココ。
![スクリーンショット 2020-09-21 14.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45425/287ad446-2a76-8c87-513f-8778dda3e9eb.png)

プログラムはこちら。ぐりぐり動きますが、表示に時間がかかります。
http://141-lab.com/babylon/qiita/pcs/

# 気になったこと
lasデータをそのまま使うと容量がデカくなるので、点データを減らしてみました。

## 1/10サイズ
awkで10行に1行を出力するコマンド

```
cat ./31S2212011301-1.txt | awk '(NR%10==0){print}' > ./31S2212011301-10.txt
```

結果
点は薄く、表示は早い。
![スクリーンショット 2020-09-21 14.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45425/99677fd6-cf12-5d18-1362-867dff6890c8.png)
http://141-lab.com/babylon/qiita/pcs/1_10.html

## 1/100サイズ
awkで100行に1行を出力するコマンド

```
cat ./31S2212011301-1.txt | awk '(NR%100==0){print}' > ./31S2212011301-100.txt
```

結果
点はさらに薄く、表示はさらに早い。
![スクリーンショット 2020-09-21 14.11.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45425/5de122ef-50d0-cc9d-03ff-992f6dd5ebda.png)
http://141-lab.com/babylon/qiita/pcs/1_100.html

## まとめ

| データ | データサイズ | 点の数 | 表示時間 |
|:-:|:-:|:-:|:-:|
| オリジナル | 105M | 3875933 | 36.1秒 |
| 1/10サイズ | 11M | 387593 | 1.2秒 |
|  1/100サイズ | 1.1M | 38759 | 0.2秒 |

データを減らしても雰囲気は出ているので、データを減らすのはありかなと思いました。

# 今後

次は面で地形を表示したい。