目次


Db2 Warehouse を利用した空間分析

Db2 Warehouse と Mapbox で位置情報を活用

Comments

IBM Db2 Warehouse は、インメモリー処理と、統合された超並列インデータベース分析が組み合わされた高性能の分析エンジンです。Db2 Warehouse では、表データ用に行ベースと列ベースのストレージ・オプションがあるほか、空間データを保管して管理することもできます。Db2 Warehouse のインデータベース分析機能には、R および Apache Spark を使用するオープン・ソースの分析、すぐに使用できる分析ストアード・プロシージャー、地理空間分析機能が含まれます。

空間データ (空間的特徴として保管されます) は、従来型のデータウェアハウス・データを補完し、位置認識型の分析を実行するのに役立ちます。地理的特徴は、現実の世界において識別可能な位置を持つものを示します。Db2 Warehouse で管理および分析できる地理的特徴の例は以下のとおりです。

  • 建物、河川、森、山などのオブジェクト
  • 危険な地域の周りの安全ゾーンなどのスペース
  • 自動車事故、店舗での販売取引など、特定の位置で発生するイベント

Db2 Warehouse は、ポイント、折れ線、ポリゴン (多角形)、複数ポイント、複数折れ線、複数ポリゴンなど複数の空間形状と、各種の形状固有のさまざまな空間分析関数をサポートします。

Db2 Warehouse で、空間オブジェクトは形状として保管されます。ST_Point は空間形状の 1 つのタイプで、人またはオブジェクトの位置 (経度、緯度) を表します (今回の場合、特定の時点における顧客の位置を表します)。以下のコード・リスティングでは、ST_Point の値のみを含む空間列が作成され、いくつかのポイントが挿入され、表に保管されているデータが選択されます。

CREATE TABLE customer_location (customer_id INT, geom db2gse.ST_Point) organize by row; 
insert into customer_location values(1, db2gse.ST_Point(37.475,-122.332,4326)); 
insert into customer_location values(2, db2gse.ST_Point(37.362,-122.305,4326)); 
insert into customer_location values(3, db2gse.ST_Point(37.601,-122.415,4326)); 
insert into customer_location values(4, db2gse.ST_Point(37.879,-122.546,4326)); 
insert into customer_location values(5, db2gse.ST_Point(37.226,-122.228,4326)); 
insert into customer_location values(6, db2gse.ST_Point(37.125,-121.975,4326)); 
insert into customer_location values(7, db2gse.ST_Point(38.217,-122.772,4326)); 
insert into customer_location values(8, db2gse.ST_Point(37.231,-121.558,4326)); 
insert into customer_location values(9, db2gse.ST_Point(37.038,-122.003,4326));

注: このコード・リスティングを手元のデータで使用する際には、null 値を除外するようにしてください。

空間データは、SQL で管理および照会できます。Mapbox では空間データを視覚的に調べ、対話できます。Mapbox は、地図、データ、および空間分析を利用して問題を解決する独自のアプリケーションを作成するためにさまざまな業界で利用できる開発者向けプラットフォームです。このチュートリアルでは、Mapbox API と Db2 Warehouse のオープンなインターフェースを組み合わせて使用し、Mapbox ベースの Web アプリケーションを使用して Db2 Warehouse の空間データを読み取り、表示する方法を説明します。

ソリューション・アーキテクチャーの概要

Mapbox は、HTTP/HTTPS データ・ソースからの geoJSON を空間データ・フォーマットとして使用し、形状を地図に表示できます。このチュートリアルでは、Db2 Warehouse の REST インターフェースとオープン・ソースの R の統合を組み合わせて、Db2 Warehouse の表から空間データを読み取り、空間形状のための geoJSON を生成し、Mapbox マップでポイントを表示します。

注: geoJSON の生成にはインデータベースの R を活用するため、こちらの説明に従って Db2 Warehouse に R をインストールしておく必要があります。

Spatial_Analytics_with_Db2_Warehouse.png
Spatial_Analytics_with_Db2_Warehouse.png

