地理空間分析
IBM i 7.4とIBM i 7.5のDb2 for iに2022年秋、Watson地理空間分析の機能が追加された。IBM iユーザーはSQLを使用して、Watson地理空間テクノロジーを無料で利用できる。
これにより地理的特徴に関する地理空間分析を生成・分析し、その情報のベースとなるデータを保管・管理できる。
地理空間分析の利用例
たとえば保険会社は地理空間分析により、竜巻や洪水が発生した場所の情報を活用し、特定の地域で保険商品を作成するかどうか、およびその保険料の価格設定方法などを決定する。
あるいは自治体が災害の被害を減らすための計画にも、地理空間分析が利用されている。避難所を開設する場所の選択や、過去の洪水や地震の影響範囲から避難経路を選択する方法などを決定するのに役立つ。
以下のサイトに多数の例が掲載されているので、参照してほしい。
「地理空間データとは何ですか」
https://www.ibm.com/jp-ja/topics/geospatial-data
地理空間データとは何を指すのか
地理空間データの基本は、場所を特定する座標点(経度、緯度)である。
実際には、以下の3つがデータ・タイプとして定義できる。これらを組み合わせることも可能である。
単一座標:点(経度、緯度)
経路を決める複数座標:線
境界を定義する座標:面
地理空間データは通常、これらの位置情報(地球上の座標)と属性情報(関連するオブジェクト、イベント、または現象の特性)を時間情報(位置と属性が存在する時間または寿命)と組み合わせる。
提供される場所は、静的(例:機器の場所、地震イベント、貧困状態にある子供たち)、または動的(例:移動中の車両または歩行者、感染症の蔓延)である場合がある。
地理空間分析の実際の利用例
実際の利用例を紹介しよう。図表1のシステムでは、荷物を配達しているトラックが顧客の10kmまで近づいた時に、顧客に通知したいと考えている。

このシステムを作るのに必要な情報は何だろうか。顧客とトラックの現時点の場所との間の距離がわかればいいはずだ。もしその距離が10km未満になった場合は、顧客にテキストメッセージを送信するようなプログラムも必要かもしれない(図表1では省略)。
図表1にあるように、Raspberry PiとGPS付きの車両を用意する。ここで車両の位置情報をIBM iのデータベースに取り込むような仕組みを作る必要がある。このRaspberry PiにはNode-REDというオープンソースで作成したアプリケーションを稼働し、GPSのデータをMQTT(Message Queuing Telemetry Transport)を通して、インターネットサーバー上に取り込む。
IBM i上でもNode-REDが稼働しており、随時、インターネット上のAPIを呼び出して、位置情報をJSONデータで受け取る。そしてこの車両の位置情報をデータベースに保管する(SQLのINSERTコマンドを使用)。
QSYS2.ST_POINT(LONGITUDE, LATITUDE)というのが、新しい地理空間データの列になる。ST_POINTは経度と緯度を使って、座標を点で定義している。トラックと顧客の場所の経度と緯度がわかれば、トラックと顧客の距離が算出できるので、10km未満に近づいた時にメッセージを送れるようになる。
Db2 for iの新しい列定義
Db2 for iの新しい機能を使って、以下のタイプでの列定義が可能になった。これは点(店など)、線(道路・水路・配管など)、面(多角形で囲まれた区域)などの用途に使用できる。
前述したように、基本的な地理空間データのタイプは以下の3つである。
単一座標:点
経路を決める複数座標:線
境界を定義する座標:面
それぞれは、以下のDb2 for iのタイプで定義可能である(図表2)。

Point(点):ST_Point、ST_MultiPoint
Line(線):ST_Linestring、ST_MultiLineString
Polygon(面):ST_Polygon、ST_MultiPolygon
Point、Line、Polygonが複数の場合は、ST_Multixxxxを使用する。Point、Line、Polygonのどれでも入れられるのが、ST_Geometryである。
Db2 for iでの新しい列定義の例
例1:点
場所を定義する単一の座標には、ST_Pointスカラー関数を使用する。
地球上のポイントは、経度(-180度から+180度)および緯度(-90度から+90度)で表示される。たとえば渋谷駅の経度緯度は、経度:139.701636 緯度:35.658034である。すなわち渋谷駅は、ST_POINT(139.711636, 35.658034)で表示できる。
例2:線
経路を定義する複数座標には、ST_Linestringスカラー関数を使用する。
ST_Linestring型は通常、道路、川、電線などの線形フィーチャの定義に使用される。たとえばブルックリン橋は、ST_LINESTRING (-73.9993 40.7081,-73.993740.7035)になる(図表3)。

例3:面
境界を定義する座標には、ST_Polygonスカラー関数を使用する。
ST_Polygonで地理空間の範囲のある土地の一区画、水域などのフィーチャを定義する。たとえばニューヨークのセントラルパークは、ST_POLYGON((-73.9580 40.8005,-73.9813 40.7681, -73.9731 40.7647,-73.9494 40.7967, -73.9580 40.8005))で定義できる(図表4)。

地理空間処理関数
地理空間処理関数を使用して、形状間の距離や、ある形状が別の形状に含まれるかを判別できる。SQLのWHERE句として使用可能である。下記のマニュアルに掲載されている50程度の関数が使用できる。
◎地理空間関数
https://www.ibm.com/docs/ja/i/7.5?topic=analytics-geospatial-functions
例1:距離
ジオメトリ―を比較する関数の1つである、ST_Distance関数を利用した例を紹介する。
IBM箱崎事業所から1km以内にあるユーザーのリストなどをSQLのWhere文を使用して取り出せる(前提として座標付きの顧客マスターが必要)。
日本IBM箱崎事業所(139.7869482 35.6783300)から距離1km以内のLOCATION(LOCATIONはST_Point属性の列)は、下記のWhere文で表示できる(図表5)。
WHERE ST_Distance(ST_Point(139.7869482, 35.6783300),LOCATION,’KILOMETER’)<= 1

