2025年9月12日金曜日

Great Circle routeをAPEXのマップ・リージョンに描画する

先日の記事「OpenFlights.orgの航路データからプロパティ・グラフを作成しSQL/PGQで問い合わせる」にて、日本から米国への直行便の航路がGraph Visualization Pluginで以下のように描画されました。


これでは困るので有識者に確認したところ、Graph Visualization PluginはGreat Circle - つまり球面 - の扱いになっていないので、最短距離の認識が正しくない場合はあるし、また、航路として球面上の最短距離が表示されるわけではない、とのことでした。

そういう用途ではOracle Spatialを使ってください、とのことです。

アドバイスに従って、出発する空港から到着する空港のGreat Circle routeを、APEXのマップ・リージョン上に描画してみました。

先日のAPEXアプリケーションでは国の間の直行便を表示していましたが、今回の用途では線が増えすぎるので、選択した空港間での直行便の航路を表示するようにAPEXアプリケーションを変更しました。

Graph Visualization Pluginでは以下の航路が表示されます。


最初にグラフ問合せの結果を素直にAPEXのマップ・リージョンに描画します。マップ・リージョンを作成し、ソースSQL問合せに以下を記述します。

以下の表示になり、太平洋上空は通りません。


APEXのマップ・リージョンが使用しているMapLibreの描画の仕組みに関係していますが、始点と終点の間に日付変更線があると、直線が描画されないようです。そのため、日付変更線をまたぐ場合は、負数の側に+360を加えるようにします。

結果として、航路が太平洋上を通るようになりました。


平面の地図では最短距離に見えますが、地球は球面なので実は最短距離ではありません。Great Circle route(大圏ルート)、つまり球面を考慮した最短距離を描画します。

以下のスクリプトを実行し、ファンクションINTERPOLATE_GREAT_CIRCLE_PUREおよびCREATE_GREAT_CIRCLE_LINESTRINGを作成します。ほとんどClaudeに書いてもらっていますが、日付変更線の扱いはどう指示を与えても実装できなかったので、その部分だけは修正しました。

マップ・リージョンのソースをCREATE_GREAT_CIRCLE_LINESTRINGを使うように変更します。


以下のように最短経路がマップ・リージョンに表示されます。


今回の記事は以上になります。

マップを追加したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/openflights-pg-airports-and-routes-with-map.zip

参考までにClaude Desktopでのチャット履歴を添付します。

最初は存在しないファンクションを提案してきましたが、MCPサーバーでデータベースに接続してからは、生成したファンクションの検証を行ってから回答するようになり、そのようなことは無くなりました。それから、ファンクションCREATE_GREAT_CIRCLE_LINESTRINGの作成までは順調で、日付変更線の対応から迷走しています。それはAIというより私の指示が問題を解決する方向に向いていなかったことが原因です。

MCPサーバーがOracle Databaseにつないでファンクションを作って検証までしますし、接続先はAPEXのワークスペース・スキーマなので作成されたファンクションをそのままAPEXアプリケーションで呼び出すこともできます。

すごく生産性が上がりますが、データベースには色々なオブジェクトが勝手に作られるので、作業を始める前の状態に簡単に切り戻しができるようなデータベースを使うのがお勧めです。

Oracle APEXのアプリケーション作成の参考になれば幸いです。