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以外)を選択しました。
その結果が地図にも反映されています。
 


 
 

プロットした点にポップアップで情報を与える

ズームしてみると一つ一つが小さな点データです。

設定画面の右下にポップアップボックスがあるので、
掲載したい情報を決めることができます。


 

これで点データにカーソルを合わせるだけで、データの詳細が一緒に表示できるようになりました。

皆さんも利用してみてください。