位置データを理解するためのアプリケーションを作成するために、Mapbox に登録します。また、作成したアプリケーションは Twitter #mapboxforBI で共有できます。

Db2 Warehouse から空間データを読み取り、geoJSON を生成するための R スクリプト

以下のコード・スニペットをローカルのファイル・システムに保存して、ファイルに getDb2SpatialData.R と名前を付けます。さらに、接続とスキーマの情報を調整します。その後、この R スクリプトは Db2 Warehouse にアップロードされ、Db2 Warehouse REST インターフェースを使用して実行されます。

# Load Db2 Warehouse R library/package
suppressMessages(library(ibmdbR))
# Connect to Db2 database
con <- idaConnect('BLUDB','','')
idaInit(con)

# Execute SELECT to retrieve spatial geometries from Db2 Warehouse table
spatialPointsData <- idaQuery('SELECT db2gse.st_Y( GEOM ) as long, db2gse.st_X( GEOM )
as lat FROM <YOUR_Db2_Warehouse_SCHEMA>.CUSTOMER_LOCATION')

# Loop through all available rows of data and generate geoJSON string
geoJSONStr<-""
for(i in 1:nrow(spatialPointsData)) {
geoJSONStr <-paste(geoJSONStr, '{ "type": "Feature", "geometry": {"type":"Point","coordinates":[',spatialPointsData[i,1], ',',spatialPointsData[i,2],']}, "properties": [] },')
}
coords<-substr(geoJSONStr[1],1,nchar(geoJSONStr[1]) - 1)
startStr<-'{"type": "FeatureCollection", "features": ['
endStr<-"}"
spatialPointsData<-paste(startStr, coords, endStr)

# Output geoJSON string for Mapbox and close database connection
print(spatialPointsData)
idaClose(con)

R スクリプトを Db2 Warehouse にアップロードするための CURL コマンド

REST インターフェースの POST を使用して、Db2 Warehouse に R スクリプトをアップロードできます。CURL コマンド (以下参照) を使用することも、HTTP POST を使用してプログラマチックに実行することもできます。

curl --user "Db2User:Db2Password" -H "Content-type: multipart/form-data" -F 
"data=@getDb2SpatialData.R" -X POST 
"https://Db2WarehouseURL_Or_IP:8443/dashdb-api/home" --insecure

注: この CURL コマンドでは証明書の検証を無効にするために、--insecure オプションを使用しています。有効な SSL 証明書を使用するセキュアなオプションを使用したい場合には、このオプションを削除してください。

Mapbox には、空間データを表示し、空間分析関数を実行するための広範な API があります。Mapbox を使用して Db2 Warehouse に保管されている空間データを表示するための大まかな手順は以下のとおりです。

  • Mapbox マップのためのプレースホルダー (DIV タグ) を含むシンプルな Web ページ (HTML フォーマット) を作成します。
  • Db2 Warehouse から geoJSON フォーマットで空間データを読み取るために、シンプルな JavaScript 関数 getDb2Points() を記述します。
  • Web ページで Mapbox を使用するために、Mapbox アクセス・トークンを取得します (getDb2Points() 関数内で置換する必要があります)。
  • Web ブラウザーを使用して Web ページを開きます。

Db2 Warehouse からの空間データを含む Mapbox マップが Web ページに表示されます。 以下のコード・リスティングは、Mapbox マップを表示する Web ページの HTML テンプレートです。

<html>
<head>
    <meta charset='utf-8' />
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.42.2/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.42.2/mapbox-gl.css' rel='stylesheet' />
    <style>
    body {
        margin: 0;
        padding: 0;
    }

    #map {
        position: absolute;
        top: 0;
        bottom: 0;
        width: 100%;
    }
    </style>
</head>

<body onload="JavaScript:getDb2Points();">
    <div id='map'></div>
</body>

</html>

Db2 Warehouse の R スクリプトを呼び出すための JavaScript 関数

以下の JavaScript 関数により、R スクリプトを実行するための REST POST 呼び出しが作成されます。この R スクリプトでは Db2 Warehouse から空間データが読み取られ、その空間データが geoJSON に変換され、geoJSON が Mapbox マップに表示されます。

