LookerのCustom Map(map_layer)を試してみる#looker

2020.02.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部のkobayashiです。

前職では社内SEの利点(?)として幅広い仕事をやらせていただいていた関係で、オープンソースのBIツールを色々試したり実際に導入してBIツールを使って社内で蓄積されたデータを分析していましたが、LookerやTableauといった有償のBIツールになるとなかなか導入障壁が高く使う機会がありませんでした。しかし最近、Lookerを自由に使える環境をいただきましたので色々使ってその内容を発信していこうと思います。

最初に何をしようかと考えていたところ、弊社の大高さんの書かれたLooker関連のブログで地図を扱った記事を見つけので自分もGIS関係にチャレンジしてみました。

Looker初心者が地図データを表示してみた #looker

今回の内容は上記の記事と比べ

  • 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. (公式サイトのヘルプセンターより引用)

Creating Custom Map Regions – Looker Help Center

以降は、基本的にここに記載されている内容に従って作業を進めます。

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"
}

今はローカルのファイルを読み込む設定をしていますがurlParameterを使うことで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から取得する方法を試してみたいと思います。 また、クラスメソッドではやる気があれば色々な技術に触れさせてもらうことができます。

最後まで読んで頂いてありがとうございました。