LoginSignup
2
0

More than 5 years have passed since last update.

Cognosで緯度・経度の情報から距離を計算してレポートで使用する

Posted at

概要

あるCognosのプロジェクトで、店舗ごとに持っている「緯度」「経度」の情報を利用して、特定の基準となる「店舗」と、そこからの「距離」を入力して、近隣の他の店舗の情報を出力したい、という要件があり、その検証を行った時の情報です。
地図上で絞込み、みたいな派手な見た目では無いですが、「緯度」「経度」をもっているデータから「距離」を扱う時の事例として参考にして頂ければと思います。

レポート実行イメージ

検証時の画面なので、味も素っ気も無いですが、動きだけ見て下さい。
レポートを実行すると、基準となる店舗の店舗コードを求められます。
1000という番号の店舗、例えば東京駅に店舗があったとして、入力します。
001.PNG

次に、基準となる店舗からの距離を入力します。
「10」は10kmの意味で、東京駅から10km範囲の店舗の表示にしたいという入力です。
002.PNG

これも味も素っ気も無い実行結果ですが、リストが上下に2つ配置されていて、上の1行のリストは基準店舗の情報、下のリストが基準店舗から10km範囲の店舗の一覧です。
BRANCH_CODEの紐付けはご紹介できませんが、東京の店舗が表示されています。
003.PNG
上のリスト(1行)は、基準店舗の情報
BRANCH_CODE : 店舗コード(元テーブルに存在)
IDO_DECIMAL : 緯度の数値表示(元テーブルに存在)
IDO_RADIAN : 緯度をラジアン表示 ->距離の計算に使用する
KEIDO_DECIMAL : 経度の数値表示(元テーブルに存在)
KEIDO_RADIAN : 経度をラジアン表示 ->距離の計算に使用する

下のリストは各店舗と基準店舗間の距離の表示結果
BRANCH_CODE : 店舗コード(元テーブルに存在)
IDO_DECIMAL : 緯度の数値表示(元テーブルに存在)
IDO_RADIAN : 緯度をラジアン表示 ->距離の計算に使用する
IDO_RADIAN_KIJUN : 基準店舗の緯度をラジアン表示 ->距離の計算に使用する
KEIDO_DECIMAL : 経度の数値表示(元テーブルに存在)
KEIDO_RADIAN : 経度をラジアン表示 ->距離の計算に使用する
KEIDO_RADIAN_KIJUN : 基準店舗の経度をラジアン表示 ->距離の計算に使用する
DISTANCE : 各店舗と基準店舗間の距離(km)

例えば、1000の東京駅ではなく、1001の大阪駅に変更したとすると、それに伴う大阪の店舗が表示されます。
004.PNG

実装方法

大した実装ではないですが、以下のようなクエリー3個で実装しています。
KIJUNクエリーは、基準店舗のリスト用のクエリ、DISTANCEクエリーは他の近隣店舗のリスト用のクエリ、その2つのクエリーの前提となるRADIANクエリーは図の様に直接SQLを記載していて、これは距離計算のためにRadianへの変換を行いたいためです。
この例では、レポートの中でSQLを直接記載していますが、Framework Manager上でSQL記載でも可能と思います。
005.PNG

DISTANCEクエリーの中身です。
基準となる店舗の情報も欲しいので、[KIJUN]のアイテムを直接記載して取得しているIDO_RADIAN_KIJUN、KEIDO_RADIAN_KIJUNもあり、DISTANCEクエリーのプロパティで、「製品を超えた結合を許可」をしています。
006.PNG

さて、肝となるDISTANCEアイテムですが、こんな風な記載にしています。
_round()を使用しているのは、これを使用しないと計算に取り扱う桁数が増えすぎてエラーになるためですが、、10桁が適当かは考えてないので調整下さい。
007.PNG

一般的に緯度・経度から距離を計算する話は、こちらを参照しました。
地球を真球と見立てて、球面の距離を計算するロジックです。
http://qiita.com/yuba/items/4372944ce0f6a0bf6cb5

ご参考になれば幸いです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0