300万行のテキストを10倍速く地図化する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/811438df-7b97-f5cb-b271-a4a275c27692.png)

```
👨‍🍳 奥さん！ どの台所にも転がってるレーザー測量テキストファイルの扱いに困っていませんか？
お手持ちのQGISで素早くチェックできますよ！
```

### 背景
近年ざまざまなレーザー計測データ（DSM/DTM/DEM）がオープンデータとして公開されています。中の人いつもありがとうごさいます。
たとえば、[兵庫県庁さん](https://www.geospatial.jp/ckan/dataset/2010-2018-hyogo-geo-dsm)や[北海道庁さん](https://www.harp.lg.jp/opendata/dataset/search/?utf8=%E2%9C%93&s%5Bkeyword%5D=%E3%83%AC%E3%83%BC%E3%82%B6%E3%83%BC&s%5Bcategory_id%5D=&s%5Bestat_category_id%5D=&s%5Barea_id%5D=&s%5Btag%5D=&s%5Bformat%5D=&s%5Blicense_id%5D=&s%5Bdataset_group_id%5D=&s%5Bsort%5D=released&s%5Boption%5D=all_keywords&search=%E6%A4%9C%E7%B4%A2)からも公開されていますし、[このようなまとめでも様々な実例や活用が紹介されています。](https://togetter.com/li/1479533)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/f7d0c3ef-6889-3cd6-7329-47a1684759a2.png)

これらのデータは、GISで扱いやすいTIFFファイルなどのラスタ形式で提供されている場合もありますが、数字の羅列のテキストファイルのみで提供されていることもあります（測量業者さんから納品される形式もテキスト形式だったりします）。

たとえば兵庫県さんから提供されているDSMデータはこんな中身です。

```
55428.500 -139500.500 60.28
55429.500 -139500.500 60.41
55430.500 -139500.500 60.41
55431.500 -139500.500 60.37
55432.500 -139500.500 60.56
55433.500 -139500.500 60.50
55434.500 -139500.500 60.55
55435.500 -139500.500 60.58
55436.500 -139500.500 60.57
55437.500 -139500.500 60.64
55438.500 -139500.500 60.62
```
左からx座標/y座標/z（高さ)という意味ですね。1メッシュあたり約1.5kmx3.5kmほどの範囲に1mごとのレーザー測量データが入っているので、このサンプルでは300万行・87MBのけっこう大きめのテキストファイルになります(こんなのがあと3000個ほど公開されてます)。

この数字羅列をみて、「ふむ、竹田城跡の西側に落ち武者どもの魂が見て取れますね…」という方は殆どいないとおもいますので、地図化や空間的な解析を行うために、QGISなどを使ってこのテキストデータをラスタ形式のデータに変換後、３Dや地形解析などに活用していくのが一般的なアプローチと思います。

ところで、この巨大テキストファイルからQGISでラスタ形式に変換するやりかた、よくあちこちで聞かれたりしまして
`TXT →（読み込み）→ ポイントレイヤ →（変換）→ラスタ`
という、一旦別ファイルを介してやる方法もあるのですが、整形や確認を踏まえると1ファイルあたり5分ほどかかってしまいます。

このほかにも

- 中間ファイルやレイヤが増えて混乱のもとになる
- ラスタへの変換時エラーが出て止まることがある
- 手間が多くて初学者の心をへし折る
- 前やったことあるけどやり方忘れちゃった（ﾃﾍ

などといった困難が待ち構えています。

### どうするか

では、どうやるかといいますと、

**👨‍🍳 QGISのマップにドラッグ＆ドロップしたら、ラスタとして読み込んでくれます。**

![txt2dem.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/15bcf5da-d089-cbe7-f39c-5755ed0add58.gif)

マシンスペックやデータによるとはおもいますが、検証環境のMacBookPro2016(Late)/QGIS3.10LTRでしたら兵庫県DSMデータのテキストファイル１つが30秒ほどで変換できました。手作業処理になんやかんやで5分かかっていたことを考えると10倍の高速化です(雑)

こんなにすんなり変換できるのはQGISに使われている[gdal](https://gdal.org/)というファイル変換ライブラリが今回扱ったような[ASCII Gridded XYZ](https://gdal.org/drivers/raster/xyz.html)に対応しているためです。

ただし、ドラッグ＆ドロップでさっくり見るには条件がいくつかあって

- テキストファイルはx/y/zの並び
- 区切りは半角スペース
- ヘッダなし

となっています、もしお手持ちのDEM/DSMなどのテキストデータがこのフォーマットではない場合、ビギナーな方はカラムの編集などを大量データに強いエディタ（たとえばVisual Studio Codeとか)でやるのもOKですし、ちょっとわかる方はgdalのコマンドで条件かえてコマンドで動かしたり、Python(Pandas)等で前処理してもよいかとおもいます。

また、前もって必要な複数範囲のテキストファイルをコマンドラインなどで先に結合しておくと、ラスタ処理が一回で済むので楽になるかもしれません（超巨大になりすぎないようにご注意を）。

また、もう一つの注意点としてはこのようなテキストファイルに投影法は入っていないので、QGIS上でレイヤの横に？マークが出て、地形図などと位置が合わなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/b263231a-3df5-9726-f536-a9bcd32bc98e.png)

そのため、投影法をQGIS上で設定してあげる必要があります。
各データの投影法はデータ元の諸元に記述してあるので、ご確認ください（なかったらやんわりお尋ねしてみましょう）。

今回暑かった兵庫県のデータだと平面直角座標系第V系(EPSG:6673)になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/1fa0d6e8-707a-84bf-5560-2f4e04caffad.png)

QGISでのレイヤ横にでた「？」を押して「座標参照系の選択」で平面直角座標系第V系(EPSG:6673)を設定してあげましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/5062cb97-3e35-8e39-9e57-9c482c9bcd11.png)


### さいごに

ひとことでいうと、「ちゃんとしたTXTデータならQGISにドラッグ＆ドロップで見れますよ」という身も蓋もない話でした。QGIS上だと変換したデータと[Qgis2threejsプラグイン](https://qgis2threejs.readthedocs.io/ja/docs/Tutorial.html)を使えばヘッダの３D画像みたいなのも作れます。

また、業者さんの納品データもこれでさくっとQGISでチェックすることもできますし、今後は全国の行政組織担当さんの頑張りでデータもどんどん公開されるでしょう。

このようにだれでも簡単にレーザー計測データが扱え、人口や浸水地域といったデータなど組み合わせて色々と考えれたりするようになるということは、オープンデータ全体の流通促進にも貢献できるのではないでしょうか😃

## この記事のライセンス

[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/deed.ja)
この記事は[CC BY 4.0（クリエイティブ・コモンズ 表示 4.0 国際 ライセンス）](http://creativecommons.org/licenses/by/4.0/deed.ja)の元で公開します、どうぞどうぞ。