---
title: はじめての3D空間データ
tags: geo,python
---
<!--
* https://hackmd.io/yP18eHYJQnyDHksCiKMCMg
* https://sites.google.com/site/foss4gsig/%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/%E7%AC%AC30%E5%9B%9Egis%E5%AD%A6%E4%BC%9A-%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97foss4g%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A63d%E7%A9%BA%E9%96%93%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%89%B1%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
* https://hackmd.io/@homata/SkfR2h5UY/%2FSrHSeliTRaO_FwAPRWnPBw
-->
はじめての3D空間データ
===
## 点群データとは?
点群はレーザーによる3次元スキャナー測量をしたデータ。
点群(てんぐん)データは点(ポイント)の集まりであり、直交座標値(X,Y,Z)+色情報(R,G,B) + αで構成された、座標参照系の情報がある3次元の空間情報データです。別名でポイントクラウドとも呼ばれています。
点群データは、地形や構造物を表すことが多く点の密度により膨大なサイズとなります。
点群データの作成方法は、LiDAR(Light Detection And Ranging)等のレーザーを利用して計測されたものや、複数の写真画像データから3次元モデルを計算して作成するSFM(Structure from Motion)やMVS(Multi-View Stereo)があり、データフォーマットとしてはLAS形式やテキストベース形式などのさまざまな形式があります。
### 3Dデータ活用
#### PLATEAU プラトー
[PLATEAU プラトー - 国土交通省](https://www.mlit.go.jp/plateau/)
PLATEAU は、国土交通省が進める 3D都市モデル整備・活用・オープンデータ化 のプロジェクト。
都市活動のプラットフォームデータとして 3D都市モデルを整備しそのユースケースを創出し活用できるようにする
* [PLATEAU VIEW](https://plateauview.mlit.go.jp/)
PLATEAU VIEW は、PLATEAU のデータをプレビューできる、ブラウザベースのWebアプリケーションです。
```
PLATEAU VIEW は最新のデスクトップ版 Chrome、Safari、Edge 上で動作します
最小システム要件:CPU: 2 GHz デュアルコア以上、システムメモリ(RAM): 4GB
```
### その他
* パリのノートルダム大聖堂の火事
* [ノートルダム大聖堂の修復に希望、完璧な「3Dデータ」が存在](https://forbesjapan.com/articles/detail/26759)
* [パリのノートルダム大聖堂の火事から1年。修復](https://news.yahoo.co.jp/byline/saorii/20200416-00173452)
* [Notre-Dame du numérique | Reportage CNRS](https://www.youtube.com/watch?v=mTgSyWS7z5g&t=7s)
* [マインクラフト - 静岡点群データマインクラフト化「熱海」](https://www.youtube.com/watch?v=w42O1ksbEng&t=1s)
* [点群データをUnityで表示](https://twitter.com/_darger/status/1261496128438071296)
* [みんなの首里城デジタル復元プロジェクト](https://www.our-shurijo.org/)
## レーザー計測方式
点群データには、レーザーを利用して計測されたデータが多くあり、レーザー計測方式のいくつかを簡単に紹介します。

[国土交通省国土地理院: 航空レーザ測量の仕組み](https://www.gsi.go.jp/kankyochiri/Laser_senmon.html)
* 航空レーザ測深(ALB: Airborne Laser Bathymetry)
* レーザースキャナーを搭載した航空機やヘリコプターから計測する
* 複数のレーザーで、陸上と水部(河川や海の水深)を計測する方式
* 航空レーザ測量(LP: Laser Profiler)
* レーザースキャナーを搭載した航空機やヘリコプターから計測する
* 陸上を計測する方式
* 従来から幅広く実施されている方式
* 移動計測車両(MMS:Mobile Mapping System)
* レーザースキャナーを搭載した車両が道路を走りながら計測する
* 地上型または固定型
* 移動しないで計測する方式で、3Dレーザースキャナー等の計測機を使用して計測する
そのほかに、水中設置型や、LiDARを搭載したUAV(Unmanned Aerial Vehicle)やiPhoneやiPadからも作成されます。
#### 参考
* [公共測量 - マニュアル・要領等のダウンロード (国土地理院)](https://psgsv2.gsi.go.jp/koukyou/download/download.html)
* [航空レーザ測深機を用いた公共測量](https://psgsv2.gsi.go.jp/koukyou/public/alb/index.html)
* [PowerPoint(PDF)](https://www.gsi.go.jp/common/000218811.pdf)
----------------------------------
## 3次元データのファイル形式
3次元データのファイルにはさまざまなファイル形式があります。
いくつかのファイルフォーマットを紹介します
### 点群データ系
#### LAS形式
* 航空機レーザー測量の標準フォーマット
* ASPRS(米国写真測量学会:American Society for Photogrammetry and Remote Sensing) によって作成された形式
* [LAS 1.4 Specification Approved by ASPRS Board](https://www.asprs.org/news/press-releases/press-release-archives/las-1-4-specification-approved-by-asprs-board.html)
* [LAS SPECIFICATION VERSION 1.4 – R13 15 July 2013](https://www.asprs.org/wp-content/uploads/2010/12/LAS_1_4_r13.pdf)
* [LAS Point Cloud Format](https://www.usna.edu/Users/oceano/pguth/md_help/html/las_format.htm)
* 投影座標系はUTMなどの投影座標系が推奨されいる。日本では、日本測地系2011や平面直角座標系で提供されることが多い
#### LAZ形式
* LAS形式を圧縮したデータ形式
* [LASzip - free and lossless LiDAR compression](https://laszip.org)
#### PLY形式 (Polygon File Format)
* 3Dスキャナーから3次元データを格納するために設計されたデータ形式
* ASCIIとバイナリの2つのバージョンが存在
* [PLY - Polygon File Format]( http://paulbourke.net/dataformats/ply/)
#### XYZ、CSV、TXT形式
* タブ、空白、カンマなどでデータを区切られたASCIIファイル
* 1行目にヘッダーあり/なしがある
* 位置情報(X座標、Y座標、Z座標)と色情報(R、G、B)がある
### メッシュデータ系
#### STL形式 (Standard Triangulated Language)
* 3D CADソフト用のファイルフォーマットの1つ
* 対応している3Dプリンターが多い
* 色やカーブ形状などが表現できない
* ASCII形式とバイナリ形式がある
* [The STL Format - Standard Data Format for Fabbers](http://www.fabbers.com/tech/STL_Format)
#### OBJ形式
* Wavefront Technologies社によって開発されたファイル形式
* 多くの3Dモデリング、レンダリングソフトが対応
* 動かない3Dオブジェクトに適している
* [Obj Specification as used by Wavefront](http://www.martinreddy.net/gfx/3d/OBJ.spec)
#### FBX形式
* AutoDesk社が公開したファイル形式
* 3DCG(3 Dimensional Computer Graphics)のデファクトフォーマット
* 動く3Dオブジェクトに適している
* [Adaptable file format for 3D animation software](https://www.autodesk.com/products/fbx/overview)
--
## 点群データのツール
点群データは高密度な点群であり、データの表示、変換、サイズ変更をする場合は下記のようなツールを使います。
### 代表的なツール
#### CloudCompare
点群データ処理のオープンソースのソフトウェアです。
Windows、Mac、Linux版があり、操作性(インターフェイス)はわかりやすく扱いやすい、点群データを表示確認するのは便利なツールです。
* [CloudCompare - 公式サイト](http://www.danielgm.net/cc/)
* [GitHub](https://github.com/cloudcompare/cloudcompare)
* [CloudCompareの基本操作](https://hdtopography.github.io/learning/book/cloudcompare/cloudcompare.html)
* [PointCloudデータ編集可能ソフトCloudCompare概要](http://www.pointcloud.jp/blog_n23/)

#### MeshLab
3Dメッシュ処理や編集可能な可能なオープンソースのソフトウェアです。
3次元の三角形メッシュの編集、点群からメッシュへの変換などのたくさんの機能があります
Windows、Mac、Linux版があり、大規模点群データの処理はあまり得意でないです。
* [MeshLab - 公式サイト](https://www.meshlab.net/)
* [GitHub](https://github.com/cnr-isti-vclab/meshlab)
* [3Dデータ編集・変換ソフトMeshLab概要](http://www.pointcloud.jp/blog_n17/)
* [MeshLabで点群データ処理](https://qiita.com/yuzsh/items/ab2869345f5e9e499199)

### PDAL
PDAL(Point Data Abstraction Library)は、点群データの変換や処理を行うためのC/C++ のオープンソースライブラリです。
C/C++ 以外にも、JavaやPythonからも呼び出すことが可能で、コマンドラインツールにもなっています。、
* [PDAL - Point Data Abstraction Library](https://pdal.io/)
* [GitHub](https://github.com/PDAL/PDAL)
* [PDF](https://pdal.io/PDAL.pdf)
* [PDALで点群データを処理](https://qiita.com/waigania13/items/b6335ddab09a07746921)
* [PyPI - PDAL 2.4.2](https://pypi.org/project/PDAL/)
### LAStools
LiDARデータの処理に特化したツールが数多く集まったものです
* [LAStools](http://lastools.org/)

* [三次元点群データをQGISでひり出してみた](https://qiita.com/Yfuruchin/items/7b9ea3e823824d2e4e86)
### plas.io
ブラウザだけで.lasファイル、.lazファイルを表示できるサイト
* [Webサイト](https://plas.io/)
* [GitHub](https://github.com/verma/plasio)

### Blender
3DCGアニメーションを作成するための統合環境アプリケーション。Pythonでプラグインを作成できる
* [Webサイト](https://www.blender.org/))
* [日本のWebサイト(非公式)](https://blender.jp/)

Blenderで点群を表示

#### Potree
WebGLベースのポイントクラウドビューア
* Potree
* [Webサイト](https://potree.github.io/)
* [GitHub](https://github.com/potree/potree)
* PyPotree - PyPotree (potree for jupyter notebooks and colab)
* [GitHub](https://github.com/centreborelli/pypotree)
* [PyPI](https://pypi.org/project/pypotree/)

---
### 点群データを表示してみる
今回は、こちらのサイトを参考にしています。基本的なことはこちらで説明をしますが是非にいろいろチャレンジしてみてください
* [Guide to real-time visualisation of massive 3D point clouds in Python](https://towardsdatascience.com/guide-to-real-time-visualisation-of-massive-3d-point-clouds-in-python-ea6f00241ee0)
### デモ
サンプルはJupyterLab又はGoogle Colabで表示させたいと思います。
### Jupyter Lab (Google Colabでは表示できません)
ファイルは、[河津七滝ループ橋:[08OF4060]](https://gic-shizuoka.s3-ap-northeast-1.amazonaws.com/2020/LP/00/08OF4060.zip) のlasファイルのデータを間引いたものを表示します
#### pptkで表示
モジュールインポート
```
import numpy as np
import laspy as lp
import pptk
```
lasファイル読み込み
```
input_path = "D:/pd/"
dataname = "08OF4060_3"
# Laspyの1.0系の場合
# point_cloud = lp.file.File(input_path + dataname + ".las", mode="r")
# Laspyの2.0系の場合
point_cloud = lp.read(input_path + dataname + ".las")
```
座標と色を取得
```
points = np.vstack((point_cloud.x, point_cloud.y, point_cloud.z)).transpose()
colors = np.vstack((point_cloud.red, point_cloud.green, point_cloud.blue)).transpose()
```
ポイント数を減らす(間引き)
```
factor=10
decimated_points_random = points[::factor]
```
pptkビューを表示
```
v = pptk.viewer(points)
```
色と背景を設定
```
v.attributes(colors/65535)
v.color_map('cool')
v.set(point_size=0.001,bg_color=[0,0,0,0],show_axis=0,show_grid=0)
```
Jupyter Labのコード

Jupyter Labで表示

#### Open3Dで表示
モジュールインポート
```
import numpy as np
import laspy as lp
import open3d as o3d
```
lasファイル読み込み
```
input_path = "D:/pd/"
dataname = "08OF4060_3"
# Laspyの1.0系の場合
# point_cloud = lp.file.File(input_path + dataname + ".las", mode="r")
# Laspyの2.0系の場合
point_cloud = lp.read(input_path + dataname + ".las")
```
座標と色を取得
```
points = np.vstack((point_cloud.x, point_cloud.y, point_cloud.z)).transpose()
colors = np.vstack((point_cloud.red, point_cloud.green, point_cloud.blue)).transpose()
```
ポイント数を減らす(間引き)
```
factor=10
decimated_points_random = points[::factor]
```
open3d形式に変換
```
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
pcd.colors = o3d.utility.Vector3dVector(colors/65535)
pcd.normals = o3d.utility.Vector3dVector(points)
```
点群表示
```
o3d.visualization.draw_geometries([pcd])
```
voxelで点群表示
```
voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd,voxel_size=0.40)
o3d.visualization.draw_geometries([voxel_grid])
```
Jupyter Labのコード

Jupyter Labで表示

### Google colob
Google colobでの表示例として「PyPotree」を使用して表示させます。
表示するデータは、CloudCompareを使って「08OF4060.las」を間引いたものをtxtファイルに変換したものを使用します。
ZIPで圧縮してるのでダウンロードしたら解凍をしてください
* [08OF4060_3.zip (92.7MB (97,271,054 バイト))](https://www.dropbox.com/s/17jcw8epqo5e1r8/08OF4060_3.zip)
#### PyPotreeで表示
GoogleDriveをマウント
```
from google.colab import drive
drive.mount('/content/gdrive')
```
PyPotreeをインストール
```
!pip install pypotree
```
TXT形式の点群データを読み込み
```
import pypotree
import numpy as np
import pandas
input_path="/content/gdrive/MyDrive/Colab Notebooks/Point Cloud Sample/data/08OF4060_3.txt"
df_xyz = pandas.read_table(input_path, sep='\s+', header=None)
print(df_xyz.head(5))
```
X,Y.Zデータを切り出し
```
df_xyz = df_xyz.iloc[:,0:3]
xyz = df_xyz.to_numpy().tolist()
# xyz
```
PyPotreeで表示
```
cloudpath = pypotree.generate_cloud_for_display(xyz)
pypotree.display_cloud_colab(cloudpath)
```
ソースコード

PyPotreeで表示

## 使うソフトウェアとデータ
### 使用ソフトウェア
* [CloudCompare](http://www.cloudcompare.org/)
* [MeshLab](http://www.meshlab.net/)
### 使用データ
#### 点群データ
* [「VIRTUAL SHIZUOKA」富士山南東部・伊豆東部エリアのデータ公開](http://www2.pref.shizuoka.jp/all/kisha20.nsf/c3db48f94231df2e4925714700049a4e/02c1ee8264a1b658492585420007c620)
* [G空間情報センター 富士山南東部・伊豆東部 点群データ](https://www.geospatial.jp/ckan/dataset/shizuoka-2019-pointcloud)
##### 今回使用する点群データ
* [河津七滝ループ橋:[08OF4060](ファイルサイズ大きいです)](https://gic-shizuoka.s3-ap-northeast-1.amazonaws.com/2020/LP/00/08OF4060.zip)
* [韮山反射炉:[08NF5045](ファイルサイズ大きいです)](https://gic-shizuoka.s3-ap-northeast-1.amazonaws.com/2020/LP/00/08NF5045.zip)