例2:内部に含む
同様にジオメトリ―を比較する関数の1つである、ST_Within関数を利用した例を紹介する。
東京都中央区にあるユーザーのリストなどを、SQLのWhere文を使用して取り出せる(前提として座標付きの顧客マスターが必要)。中央区内のLOCATION(LOCATIONはST_Point属性の列、中央区の形状はSHAPEにあるとする列)は下記のWhere文で取り出せる(図表6)。
WHERE ST_Within(LOCATION,SHAPE)

地理空間処理のより詳しい解説が必要な場合は、ACSのSQLコマンドベースで、地理空間分析を使う方法を解説した簡単な動画が以下にあるので、参考にしてほしい。
◎ACS Part 17 Geospatial Analytics(英語)
https://www.youtube.com/watch?v=JvLeG9Jp-bU
JDBCで他サーバー上のDBへアクセスする機能
IBM iサーバー上で、各社やコミュニティが提供するJDBCドライバを使って、他サーバー上のデータベースにアクセスできる。ここではRPGプログラムから、JDBCを経由してデータベースにアクセスする方法を紹介する。
下記のURLに技術的な詳細情報が掲載されており、サンプルコードを無料でダウンロードできるリンクが含まれている。
◎Open Source Project
https://www.scottklement.com/jdbc/
他システムのデータベースへのアクセス
JDBCドライバは、純粋なJavaのType4 JDBCドライバを利用する。Type4 JDBCドライバは、Javaをサポートするどのプラットフォームでも稼働する。Javaクラスで、通常はJARファイルにパッケージ化されている。多くの場合、ドキュメントやライセンス契約などと一緒に、JARファイルをZIPまたはEXEファイル内に配置する。
たとえばDb2 for iのJDBCドライバは、jt400.jarになる。https://sourceforge.net/projects/jt400/にあるように、最新版はPTFでも提供される。
またIBM Db2であればdb2jcc.jar、MySQLならmysql-connector-java-x.x.xx.jarになる(x.x.xはバージョン)。SQL Serverなら、Microsoft製の専用ドライバを使用する(例: mssql-jdbc-11.2.0.jre8.jar)。Oracleなら、ojdbcxx.jarなどをOracleのサイトからダウンロードできる。
上記のサンプルコードではJDBCR4という、RPGからJDBCを呼び出すタスクを単純化するために作成したRPGサービスプログラムを使用している。このサービスプログラムを使用せずに、Javaメソッドを呼び出すこともできる。また、独自のプロトタイプを作成するJavaとRPGのデータ型の間で変換するルーチンを作成できる(図表7)。

JDBCで接続するRPGのコード
JDBCで接続するRPGのコード(他システムのデータベースへのアクセス)について、簡単に解説する(図表8)。

各社ドライバのダウンロード後に、接続したいJDBCドライバを識別するクラス名と接続文字列が必要となる。
代表的なデータベースについては、下記を使用する。javaクラス名:[com.mysql.jdbc.driver]の文字列は、データベースにより下記を用いる。
SQL Server:com.microsoft.sqlserver.jdbc.SQLServerDriver
Oracle:oracle.jdbc.OracleDriver
MySQL:com.mysql.cj.jdbc.Driver
Db2 for i:com.ibm.as400.access.AS400JDBCDriver
Other Db2:com.ibm.db2.jcc.DB2Driver
接続文字列:[com.mysql.jdbc.driver]の文字列は、データベースにより下記を用いる。
SQL Server:jdbc:sqlserver://myserver.example.com:1433
Oracle:jdbc:oracle:thin:@myserver.example.com:1521:myDataBase
MySQL:jdbc:mysql://myserver.example.com/myDataBase
Db2 for i:jdbc:as400://myserver.example.com
Other Db2:jdbc:db2://myserver.example.com:50000/myDataBase
RPGからSQL Serverへの接続手順例
ここでは、図表9にあるようなIBM iのRPGからJDBC接続により、Windows Server 2019上のSQL Serverデータベースへアクセスする手順を紹介する。

事前準備
・MS SQL Serverデータベース作成(TESTDB)
・表作成とサンプルデータの入力
①サンプルプログラムを展開
サンプルプログラムをJDBCLIB(ライブラリー)に展開する。図表10のコマンドで、JDBCR4のサービスの作成しておく。

②SQL Server用の最新JDBCドライバをダウンロード
たとえば下記のurlから、Microsoft JDBC Driver 11.2.0 for SQL Server(zip)をダウンロードする。
◎Microsoft SQL Server 用 JDBC Driver のダウンロード
https://docs.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver16
③解凍してJava8用の「mssql-jdbc-11.2.0.jre8.jar」を/JAVA/JDBCへアップロード
以下のように、環境変数(CLASSPATH)を設定する。
ADDENVVAR ENVVAR(CLASSPATH)
VALUE(‘/java/jdbc/mssql-jdbc-11.2.0.jre8.jar’)
④SQL Serverデータベースに接続
サンプルプログラムを図表11のように修正する。

これにより、プログラム内でデータの印刷や抽出が可能になる。

著者
澤田 英寿氏
日本アイ・ビー・エム株式会社
テクノロジー事業本部
IBM Power テクニカルセールス
[i Magazine 2025 Spring号掲載]