MapDにDEMデータを入れて可視化してみた
MapDとは
GPUを利用できるオープンソースデータベースです。
https://www.mapd.com/
大量のデータを分析のための高速な可視化。機械学習などに有効です。
DEM: Digital Elevation Modelとは
数値標高モデルのことです。
地表の高さのことであり、ビルや木の高さは含まれません。
(ビルの高さ等を含む場合は、DSM(Digital Surface Model)と呼ばれます。)
今回は国土地理院からダウンロードしてきました。
https://fgd.gsi.go.jp/download/menu.php
MapDによるDEMデータ可視化までの流れ
まずはデータのダウンロード
https://fgd.gsi.go.jp/download/menu.php
画面の見方
今見えている4桁の番号が振られている枠は第1次メッシュです。
(第1次メッシュは20万分の1地勢図の1図葉の区画を1単位区画としたもので、緯度差は40分、経度差は1度となっています。)
さらに拡大していくと第2次メッシュまで表示されます。
(第1次メッシュを緯線方向及び経線方向に8等分してできる区域で、2万5千分の1地形図の1図葉の区画に対応します。緯度差は5分、経度差は7分30秒)
第2次メッシュごとに持ってくるデータの範囲を選択できます。
検索条件の中に、レーザー測量と写真測量があります。
レーザー測量にはAのアルファベットが振られ、主に都市部を測量対象としています。
一方写真測量はBで、都市周辺を対象としています。
https://fgd.gsi.go.jp/otherdata/spec/DEMgaiyo.pdf
今回は大阪府全体のDEMデータをMapDで可視化してみたいと思います。
データの形式、タイトルの意味
ダウンロードは案内に従って実行してください。
ファイルは第2次メッシュごとにzip形式で入手できます。
解凍してやると、第3次メッシュ(第2次メッシュを緯線方向及び経線方向に10等分してできる区域)ごとにファイルにしてあります。
これはファイル名の一例です。
FG-GML-5135-32-33-DEM5B-20161001.xml
ファイル名は以下のような意味を持ちます。
FG-GML-pppp-qq-rr-DEM5X-yyyymmdd.xml
・pppp: 1次メッシュ番号
・qq: 2次メッシュ番号
・rr: 3次メッシュ番号
・DEM5A: 5m感覚でA: レーザー測量を用いたDEM (B:写真測量)
・yyyymmdd: 年月日
データを変換してやる
概要だけ書きますが、かなり苦戦しました。
要望があれば別ブログに書きます。
ファイルの中身
XMLファイルの先頭を少し載せておきます。(赤線は重要になる情報の一つ)
ファイルの中で重要となる要素は以下の要素です。
下記の情報を取り入れて、緯度経度の情報を持ったcsvファイルを生成します。
lowerCorner: 第3次メッシュの左下の座標に相当
upperCorner: 第3次メッシュの右上の座標に相当
low: データ点の始点(x, y)
high: データ点の終点(x, y)
tupleList: 標高データ
sequenceRule order=”+x-y”: データの並びのルール
startPoint: データの始点
csvファイル
以下のような形式で作成しました。
elevation, 156.22, 135.528388889, 34.866666667
elevation, 153.48, 135.528444444, 34.866666667
elevation, 152.14, 135.5285, 34.866666667
大事なのは地理に基づいたデータに、そのデータがどこの点なのか、
緯度(latitude)、経度(longitude)を並べて表示してあることです。
左から①名前②標高データ③経度④緯度のデータが入っています。
MapDにデータを入れる
テーブルを作る
以下のsqlファイルを作成しました。
create table DEM dem_type TEXT ENCODING DICT(8), # elevationが入る height float, # 標高が入る lon float, # 経度が入る lat float # 緯度が入る );
データ型の選び方に関しては公式ページのドキュメントを参考にして下さい。
https://www.mapd.com/docs/latest/mapd-core-guide/fixed-encoding/
カラムの順番は自作したcsvデータに依存して書いています。
このsqlをcreate_table_dem.sqlというファイル名で保存しておきます。
データをデータベースに入れる
MapDサーバーを起動
$ ./startmapd <option>
MapDにテーブルを作ります
$ mapdql -p(pass) < create_table_dem.sql
MapDのクライアントを起動
$ mapdql
テーブルの存在を確認
mapdql>\t
テーブルの詳細を確認
mapdql>\d DEM
テーブルが無事にできていたら、データベースにデータを入れます。
今回csvデータにヘッダーがないので以下のように書きます。
mapdql>copy DEM from ‘/Path/ファイル名’ with (header=’false’);
これでデータが入りました。確認します。
mapdql>SELECT * FROM DEM limit 5; dem_type|height|lon|lat elevation|4.230000|135.103561|34.251999 elevation|4.110000|135.104660|34.256279 elevation|4.630000|135.100494|34.254833 elevation|4.200000|135.103607|34.251999 elevation|4.710000|135.100555|34.254833
ちゃんと入ってますね。
MapD Immerseで可視化する
テーブル作成からチャートの作成まで
ログインできたら、右上の「New Dashboard」からダッシュボードを作成します。
次の画面では接続するデータベースのテーブルを選びます。
画面の左側に、MapDのテーブルの一覧が表示されるはずです。
接続するとまずAdd Chartのみ表示された画面に移動します。
Add ChartでChartを追加します。
上のような画面に移動します。
上の欄から形式をPOINT MAPに指定します。
この画面でまず、左の欄から経度(Lon)と緯度(lat)に相当するカラムを指定し、
Color のところにheightを入れてみます。
出来ました!
グラフを作成し、地図と連携する
次にデータをグラフ化します。棒グラフを作成します。
左上で幾つの棒グラフに分けるか決められます。
どこからどこまで(標高なら0m~1118mまで)のデータを使うかも決められます。
左下では、棒の長さに対して値を振ることを決めることができます
色の濃淡に対して標高を振ることも可能です。
そして棒グラフの中から特定の標高を選択して、
該当する標高だけを表示させることも可能です。
今平地以外の範囲(0m ~ 93.17m以外)を選択しました。
その結果が地図にも反映されています。
プロットした点にポップアップで情報を与える
ズームしてみると一つ一つが小さな点データです。
設定画面の右下にポップアップボックスがあるので、
掲載したい情報を決めることができます。
これで点データにカーソルを合わせるだけで、データの詳細が一緒に表示できるようになりました。
皆さんも利用してみてください。