LookerのCustom Map(map_layer)を試してみる#looker
はじめに
データアナリティクス事業本部のkobayashiです。
前職では社内SEの利点(?)として幅広い仕事をやらせていただいていた関係で、オープンソースのBIツールを色々試したり実際に導入してBIツールを使って社内で蓄積されたデータを分析していましたが、LookerやTableauといった有償のBIツールになるとなかなか導入障壁が高く使う機会がありませんでした。しかし最近、Lookerを自由に使える環境をいただきましたので色々使ってその内容を発信していこうと思います。
最初に何をしようかと考えていたところ、弊社の大高さんの書かれたLooker関連のブログで地図を扱った記事を見つけので自分もGIS関係にチャレンジしてみました。
今回の内容は上記の記事と比べ
- map_layerパラメータを使用しビルドインマップレイヤーから少し進んでカスタムマップを表示(領域の塗り分け)
- シェープファイルからデータをRegions Dataと地理情報データを分離して利用
といった点が異なります。
環境
- macOS Mojave
- Looker
- PostgreSQL 11.5
Custom Map
GSI関係で調べてみると組み込みマップレイヤー以外にカスタムマップという機能が使えるということなのでこちらを試してみます。
In Looker, we can define custom map regions to display geographical data in addition to the built-in map layers available. (公式サイトのヘルプセンターより引用)
以降は、基本的にここに記載されている内容に従って作業を進めます。
Custom Mapを表示してみる
データの準備
GIS関係のデータは現在では様々なオープンデータを手に入れられますが、今回は国土交通省の国土数値情報ダウンロードサービスから取得したいと思います。
このサイトには行政区域をはじめ日本の国土に関するGISデータが整備されており、GISを始めるにはとても良いデータが揃っています。 今回扱うデータは用途地域データを扱ってみたいと思います。
このサイトから東京都のデータをダウンロードしてきます。
データをLookerに入れる下準備
Lookerでカスタムマップを使うには
- データベースと紐付けるキーを持った地理情報データ(Region Data)
- 位置の属性情報のデータベース
が必要ですのでそれぞれ用意します。
Region Dataの作成
GISで扱うデータの多くはシェープファイル(shp)形式で、今回扱っている用途地域データもshpが含まれています。 LookerではRegionDataの形式としてtopojsonを指定されていますので変換が必要になりますが、 Creating Custom Map Regions – Looker Help Centerを読んでいくとtopojson形式への変換はConverting Shapefiles to TopoJSON – Looker Help Centerに示されています。 この中では無料のオンラインツールのMapshaper 5での変換方法が書かれていますが、GISでは大量のデータを扱うので毎回オンラインツールを使うのは大変なのでコマンドで実行します。
シェープファイルからtopojsonを作成
まず変換ツールをインストールします。
npm install -g shapefile topojson ndjson-cli
早速変換を行いますが、今回扱うデータの注意点として
- 文字コードがShift-jisである
- shpのプロパティに位置を識別するidが入っていない
があります。本来shpファイルの使い方として地理情報とその属性情報を併せ持って使うのでidのようなものは不要ですが今回は別々にして使うのでこのidを変換途中でgid
プロパティとして付加します。
shp2json --encoding "Shift-JIS" -n A29-11_13.shp | ndjson-map 'd.properties.gid = i,d' | geo2topo -n -q 1e6 > A29-11_13.topojson
これでLookerで読み込むtopojson形式のA29-11_13.topojson
ができます。
地理の属性情報のデータベースの作成
地理の属性情報のデータはシェープファイル内に含まれているのでシェープファイルから属性情報を作成します。 今回はLookerが接続するデータベースとしてはPostgreSQLを使います。PostgreSQLですと拡張モジュールのPostGISをインストールすることでジオメトリ型が使えるようになり地理情報を簡単に扱えるようになります。またシェープファイルを簡単に取り込めるようになり便利です。
シェープファイルからデータベースを作成
PostgreSQLと拡張モジュールのPostGISをインストールします。
brew install postgres postgis
あとはshp2pgsqlコマンドでシェープファイルをPostgreSQLに投入します。 ここでも文字コードに気をつけます。
shp2pgsql -W cp932 -s 4326 -d -g the_geom A29-11_13.shp A29-11_13 |psql -U postgres --password -p 5432 -h 127.0.0.1
Lookerでの作業
Region Dataのインポート
公式サイトのヘルプセンターのUpload Region Dataセクションにある通りに作成したtopojsonファイルをプロジェクトの画面にドラッグ&ドロップします。するとファイルがインポートされてファイルがプロジェクトに追加さます。
Modelの作成とMap Layerの登録
次に先程PostgreSQLに取り込んだ地理情報をLookerからSQLが実行できるようにしますが、PostgreSQLへの接続方法はすでに先人の方々が沢山書かれているので省略いたします。
まずはModelを作成します。プロジェクトのメニューからCreate Model
を選択し、適当な名前でModelを作成します。
Modelのテンプレートが作成されるので接続情報を書き換えます。
また今回の作業ではプロジェクト直下で作業しているので読み込むViewも以下のように変更します。
- include: "/views/*.view.lkml" + include: "/*.view.lkml"
Map Layerの作成
作成したModelに先程読み込んだRegion Dataを扱えるようにMap Layerを設定します。
map_layer: restricted_area_layer { file: "A29-11_13.topojson" format: topojson property_key: "gid" }
今はローカルのファイルを読み込む設定をしていますがurl
Parameterを使うことでOnlineのtopojsonを使用することもできます。
他のParameterは公式のmap layerに詳しく書かれているのでご確認ください。
地理の属性情報のデータベースのView作成
カスタムマップで見たいViewを作成するためにSQL Runner
を使ってクエリを作成します。
今回は用途地域データを見ているので特に複雑なクエリを書く必要がなく項目の絞り込みのみ行います。
SELECT gid,a29_002, a29_003, a29_004, a29_005, a29_006, a29_007, a29_008 FROM public."a29-11_13"
目的のクエリができたらAdd to Project
でプロジェクトに追加します。
Viewファイルがプロジェクトに作成されるのでMap Layer
用のDimension
dimension: restricted_area_gid { map_layer_name: restricted_area_layer label: "用途地域gid" sql: ${TABLE}.gid ;; }
をViewファイルに追記し、以下のようにします。
view: a29_11_13 { derived_table: { sql: SELECT gid,a29_002, a29_003, a29_004, a29_005, a29_006, a29_007, a29_008 FROM public."a29-11_13" ;; } dimension: restricted_area_gid { map_layer_name: restricted_area_layer label: "用途地域gid" sql: ${TABLE}.gid ;; } measure: count { type: count drill_fields: [detail*] } dimension: gid { type: string sql: ${TABLE}."gid" ;; } dimension: a29_002 { type: string sql: ${TABLE}."a29_002" ;; } ....(省略).... dimension: a29_008 { type: string sql: ${TABLE}."a29_008" ;; } set: detail { fields: [ gid, a29_002, a29_003, a29_004, a29_005, a29_006, a29_007, a29_008 ] } }
Viewファイルが完成したのでこれをModelで読み込む設定
explore: a29_11_13 {}
をModelファイルに追記します。 完成形のModelファイルは以下のようになります。
connection: "cm-kobayashi-postgres" include: "/*.view.lkml" # include all views in the views/ folder in this project explore: a29_11_13 {} map_layer: restricted_area_layer { file: "A29-11_13.topojson" format: topojson property_key: "gid" }
カスタムマップを確認
ここまでできたらExploreに作成したViewが出てきますので選択します。
Exploreが表示されましたら左から「用途地域gid」「A29 003(市区町村名)」「A29 003(市区町村名)」「A29 004(用途地域分類)」「A29 005(用途地域名)」を選択してRUN
を実行すると以下のようなマップが表示されます。
FILTER
を使用した目的の地図の表示
- 地図を拡大
- 住居地域
- 商業地域
Lookerを使っているためFILTER
を使った表示の変更も簡単に行なえます。
まとめ
Lookerのカスタムマップでシェープファイルで作成された地理情報を表示しました。 途中で多少の加工は必要ですが、それほど難なく地図上にデータを表示することができ目的の情報を見ることができました。 次回はデータの取得元をOnlineから取得する方法を試してみたいと思います。 また、クラスメソッドではやる気があれば色々な技術に触れさせてもらうことができます。
最後まで読んで頂いてありがとうございました。