NEWS
IBM i 技術解説 IBM i 技術解説
2026.04.14
SHARE
  • twitter
  • facebook
  • hatena
  • linkedin

地理空間分析 -実践編-:IBM iでの分析と地図可視化のはじめ方

地理空間分析 -実践編-:IBM iでの分析と地図可視化のはじめ方

前回の記事「地理空間分析入門:AI(Watson)によるIBM i 上のデータ活用の基礎」では、地理空間分析の基本的な考え方や、活用事例、主要なSQL関数(ST_POINT や ST_DISTANCE など)についてご紹介しました。
本記事では、その続編として「実践編」をお届けします。実際に手を動かしながら、SQLを使って地理空間分析を行い、その結果をどのように活用できるのかを見ていきます。

実行前提環境

地理空間分析のDb2 for iの前提要件は、

  • IBM i 7.5:Db2 for i グループPTF(SF99950)レベル3以上
  • IBM i 7.4:Db2 for i グループPTF(SF99704)レベル23以上
  • IBM i 7.6:標準で利用可能(追加PTF不要)

また、地理空間機能は Java によって提供される機能を使用するため、以下の条件が必要です。

  1. ジョブ CCSID を 65535 にすることはできません。
  2. PASE がインストールされ、動作する必要があります。
    CHKPRDOPT PRDID(5770SS1) OPTION(33) コマンドで、PASE がインストールされていることを確認するために使用できます。
  3. 地理空間関数は、JAVA 関数を介して実装され、常にデフォルトの活動化グループ、ACTGRP(*DFTACTGRP)で稼働します。

今回のシナリオ

一般に公開されているデータを使って、実際に地理空間分析を行ってみましょう。 本記事では、「IBMの事業所から1km以内にあるシェアサイクルポートを抽出する」というシナリオを扱います。
イメージとしては、地図上にIBMの事業所を中心に半径1kmの円を描き、その範囲内に存在するシェアサイクルポートを抽出する分析です。

実際の流れ

本実践は以下のステップで進めます。

  1. IBM事業所とシェアサイクルポートのテーブルを作成(経度・緯度を持つ地理空間列 QSYS2.ST_POINT 型を定義)
  2. 各テーブルにデータを登録
  3. ST_DISTANCE 関数で 1km 以内のポートを抽出
  4. 結果を地図上に可視化( DBeaver を使用)

なお、本分析ではプログラムの作成は不要です。ACS上でSQLコマンドを実行するだけで、簡単に実施できます。SQLコマンドの実行方法は記事「地理空間分析入門:AI(Watson)によるIBM i 上のデータ活用の基礎」の「Tips:SQL文の実行方法とSQLサンプル」という章をご参考ください。

IBM事業所データの準備

1.1 IBMの事業所情報を格納するテーブルの作成

まずは、GEODATA.OFFICEというテーブルを作成し、IBM事業所の住所情報とあわせて、位置情報(経度・緯度)を格納できるようにします。
本例では、事前に作成した GEODATA ライブラリー(スキーマ) 内にテーブルを作成します。GEODATA はスキーマを表し、その中にテーブルを配置する構成になります。LOCATION カラムには QSYS2.ST_POINT 型を指定することで、経度・緯度の情報をそのまま格納できるようになります。
SQLを実行すると、事業所情報を格納するテーブルが作成されます。

CREATE TABLE GEODATA.OFFICE  (
    OFFICE_ID INT,               -- 事業所ID
    OFFICEJ VARCHAR(30),         -- 事業所名(日本語)
    ADDRESS VARCHAR(255),        -- 住所
    LOCATION QSYS2.ST_POINT      -- 位置情報 (ST_POINT型)
);

1.2 IBM事業所データの登録

次に、実際の事業所データを登録します。
今回は、IBMの公開情報をもとに、以下の事業所データを登録します。

  • 本社
  • 箱崎
  • 五反田
  • 府中
  • 丸の内永楽

それぞれについて、事業所名・住所・位置情報(経度・緯度)をSQLで挿入します。
SQLを実行すると、これらの事業所データがテーブルに格納されます。

INSERT INTO GEODATA.OFFICE (OFFICE_ID, OFFICEJ, ADDRESS, LOCATION) VALUES
    (10, '本社', '東京都港区虎ノ門二丁目6番1号 虎ノ門ヒルズ ステーションタワー',
     QSYS2.ST_POINT(139.749461, 35.669758));
