見出し画像

技術のうろこ DATAFLUCT aline. Vol.01 ー階層化と効率化ー

DATAFLUCT aline.では、環境負荷、インフラコスト増大といった都市課題の原因となるスプロール現象の進行度の可視化を行っています。

スプロール現象の進行度は、国ごとや、行政区・都市ごとに調査されることが一般的ですが、DATAFLUCT aline.では、日本全国を最小250m四方に分割し、そのグリッド毎にスプロール化の指標を算出することで、スプロール化が進行している場所の可視化と特定を試みています。

しかし、これほど細かいグリッドデータを仕様すると、必然的にデータ量が多くなるため、快適なサービス提供の障害となってしまいます。

今回は、どうやって人口・建造物・スプロール指標の膨大なグリッドデータをストレスなく地図上へ描画しているかについて解説していきます。

高速な描画を実現した技術

DATAFLUCT aline.では、バイナリベクトルタイルと呼ばれるデータ形式に変換することで、高速な描画を実現しています。

ベクトルタイルとは、地図を一定の大きさのグリッドに分割したものです。
各タイル毎にデータを分割し、現在表示されているタイルのデータのみ描画を行うことで、表示されないデータの処理に費やす時間をなくしています。

スクリーンショット 2020-03-13 4.31.53


また、各タイルをズームレベル毎に作成し、その大きさに応じてデータを間引いて格納すれば、広範囲を描画する際も、少ないデータ描画数で済ませることができます。

さらに格納するデータを、シリアライズ(バイナリ化)して保持することで、データの読み出しを高速化しています。

初めてでも簡単に地理情報を扱える

ここからは、具体的なデータ変換について記載します。データの変換には、OSGeo財団が提供しているGDALライブラリと、Mapbox社の提供するTippecanoeライブラリを、webでの表示にはmapbox-gl.jsライブラリを利用しています。

グリッドデータのベクトル化は、GDALの提供するgdal_polygonizeなどを用いて実施します

$ gdal_polygonize.py input.tif outpug.geojson -b 1 -f "GeoJSON"

ここで指定したGeoJSONは、JSONの記法に準拠して地理情報を保持するフォーマットです。 JSONを基としているため可読性が高く、初めてでも簡単に地理情報を扱いやすくなっています。

続いて先程作ったベクトルデータを、Tippecanoeを使ってベクトルタイルへ変換します。

$ tippecanoe -z7 -o output_1k.mbtiles input_1k.geojson 
$ tippecanoe -Z7 -z10 -o output_250.mbtiles input_250.geojson 
$ tile-join -o output.mbtiels output_1k.mbtiles output_250.mbtiles

ズームレベルが7までは、1km四方のグリッドデータを、7以降は250m四方のグリッドデータを表示するために、引数で各ベクトルタイルのズームレベルを指定しています。

最後のtile-joinにより、各ズームレベルのベクトルタイルデータを1つのベクトルタイルデータへ結合します。GeoJSONでは1GB近くあったデータが、シリアル化によって数10MB程度まで圧縮されており、非常に扱いやすくなりました。

ベクトルタイルデータも、mapbox-gl.jsライブラリで対応されているため、そのまま地図に重ね合わせて表示することができます。

今回はベクトル化も実施したことで、各グリッドの値ごとに高さを変えて3D表示ができるようになり、より直感的にスプロール化が深刻な地域を理解できるようになっているかと思います。

サービスはぜひこちらからご覧ください!