前回の記事「地理空間分析入門: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 によって提供される機能を使用するため、以下の条件が必要です。
- ジョブ CCSID を 65535 にすることはできません。
- PASE がインストールされ、動作する必要があります。
CHKPRDOPT PRDID(5770SS1) OPTION(33) コマンドで、PASE がインストールされていることを確認するために使用できます。 - 地理空間関数は、JAVA 関数を介して実装され、常にデフォルトの活動化グループ、ACTGRP(*DFTACTGRP)で稼働します。
今回のシナリオ
一般に公開されているデータを使って、実際に地理空間分析を行ってみましょう。
本記事では、「IBMの事業所から1km以内にあるシェアサイクルポートを抽出する」というシナリオを扱います。
イメージとしては、地図上にIBMの事業所を中心に半径1kmの円を描き、その範囲内に存在するシェアサイクルポートを抽出する分析です。
実際の流れ
本実践は以下のステップで進めます。
- IBM事業所とシェアサイクルポートのテーブルを作成(経度・緯度を持つ地理空間列 QSYS2.ST_POINT 型を定義)
- 各テーブルにデータを登録
- ST_DISTANCE 関数で 1km 以内のポートを抽出
- 結果を地図上に可視化( 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 変換後データの確認
次に、座標が正しくセットされているかを確認します。
ここでは
これにより、もともとは単なる数値データだった 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の延長として扱えるようになります。
ぜひ本記事を参考に、既存のデータから地理空間分析を取り入れ、データに基づいた意思決定や新たな価値創出に活かしてみてください。
筆者
|
|
日本アイ・ビー・エム株式会社 Qiitaアカウント:@fu_desu |