INSERT INTO GEODATA.OFFICE (OFFICE_ID, OFFICEJ, ADDRESS, LOCATION) VALUES
    (20, '箱崎', '東京都中央区日本橋箱崎町19番21号 MSH 日本橋箱崎ビル',
     QSYS2.ST_POINT(139.785002, 35.680504));
INSERT INTO GEODATA.OFFICE (OFFICE_ID, OFFICEJ, ADDRESS, LOCATION) VALUES
    (30, '五反田', '東京都品川区西五反田一丁目1番8号 NMF五反田駅前ビル',
     QSYS2.ST_POINT(139.723635, 35.626553));
INSERT INTO GEODATA.OFFICE (OFFICE_ID, OFFICEJ, ADDRESS, LOCATION) VALUES
    (40, '府中', '東京都府中市日鋼町一丁目1番地 ヒューリック府中タワー',
     QSYS2.ST_POINT(139.483835, 35.677454));
INSERT INTO GEODATA.OFFICE (OFFICE_ID, OFFICEJ, ADDRESS, LOCATION) VALUES
    (50, '丸の内永楽', '東京都千代田区丸の内一丁目4番1号 丸の内永楽ビルディング',
     QSYS2.ST_POINT(139.767180, 35.682131));

1.3 GEODATA.OFFICEデータの確認

続いて、登録したデータを確認します。
以下のようにSELECT文を実行することで、テーブルにデータが正しく登録されているかを確認できます。
また、ST_AsText 関数を利用することで、LOCATIONカラムに格納された地理空間データを、POINT(経度 緯度)という人が読める形式で表示できます。
これにより、経度・緯度の値が正しく登録されていることを確認できます。

SELECT OFFICE_ID, OFFICEJ, ADDRESS, QSYS2.ST_AsText(LOCATION) AS POINT 
FROM GEODATA.OFFICE;

1.4 必要な情報のみを表示

さらに、必要な情報に絞って表示することも可能です。
例えば、事業所ID・事業所名・座標のみを表示することで、分析に必要なデータだけをシンプルに確認できます。

SELECT OFFICE_ID, OFFICEJ, QSYS2.ST_AsText(LOCATION) AS POINT FROM GEODATA.OFFICE;

2. シェアサイクルポートデータの取得

2.1 バイクシェア関連情報のデータの表示

今回は、公共交通オープンデータセンターが提供しているデータを活用します。このサイトでは、鉄道・バス・フェリー・航空など、さまざまな公共交通に関するオープンデータが公開されています。その中から、ドコモ・バイクシェアの地理情報(東京エリア)を利用します。
該当ページを開くと、シェアサイクルポートの情報が、JSON形式のAPIデータとして提供されていることが確認できます。本記事では、その中からstation_information.json(ポートの位置情報)を利用します。
https://api-public.odpt.org/api/v4/gbfs/docomo-cycle-tokyo/station_information.json

このJSONデータには、

  • ポート名(NAME)
  • 経度(X)
  • 緯度(Y)

といった地理空間分析に必要な情報が含まれています(「プリティプリント」にチェックを入れると、データがより見やすく整形されます)。

データを挿入する前に、まずはAPIから、JSONとして取ってデータを表示させて見てみます。
このデータを取得するために、IBM i の機能であるSYSTOOLS.HTTPGETCLOBを使用します。この関数を利用することで、インターネット上のJSONデータをSQLから直接取得することができます。
ACSのSQLスクリプト画面にコマンドを入力し、実行すると、APIから取得したデータがそのまま表示されます。

SELECT * FROM JSON_TABLE(
SYSTOOLS.HTTPGETCLOB(
        'https://api-public.odpt.org/api/v4/gbfs/docomo-cycle-tokyo/station_information.json',null),
    '$.data.stations[*]'
    COLUMNS(
        NAME VARGRAPHIC(100) CCSID 1200 PATH '$.name',
        STATION_ID CHAR(8) PATH '$.station_id',
        x DOUBLE PATH '$.lon',
        y DOUBLE PATH '$.lat'
    )
) AS x; 

取得結果を見ると、

  • NAME:シェアサイクルポート名
  • X:経度
  • Y:緯度

といった情報が含まれていることが確認できます。この段階では、あくまでデータを「表示」しているだけです。

2.2 GEODATA.CYCLEの作成

次に、シェアサイクルポートの情報を格納するテーブルGEODATA.CYCLEを作成します。

