HANA CloudのGeoSpatialデータをPythonを使って地図に投影する

HANA DatabaseでGeoSpatialデータ(以後、地理空間データと記載します。)を取り扱うことができることは、このSAP Communityの様々なブログポストで紹介されています。それらの機能は、SAP HANA Cloud、さらにはHANA Cloudを内部で使用しているSAP Analytics Cloudや、SAP Data Warehouse Cloudにも受け継がれており、データの分析や可視化をする際のアドバンテージになっています。

今回、HANA Cloudに格納した地理空間データを、ローカルPC上にインストールしたPython環境上で地図上に投影させてみました。このブログポストでは、その方法を通じてHANA Cloudにおける地理空間データの取り扱い方法の一端をご紹介したいと思います。

%u938C%u5009%u5E02%u306E%u7A7A%u9593%u30C7%u30FC%u30BF%u3092JupyterNotebook%u306B%u6295%u5F71

鎌倉市のポリゴンデータをJupyterNotebookに投影

今回は、以下の環境を使って作業を行いました。

  • SAP HANA Cloud (Trial)
    SAP HANA Cloud Trialは、SAP HANAを無料で試供できるサービスです。気軽にSAP HANA Cloudを触ってみることが可能です。
  • Visual Studio Code
    Pythonの統合開発環境として。今回はVisual Studio Code内でJupyterNotebookを使いました。
  • Python 3.8
  • 以下のPythonモジュールを使っています。
    • hdbcli
      HANAへ接続し、SQLを操作、データ取得をするためのモジュールです。
    • ipyleaflet
      Python上で地図、地理空間データを表示させるモジュールです。

仮に、施設の緯度、経度といったデータをすでに持っていれば、HANA Cloud上にテーブルを作成して、データを格納した後、緯度、経度の列からST_pointという地理空間のデータ型の列を追加、生成することができます。

ST‗Pointのような”点”のデータ型であれば、自身で簡単に作成することができますが、道路、河川といった”線形”のデータ型のST_LineStringや、市区町村や施設などの”空間”を表すために用いるデータ型のST_Polygonを一から作るのは容易ではありません。そのような場合、予め作成された地理空間データを使用することを検討します。

HANA Cloudには、ESRI Shapefile形式のファイルのインポート機能が提供されており、目的に適う空間情報をもつESRI Shapefileがあれば、そのファイルをHANA Cloudへインポートをするだけで、必要な地理空間データをもつテーブルを作成することができます。

Import%20ESRI%20Shapefiles

Import ESRI Shapefiles

一点注意が必要なことは、HANA Cloudで対応しているESRI Shapefileの文字エンコードには制限があるということです。
日本語のESRI Shapefileの多くはShift-JIS形式で記述されており、これらのファイルを直接HANA Cloudへインポートをしようとしても、エラーとなってしまいます。Shift-JISで作成された地理空間データを用いたい場合、別途ツールを使用してファイル内の文字コードを変換するなどの工夫が必要になります。

HANAで地理空間データをSQLで使用する際に重要なことは、上記でも触れたデータ型と、それに付随するメソッドの取り扱いです。

地理空間データのデータ型は、取り扱うデータによってST_Point、ST_LineString、ST_Polygon、など複数存在しており、それぞれのデータ型に備えられたメソッドを呼び出すことで地理空間データの様々な情報を取り出したり、加工したりすることができます。
例えば、ST_polygonのメソッドには、ST_Area()というものがあり、これは対象のポリゴンデータから、その面積を算出します。また。同じST_polygonのメソッドとして、ST_ExteriorRing()というメソッドが存在します。こちらは、ポリゴンの外周をST_LineStringのデータ型として返すことができ、さらにそのST_LineStringのメソッドを用いて外周の長さを計算するといったことが可能となります。
%u30E1%u30BD%u30C3%u30C9%u3092%u7528%u3044%u308B%u3053%u3068%u3067%u4E00%u3064%u30C7%u30FC%u30BF%u304B%u3089%u7570%u306A%u308B%u306A%u69D8%u5F0F%u3092%u53D6%u308A%u51FA%u305B%u307E%u3059%u3002

メソッドを用いることで一つデータから異なる様式のデータを取り出せる

地理空間データのデータ型は階層構造をなしており、下位のデータ型(サブタイプ)は、上位のデータ型(スーパータイプ)を継承します。サブタイプはスーパータイプのメソッドを引き継いで使用できます。またサブタイプのデータ型は自動的にスーパータイプのデータ型に変換することが可能です。これらの階層構造と継承の関係性を理解しておくことも大切です。

Spatial%20type%20hierarchy

Spatial type hierarchy

種々のメソッドを用いて必要なデータを取得した次は、Pyhton上でipyleafletの各レイヤーが必要とする形にデータを加工します。hdbcliから得られる結果行は、Python上では”pyhdbcli.ResultRow”というタイプになっているので、string形に直すといった調整が必要です。

%u4E00%u898Bstring%u578B%u306B%u898B%u3048%u308B%u304C%u3001Resultrow%u3068%u3044%u3046%u30C7%u30FC%u30BF%u30BF%u30A4%u30D7%u3067%u5024%u3092%u53D6%u5F97%u3057%u3066%u3044%u308B

一見stringの様だが、Resultrowというデータタイプで値を取得している

取得したデータを正しくipyleafletのレイヤー(地図上に投影するオブジェクト)に渡すことができれば、HANA上の地理空間データをPython上に表示させることができます。ipyleafletには様々なレイヤーがあり、それらが必要とするAttribute(レイヤーに渡す値)も異なります。レイヤーを使うことで、あるポイントをポップアップで示したり、地図上に線を引いたり、ヒートマップ、コロプレスマップのような多彩な表現を作り出すことができます。レイヤーの詳細はサンプルコード付きで、ipyleafletのリファレンスに掲載があるので、そちらを参照下さい。%u8907%u6570%u306E%u62E0%u70B9%u3092%u30DD%u30C3%u30D7%u30A2%u30C3%u30D7%u8868%u793A%u3055%u305B%u3001%u7279%u5B9A%u62E0%u70B9%u3068%u306E%u76F4%u7DDA%u3092%u5F15%u304F

複数の拠点をポップアップ表示させ、特定拠点との間に線を引いた地図

SAP HANA Cloudにおける地理空間データの取り扱いについて、簡単なデータを用いて、かいつまんでご紹介しましたが、いかがでしたでしょうか。

データの可視化というとグラフを思い浮かべがちですが、地図上にデータを描写させることで、可視化の方法を広げることができます。グラフだけでは気づかない新たなインサイトを得られたり、より分かり易い、印象的な見せ方をすることができるでしょう。
データ可視化における地理空間データの利用に興味を持っていただけると幸いです。

最後までお読みいただきありがとうございます。