概要
あるCognosのプロジェクトで、店舗ごとに持っている「緯度」「経度」の情報を利用して、特定の基準となる「店舗」と、そこからの「距離」を入力して、近隣の他の店舗の情報を出力したい、という要件があり、その検証を行った時の情報です。
地図上で絞込み、みたいな派手な見た目では無いですが、「緯度」「経度」をもっているデータから「距離」を扱う時の事例として参考にして頂ければと思います。
レポート実行イメージ
検証時の画面なので、味も素っ気も無いですが、動きだけ見て下さい。
レポートを実行すると、基準となる店舗の店舗コードを求められます。
1000という番号の店舗、例えば東京駅に店舗があったとして、入力します。
次に、基準となる店舗からの距離を入力します。
「10」は10kmの意味で、東京駅から10km範囲の店舗の表示にしたいという入力です。
これも味も素っ気も無い実行結果ですが、リストが上下に2つ配置されていて、上の1行のリストは基準店舗の情報、下のリストが基準店舗から10km範囲の店舗の一覧です。
BRANCH_CODEの紐付けはご紹介できませんが、東京の店舗が表示されています。
上のリスト(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の大阪駅に変更したとすると、それに伴う大阪の店舗が表示されます。
実装方法
大した実装ではないですが、以下のようなクエリー3個で実装しています。
KIJUNクエリーは、基準店舗のリスト用のクエリ、DISTANCEクエリーは他の近隣店舗のリスト用のクエリ、その2つのクエリーの前提となるRADIANクエリーは図の様に直接SQLを記載していて、これは距離計算のためにRadianへの変換を行いたいためです。
この例では、レポートの中でSQLを直接記載していますが、Framework Manager上でSQL記載でも可能と思います。
DISTANCEクエリーの中身です。
基準となる店舗の情報も欲しいので、[KIJUN]のアイテムを直接記載して取得しているIDO_RADIAN_KIJUN、KEIDO_RADIAN_KIJUNもあり、DISTANCEクエリーのプロパティで、「製品を超えた結合を許可」をしています。
さて、肝となるDISTANCEアイテムですが、こんな風な記載にしています。
_round()を使用しているのは、これを使用しないと計算に取り扱う桁数が増えすぎてエラーになるためですが、、10桁が適当かは考えてないので調整下さい。
一般的に緯度・経度から距離を計算する話は、こちらを参照しました。
地球を真球と見立てて、球面の距離を計算するロジックです。
http://qiita.com/yuba/items/4372944ce0f6a0bf6cb5
ご参考になれば幸いです。