CREATE TABLE GEODATA.CYCLE (
    NAME VARGRAPHIC(100) CCSID 1200, 
    STATION_ID CHAR(8), 
    X DOUBLE, 
    Y DOUBLE
);

2.3 バイクシェアデータの挿入

INSERT文で、GEODATA.CYCLE にバイクシェアデータを挿入します。

INSERT INTO GEODATA.CYCLE 
SELECT * FROM JSON_TABLE(
SYSTOOLS.HTTPGETCLOB(
        'https://api-public.odpt.org/api/v4/gbfs/docomo-cycle-tokyo/station_information.json',null),
    '$.data.stations[*]'
    COLUMNS(
        NAME VARGRAPHIC(100) CCSID 1200 PATH '$.name',
        STATION_ID CHAR(8) PATH '$.station_id',
        x DOUBLE PATH '$.lon',
        y DOUBLE PATH '$.lat'
    )
) AS x; 

2.4 座標データを地理空間データに変換

次に、シェアサイクルポートのデータに位置情報を付与します。
まず、CYCLE テーブルに LOCATION 列を追加します。この列のデータ型には QSYS2.ST_POINTを指定し、地理空間データを格納できるようにします。

ALTER TABLE GEODATA.CYCLE  
ADD COLUMN LOCATION QSYS2.ST_POINT;

続いて、各レコードに対してST_POINT(X, Y)を使い、経度・緯度の値から位置情報を生成して LOCATION 列にセットします。
こうすることで、これまで数値データとして保持していた X と Y を、地理空間分析で利用できる座標データに変換できます。

UPDATE GEODATA.CYCLE  
SET LOCATION = QSYS2.ST_POINT(X, Y);

2.5 変換後データの確認

次に、座標が正しくセットされているかを確認します。
ここではST_AsText関数を使って、LOCATION 列の内容を人が読める形式に変換して表示します。実行結果は、POINT(経度 緯度) の形式で確認できます。
これにより、もともとは単なる数値データだった X と Y が、地理空間データとして正しく登録されていることが分かります。
この変換が完了すると、シェアサイクルポートのデータを IBM i 上で地理空間分析に利用できる状態になります。

SELECT NAME, QSYS2.ST_AsText(LOCATION) AS POINT 
FROM GEODATA.CYCLE;

3. IBM事業所から1km以内のシェアサイクルポートを抽出

ここからは、これまで準備してきたデータを使って、実際に地理空間分析を行います。
IBM事業所テーブル GEODATA.OFFICEと、シェアサイクルポートテーブル GEODATA.CYCLE の LOCATION 列を用いて、事業所から各ポートまでの距離を計算します。

  • なお、SQL内では以下のようにエイリアス(別名)を付けています。
    ・o → GEODATA.OFFICE
    ・c → GEODATA.CYCLE
  • 距離の計算には、地理空間関数 ST_DISTANCE を使用します。この関数は2点間の距離をメートル単位で返すため、/ 1000 を行うことでキロメートル(km)に変換しています。
  • また、JOIN条件において、QSYS2.ST_DISTANCE(o.LOCATION, c.LOCATION) <= 1000と指定することで、事業所から1km以内に存在するシェアサイクルポートのみ を抽出しています。
  • さらに、ORDER BY o.OFFICE_ID, DISTANCE_KM を指定することで、事業所ごとに近い順で結果を並べています。

このクエリを実行することで、どの事業所の周辺に、どのシェアサイクルポートが存在するのかを一覧で確認できます。
今回の例では、本社、箱崎、五反田、丸の内永楽といった各事業所の周辺に、複数のシェアサイクルポートが存在していることが分かります。
このように、地理空間データを活用することで、「ある地点の周辺に存在する施設を抽出する」といった分析を、SQLだけでシンプルに実現することが可能です。

SELECT 
    o.OFFICE_ID, 
    o.OFFICEJ, 
    o.ADDRESS, 
    c.STATION_ID, 
    c.NAME AS BIKE_PORT, 
    QSYS2.ST_DISTANCE(o.LOCATION, c.LOCATION) / 1000 AS DISTANCE_KM
FROM GEODATA.OFFICE o
JOIN GEODATA.CYCLE c 
ON QSYS2.ST_DISTANCE(o.LOCATION, c.LOCATION) <= 1000  -- 1km以内
ORDER BY o.OFFICE_ID, DISTANCE_KM;

4. 分析結果を地図上に可視化する