var jsonResult='';
    var jsonResultObj='';
    var geoJSON='';
    var mapIcons = [
        "marker-15",
        "rocket-15",
        "bar-15"
    ];

    function escapeRegExp(str) {
        return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
    }

    function replaceAll(str, find, replace) {
        return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
    }

    function getDb2Points()
    {
    var req = new XMLHttpRequest();
    req.open("POST", "https://<Db2WarehouseURL_Or_IP>:8443/dashdb-api/rscript/getDb2SpatialData.R", true);
        req.setRequestHeader("Authorization", "Basic " +
btoa("<Db2User>:<Db2Password>"));
        req.send();
        req.onreadystatechange= function () {
          if(req.readyState === XMLHttpRequest.DONE && req.status === 200) {
        jsonResult=req.responseText;
        jsonResultObj=JSON.parse(jsonResult);
        geoJSON=jsonResultObj.result.rScriptOutput;
        geoJSON=replaceAll(geoJSON,'\\','');
        geoJSON=geoJSON.replace('\}"',']}');
        geoJSON=geoJSON.trim().substr(5,geoJSON.length-4);
        geoJSON=JSON.parse(geoJSON);
        showMap();
                                      }
        };
    }

    function showMap()
    {
        var randomIcon = mapIcons[Math.floor(Math.random()*mapIcons.length)];

        mapboxgl.accessToken = ‘<YOUR_MAPBOX_ACCESS_TOKEN>’;
        var map = new mapboxgl.Map({
            container: 'map',
            style: 'mapbox://styles/mapbox/streets-v10?optimize=true',
            center: [-122.546,37.879],
            zoom: 8
        });
        map.on('style.load', function() {
            // Add a symbol layer.

            map.addSource('data', {
                "type": "geojson",
                "data": geoJSON
            });

            map.addLayer({
                "id": "symbols",
                "type": "symbol",
                "source": "data",
                "layout": {
                    "icon-image": randomIcon,
                    "icon-size": 2
                }
            });

    // Center the map on the coordinates of any clicked symbol from the 'symbols' layer.
            map.on('click', 'symbols', function(e) {
                map.easeTo({ center: e.features[0].geometry.coordinates });
            });

    // Change the cursor to a pointer when it enters a feature in the 'symbols' layer.
            map.on('mouseenter', 'symbols', function() {
                map.getCanvas().style.cursor = 'pointer';
            });

    // Change it back to a pointer when it leaves.
            map.on('mouseleave', 'symbols', function() {
                map.getCanvas().style.cursor = '';
            });

        });
    }
</script>

Db2 Warehouse で管理されている顧客の位置情報を表示する Mapbox が含まれた Web ページ

結果として作成された Web ページは、Mapbox を使用して Db2 Warehouse に保管された顧客の位置情報を読み取り、その位置情報を表示します。

Spatial_Analytics_with_Db2_Warehouse_2.png
Spatial_Analytics_with_Db2_Warehouse_2.png

このチュートリアルでは、Db2 Warehouse に保管されている空間データを Mapbox で視覚化する方法を説明しました。この方法を使用して、レポートや企業ダッシュボードなどに空間情報を組み込むことができます。このチュートリアルは、Db2 Warehouse と Mapbox の統合を通じて実現できることのシンプルな例です。今後も Db2 Warehouse を利用した空間分析の価値と用途を説明するチュートリアルが追加される予定です。ご期待ください。

IBM Docker Store から、インデータベースの Apache Spark と空間分析を備えた Db2 Warehouse のパワーを体験してください。 https://hub.docker.com/_/ibm-db2-warehouse-dev

詳細については、当社のWebサイトをご覧ください。

この記事は米国時間2018年1月18日に発表された記事(英語) の抄訳です。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=ビジネス・アナリティクス, Information Management, Web development
ArticleID=1066437
ArticleTitle=Db2 Warehouse を利用した空間分析
publish-date=08092019