Slide 1

Slide 1 text

OSC2020 Aizu 松澤太郎(タイル三兄弟) Pythonで 点群を 読んでみよう

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

タイル三兄弟の一味 Twitter: @smellman 日本UNIXユーザ会理事、OSGeo日本支部理事、OpenStreetMap Foundation Japanメン バー React NativeとかRuby on RailsとかPythonとかやってる地理系プログラマー ブレイクコアクラスタ 自己紹介

Slide 4

Slide 4 text

点群とは Pythonで読む 地図のイベントの宣伝(時間があまったら) 今日のお題

Slide 5

Slide 5 text

点群とは

Slide 6

Slide 6 text

地理で使われるデータの一種 レーザー測量やSfMなどで得られたPoint Data群 Point Cloudという 3Dでの地図表現でよく使われるデータ 最近では自動運転とかSmartうんたらかんたら 点群とは https://tiles.smellman.org/kakegawa/index-itowns.html

Slide 7

Slide 7 text

las(LASer format)及びlaz(zip圧縮したもの)が有名 lasの仕様書は公開されている https://www.asprs.org/wp-content/uploads/2010/12/LAS_1_4_r13.pdf las1.2〜1.4が一般的に使われている バージョンの違いはヘッダー及び扱えるものの差 フォーマット

Slide 8

Slide 8 text

Potree 独自のストラクチャを持つもの。専用のコンバータ PotreeConverter を使う。 一時期PotreeConverterが商用ソフトになった(現在はBSDライセンス)。 Cesium or iTown 3D Tiles に対応。OSSのコンバータでは entwine か py3dtiles が有名。 点群を表示するWebライブラリ

Slide 9

Slide 9 text

Pythonで読む

Slide 10

Slide 10 text

lasデータは仕様が公開されている 静岡県がlasデータをたくさん公開している https://pointcloud.pref.shizuoka.jp/ Creative Commons License 4.0 バイナリを読むプログラムを書くのに良い題材となる 今回の本題

Slide 11

Slide 11 text

Pythonに限らずだいたいのプログラミング言語には標準でバイナリを読むモジュールがある Pythonの場合 struct を利用する https://docs.python.org/ja/3/library/struct.html Javascriptで読む話はFOSS4G Japan 2020 Onlineでやります スポンサー講演でバイナリ読む話するの頭おかしい Pythonで読む

Slide 12

Slide 12 text

lasの仕様書を手元に置きます import struct をします open(file_path, ‘rb’) でファイルを開きます rb = read only, binary structで一つずつ読み込んでいきます 読み方

Slide 13

Slide 13 text

こんな感じのコードになります 先頭を読む import struct f = open(‘your.las’, ‘rb’) file_signature = b"".join(list(struct.unpack('4c', f.read(1*4)))).decode(‘ascii') print(file_signature) f.close() # 閉じておく

Slide 14

Slide 14 text

こんな感じのコードになります File Source IDを読む import struct f = open(‘your.las’, ‘rb’) file_signature = b"".join(list(struct.unpack('4c', f.read(1*4)))).decode(‘ascii') (file_source_id,) = struct.unpack(‘H’, f.read(2)) print(file_source_id) f.close() # 閉じておく tupleで返ってくるので注意

Slide 15

Slide 15 text

f.read関数はファイルを読む開始位置をずらしていきます 例えば二回f.readを使うと… f.read(4) f.read(3) 開始位置が7へ移動する read関数 read(4) 0 read(3) N

Slide 16

Slide 16 text

struct.unpackで読んだバイナリをどのようにアサインするかを決める struct.unpack('4c', f.read(1*4)) char[4] struct.unpack('

Slide 17

Slide 17 text

Lasのフォーマットのドキュメントを読みながらひたすらstruct.unpackを並べていく 随時printするなりして問題ないかチェックする unit testを書いても良い わりと単純にPythonでは読むことができる 逆を言うとJavascriptはクセがすごい あとは突き合わせをしていく

Slide 18

Slide 18 text

こんな感じになる def header(self, f): file_signature = b"".join(list(struct.unpack('4c', f.read(1*4)))).decode('ascii') (file_source_id,) = struct.unpack('H', f.read(2)) (global_encoding,) = struct.unpack('H', f.read(2)) (guid_data1,) = struct.unpack('

Slide 19

Slide 19 text

LASのversion minorによってヘッダの大きさが変わる LAS 1.2 -> 227byte LAS 1.3 -> 235byte LAS 1.4 -> 375byte 必ずversion checkを入れること 読む上で注意点

Slide 20

Slide 20 text

ヘッダーにOffset to point dataという値があるので、ここに f.seek をして読み始める データそのものの読み方も仕様を読みながら。 実際の値はscale factorとoffsetの組み合わせになるとかもちゃんと仕様に書いてあるの で見逃さないこと。 点群そのものを読む

Slide 21

Slide 21 text

地図のイベント

Slide 22

Slide 22 text

FOSS4G Conferenceは地図のOSSのイベントとして世界各地で行われている 日本では東京、関西、北海道、東海、新潟などで開催されている OSSなプログラムの紹介やサービスの紹介から政府系の発表など、様々な発表がある 昨年のFOSS4G Niigataでは政府CIO補佐官が基調講演 FOSS4G Conference

Slide 23

Slide 23 text

OpenStreetMapのマッパーやエンジニアの祭典 2017年に国際カンファレンスを会津若松に誘致 日本では1〜2年単位で開催 去年はお休み State of the MAP

Slide 24

Slide 24 text

コロナのせいでオンラインへ 開催日を調整して、State of the Map Japan 2020 と FOSS4G 2020 JAPAN Online を 2020年11月7日、8日の2日連続で開催 今年のイベント

Slide 25

Slide 25 text

2020೥11݄7೔ 2020೥11݄8೔ ޕલ FOSS4G JP 2020 Online νϡʔτϦΞϧσΠ ޕޙ State of the Map FOSS4G JP 2020 Online ίΞσΠ ໷ ࠙਌ձ λΠϜεέδϡʔϧ

Slide 26

Slide 26 text

スポンサーセッションで今回の話+Javascript版を話します。 スポンサーセッションで バイナリを読む話 スポンサーとは? FOSS4Gにて

Slide 27

Slide 27 text

State of the Map Japan 2020 https://stateofthemap.jp/2020/ FOSS4G 2020 Japan Online https://www.osgeo.jp/events/foss4g-2020/foss4g-2020-japan-online 参加者募集

Slide 28

Slide 28 text

OpenStreetMap JP https://osm.jp OSGeo日本支部 https://www.osgeo.jp コミュニティサイト