最後に、取得した地理空間データを地図上に可視化してみます。
これまでの手順で、IBM i 上にはシェアサイクルポートの位置情報(経度・緯度)が地理空間データとして格納されています。このデータを地図上に表示することで、分布や位置関係を視覚的に把握することができます。
IBM i 自体には地図表示機能は含まれていないため、今回はオープンソースのデータベースツールであるDBeaverを利用します。

※ DBeaver について
DBeaver は、Apache License 2.0 に基づくフリーライセンスのツールで、無償で利用できるデータベースクライアントです。Windows、macOS、Linux に対応しており、IBM i(Db2 for i)を含む多くのデータベースに接続することができます。また、取得したデータを地図と連携して表示する機能も備えており、地理空間データの可視化に適したツールの一つです。
2026年3月時点では、最新バージョンは DBeaver Community 26.0.1 となっており、以下の公式サイトからダウンロードできます。
https://dbeaver.io/download/

DBeaver から IBM i のデータベースに接続します。
DBeaver から IBM i に接続する際は、データベースの種類として 「Db2 for IBM i」 を選択します。
また、ホスト、ユーザー名、パスワードを入力し、接続時にはスキーマ(本記事では GEODATA)を指定することで、作成したテーブルやデータにアクセスできるようになります。

DBeaverで、IBM iのデータベースを選択し、接続後、SQLコンソールを開きます。

右側のConsole画面で、全てのシェアサイクルポートの位置情報を取得します。

SELECT 
  NAME, 
  CAST(ST_AsText("LOCATION") AS VARCHAR(100)) AS LOC
FROM GEODATA.CYCLE;

次に、実行結果がConsole の下にでてきます。結果の[LOC]列を右クリックして、[view/format]→[Set”LOC”transform]→[Geometry]の順に選択して、これで、LOC 列が地理空間データとして扱われるようになります。

下記のように表示されるので[OK]を選択します。

設定後、LOC 列のデータを全て選択し、「Spatial」ビューを開くことで、データを地図上にプロットできます。

その結果、シェアサイクルポートの位置が、数値データから地図上に点として表示されます。

距離条件の結果も可視化

さらに、先ほど作成した「事業所から1km以内のポート抽出」の結果も、同様に地図上で確認できます。

SELECT
  CYCLE.NAME AS BIKE_PORT,
  CAST(ST_AsText(CYCLE.LOCATION) AS VARCHAR(50)) AS LOC,
  OFFICE.OFFICEJ AS IBM_BRANCH,
  CAST(ST_AsText(OFFICE.LOCATION) AS VARCHAR(50)) AS IBM_LOC
FROM GEODATA.CYCLE CYCLE
CROSS JOIN GEODATA.OFFICE OFFICE
WHERE QSYS2.ST_DISTANCE(OFFICE.LOCATION, CYCLE.LOCATION) / 1000 <= 1;

この結果を地図上に表示すると、シェアサイクルポート(青い点) といった形で、位置関係を直感的に把握できます。

おわりに

IBM i の地理空間機能を活用することで、これまで難しく感じられていた位置情報の分析も、日常的なSQLの延長として扱えるようになります。
ぜひ本記事を参考に、既存のデータから地理空間分析を取り入れ、データに基づいた意思決定や新たな価値創出に活かしてみてください。

筆者

日本アイ・ビー・エム株式会社
IBM Power Technical Sales 李 馥岑

Qiitaアカウント:@fu_desu

いいねと思ったらシェア
twitter
facebook
hatena
linkedin
関連記事
IBM i Apache-FOPによるPDF作成|第3回|サンプル・プログラムの概要と配置および実行方法
IBM i Apache-FOPによるPDF作成|第3回|サンプル・プログラムの概要と配置および実行方法
IBM i Apache-FOPによるPDF作成 | 第2回 | PASE環境へのApache-FOPインストールと実行するための設定
IBM i Apache-FOPによるPDF作成 | 第2回 | PASE環境へのApache-FOPインストールと実行するための設定
IBM i Apache-FOPによるPDF作成 | 第1回 | 概要
IBM i Apache-FOPによるPDF作成 | 第1回 | 概要
あなたにオススメの連載
Db2 for i & SQL活用 虎の巻
15記事
Db2 for i & SQL活用 虎の巻
IBM i の”新”必須言語 〜FFRPG入門〜
0記事
IBM i の”新”必須言語 〜FFRPG入門〜
できるIBM i 温故知新編
9記事
できるIBM i 温故知新編