以下に、本願の開示する領域検索方法、領域検索プログラムおよび情報処理装置の実施例を図面に基づいて詳細に説明する。なお、実施例によりこの発明が限定されるものではない。
[領域検索サーバ]
図1は、実施例1に係る領域検索サーバの構成を示す機能ブロック図である。図1に示すように、領域検索サーバ1は、通信インタフェースと11と、記憶部12と、制御部13とを有する。
通信インタフェース11は、各端末装置との間で通信を確立して、各端末装置から領域検索要求を受信したり、各端末装置に領域検索応答を送信したりするインタフェースである。ここで、領域検索要求とは、端末装置の位置情報がいずれの領域に含まれるかを検索する要求である。位置情報は、例えば端末装置が存在する緯度、経度の情報であるが、空間内の範囲を示す情報であっても良い。そして、領域検索要求は、例えば端末装置の位置情報や端末装置が持つセンサーの識別IDを含む内容となる。領域検索応答とは、領域検索要求に対応する応答であり、検索結果を含む内容となる。なお、通信インタフェース11は、例えば、LANやインターネット等と接続するネットワークインタフェースカードや、無線アンテナを有する無線通信部等である。
記憶部12は、制御部13が実行するプログラム等を記憶するとともに、領域インデックスDB121と領域データDB122とを有する。なお、記憶部12は、例えば、RAM(Random Access Memory)、フラッシュメモリ(flash memory)等の半導体メモリ素子、または、ハードディスク、光ディスク等の記憶装置である。
領域インデックスDB121は、空間内に存在する大量の領域から条件に合った領域を高速に検索するための索引情報である。例えば、領域インデックスDB121は、どの領域がどこにあるのかを示したインデックスをRツリーで保持する。
ここで、領域インデックスDB121に記憶される情報の例を、図2を参照して説明する。図2は、領域インデックスDBに記憶される情報の例を示す図である。図2に示すように、領域インデックスDB121は、ルートノード、中間ノードおよび葉ノードのいずれかを示す領域データで形成されるRツリーを記憶する。ルートノードは、Rツリーに1つ存在する頂点の領域データである。また、葉ノードは、Rツリーの最底辺のノードであり、自らは子ノードを含まず、検索対象となる多次元の領域データを1つ以上持つ。それ以外の木の中間に存在するノードは、中間ノードであり、それぞれ子ノードを1つ以上持つ。
図2の例では、ルートノードがR1であり、R1の子ノード且つ中間ノードがR10、R11である。R1がR10、R11の矩形領域を全て含む矩形領域となっている。中間ノードR10の子ノードである葉ノードがR100、R101である。R10がR100、R101の矩形領域を全て含む矩形領域となっている。中間ノードR11の子ノードである葉ノードがR110、R111である。R11がR110、R111の矩形領域を全て含む矩形領域となっている。そして、葉ノードであるR100は、検索対象となる領域データ1、2、3を持っている。葉ノードであるR101は、検索対象となる領域データ4、5を持っている。葉ノードであるR110は、検索対象となる領域データ6、7を持っている。葉ノードであるR111は、検索対象となる領域データ8、9を持っている。なお、領域データ1〜9とは、例えば領域データを識別可能な領域ID(IDentification)としても良い。
領域インデックスDB121は、Rツリーの実体としてルート、中間、葉の各ノードの情報を記憶する。図3は、領域インデックスDBに記憶されるルートノードの情報の例を示す図である。図3に示すように、領域インデックスDB121は、ルートノードR1の情報として、「ノード種別、矩形領域、子ノードリスト」を記憶する。「ノード種別」は、ノードがルート、中間、葉のいずれかであるかを示す情報である。「矩形領域」は、子ノードの担当領域を全て含む最小外接矩形の情報である。最小外接矩形とは、子ノードの領域を全て含む最小の矩形領域をいう。「子ノードリスト」は、当該ノードの子ノードへのリンクポインタのリストである。
図3の例では、ルートノードR1は、x、yの2次元データを管理し、「x1=35.5、y1=139.0」が担当領域の最小点であり、「x2=35.9、y2=139.5」が担当領域の最大点であることを示す。すなわち、R1が担当する領域は、両点を頂点として各次元軸に直交した4直線で作られる領域である。また、R1は、子ノード「R10、R11」へのポインタのリストを記憶する。
図4は、領域インデックスDBに記憶される中間ノードの情報の例を示す図である。図4に示すように、領域インデックスDB121は、中間ノードの情報として、「ノード種別、矩形領域、子ノードリスト」を記憶する。ここで記憶される「ノード種別」、「矩形領域」、「子ノードリスト」は、図3と同様であるので詳細な説明は省略する。領域インデックスDB121は、R10、R11について、図4の情報を記憶する。
図4の場合、中間ノードR10は、x、yの2次元データを管理し、「x1=35.5、y1=139.2」が担当領域の最小点であり、「x2=35.7、y2=139.3」が担当領域の最大点であることを示す。すなわち、中間ノードR10が担当する領域は、両点を頂点として各次元軸に直交した4直線で作られる領域である。また、R10は、子ノード「R100、R101」へのポインタのリストを記憶する。
図5は、領域インデックスDBに記憶される葉ノードの情報の例を示す図である。図5に示すように、領域インデックスDB121は、葉ノードの情報として、「ノード種別、矩形領域、データリスト」を記憶する。ここで記憶される「ノード種別」、「矩形領域」は、図3と同様であるので詳細な説明は省略する。「データリスト」は、管理する多次元の領域データである。領域インデックスDB121は、R100、R101、R110、R111について、図5の情報を記憶する。
図5の場合、葉ノードR100は、x、yの2次元データを管理し、「x1=35.5、y1=139.2」が担当領域の最小点であり、「x2=35.6、y2=139.3」が担当領域の最大点であることを示す。すなわち、葉ノードR100が担当する領域は、両点を頂点として各次元軸に直交した4直線で作られる領域である。また、R100は、領域データ「D1、D2、D3、D4」へのポインタのリストを記憶する。領域データへのポインタの一例として、領域データを識別する領域IDが用いられる。各領域データの実体は、領域データDB122に格納されている。
図1に戻って、領域データDB122は、複数の領域データを管理するとともに、複数の領域データのそれぞれについて、領域データの領域と重複する他の領域の領域データを管理する。
ここで、領域データDB122のデータ構造の一例を、図6を参照して説明する。図6は、領域データDBのデータ構造の一例を示す図である。図6に示すように、領域データDB122は、領域ID122a毎に、データ名122b、領域情報122cおよび重複領域122dを対応付けて記憶する。領域ID122aは、領域データを一意に識別可能なIDを示す。データ名122bは、領域IDで示される領域データのデータ名を示す。領域情報122cは、領域IDで示される領域データの実体である具体的な範囲を示す。重複領域122dは、領域IDで示される領域データと重複する他の領域データの領域IDを示す。例えば、領域ID122aが「00001」である場合、データ名122bとして「A商店X店舗近辺」、領域情報122cとして「円領域:緯度35.491、経度139.650、半径100m」と記憶している。そして、領域ID122aが「00001」である場合の重複領域122dとして「00034」の領域IDを記憶している。
図1に戻って、制御部13は、リクエスト受付部131、レスポンス転送部132、ツリー検索部133、重複データ検索部134および重複領域設定部135を有する。制御部13は、例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)等の集積回路またはCPU(Central Processing Unit)やMPU(Micro Processing Unit)等の電子回路である。
リクエスト受付部131は、通信インタフェース11によって受信された検索リクエストを受け付ける。レスポンス転送部132は、検索リクエストに対応する領域検索応答を通信インタフェース11に転送する。
ツリー検索部133は、領域インデックスDB121を用いて、所定の位置情報を含む領域を検索する。例えば、ツリー検索部133は、リクエスト受付部131によって受け付けられた領域検索要求の中から位置情報を取り出す。そして、ツリー検索部133は、ルートノードから子ノードへトップダウンに辿り順番にノードを選択し、選択したノードの子ノードに、取り出した位置情報を含むものがあるか否かを、領域インデックスDB121を用いて判定する。一例として、ツリー検索部133は、領域インデックスDB121を用いて、選択したノードの子ノードリストを読み出し、さらに、読み出した子ノードリストに含まれるそれぞれの子ノードの矩形領域を読み出す。そして、ツリー検索部133は、読み出したそれぞれの子ノードの矩形領域に、取り出した位置情報を含むものがあるか否かを判定する。
また、ツリー検索部133は、取り出した位置情報を含む子ノードを選択候補ノードとして追加する。そして、ツリー検索部133は、選択候補ノードとして追加されたノードを1つずつ選択し、選択したノードが葉ノードであれば、葉ノードにある領域データの内、取り出した位置情報を含むものがあるか否かを、領域インデックスDB121を用いて判定する。一例として、ツリー検索部133は、領域インデックスDB121を用いて、葉ノードであるノードのデータリストを読み出し、読み出したデータリストに含まれる領域データへのポインタを取り出す。ここでは、領域データを領域IDとすると、ツリー検索部133は、領域データDB122に記憶された領域情報122cを用いて、領域IDに対応する領域情報122cに、取り出した位置情報を含むものがあるか否かを判定する。そして、ツリー検索部133は、領域IDに対応する領域情報122cに、取り出した位置情報を含むものが1つでもあれば、いずれか1つの領域情報122cの領域IDを検索結果に追加し、領域インデックスDB121を用いた検索を終了する。なお、ツリー検索部133は、位置情報を含む領域情報が複数ある場合には、重複領域の数が最も小さい領域情報を選択することが望ましい。これは、後述する重複データ検索部134が、さらに位置情報を含む領域を、選択した領域情報の重複領域から検索することとなるので、検索対象となる重複領域の数を減らすためである。
重複データ検索部134は、ツリー検索部133によって位置情報を含む領域情報を検索できた場合、領域データDB122に記憶された重複領域に基づいて、検索できた領域情報に対応する重複領域の中から位置情報を含む領域情報を検索する。例えば、重複データ検索部134は、ツリー検索部133によって追加された検索結果から領域IDを取り出す。そして、重複データ検索部134は、領域データDB122に記憶された重複領域122dに基づいて、取り出した領域IDの領域情報と重複する重複領域の領域IDを読み出す。そして、重複データ検索部134は、該当する重複領域の領域IDを1つずつ選択し、選択した領域IDの重複領域が位置情報を含むか否かを判定する。そして、重複データ検索部134は、位置情報を含む重複領域の領域IDを検索結果に追加する。
重複領域設定部135は、領域データDB122の重複領域を設定する。なお、重複領域設定部135は、領域インデックスDB121に新たな領域を追加する際に、その追加領域を領域データDB122に追加すると共に、その追加領域と重複する重複領域を設定するようにすれば良い。例えば、重複領域設定部135は、ルートノードから子ノードに向かって順番にノードを選択し、選択したノードの子ノードに、追加領域を含むものがあるか否かを、領域インデックスDB121を用いて判定する。一例として、重複領域設定部135は、領域インデックスDB121を用いて、選択したノードの子ノードリストを読み出し、さらに、読み出した子ノードリストに含まれるそれぞれの子ノードの矩形領域を読み出す。そして、重複領域設定部135は、読み出したそれぞれの子ノードの矩形領域に追加領域を含むものがあるか否かを判定する。
また、重複領域設定部135は、追加領域を含む子ノードを選択候補ノードとして追加する。そして、重複領域設定部135は、選択候補ノードとして追加されたノードを1つずつ選択し、選択したノードが葉ノードであれば、葉ノードにある領域データの内、追加領域と重複する部分がある領域データを重複領域として選択する。そして、重複領域設定部135は、重複領域として選択した領域データを、領域データDB122の追加領域に対応する重複領域122dに追加する。さらに、重複領域設定部135は、追加領域を、重複領域として選択した領域データに対応する重複領域122dに追加する。
[領域検索要求のデータの一例]
次に、リクエスト受付部131が通信インタフェース11を介して受け付ける領域検索要求の内容について、図7を参照して説明する。図7は、領域検索要求の内容の一例を示す図である。図7に示すように、領域検索要求には、センサーを識別するセンサーIDと、緯度および経度とを含む。緯度および経度は、位置情報の一例である。図7の例では、センサーIDとして「Sensor000X」、緯度として「35.4134」、経度として「139.6252」と設定している。なお、領域検索要求には、センサーIDを含むものとしたが、これに限定されず、領域検索を要求する端末装置の装置IDであっても良いし、領域検索を要求する携帯電話の携帯電話番号であっても良い。
[領域検索応答のデータの一例]
次に、レスポンス転送部132が通信インタフェース11を介して出力する領域検索応答の内容について、図8を参照して説明する。図8は、領域検索応答の内容の一例を示す図である。図8に示すように、領域検索応答は、領域検索の結果を示す領域情報のリストであり、領域情報に対応する領域IDと領域名とを含む。図8の例では、領域IDとして「00001」、領域名として「A商店X店舗周辺」と設定している。また、領域IDとして「00034」、領域名として「レストランC周辺」と設定している。なお、領域情報のリストには、領域IDと領域名とを含むものとしたが、これに限定されず、領域の位置、大きさや形状等を含むものとしても良い。
[リクエスト受付処理の手順]
次に、検索に係るリクエスト受付処理の手順について、図9Aを参照して説明する。図9Aは、検索に係るリクエスト受付処理の手順を示すフローチャートである。
まず、リクエスト受付部131は、領域検索要求を受け付けたか否かを判定する(S10A)。そして、領域検索要求を受け付けていないと判定した場合(ステップS10A;No)、リクエスト受付部131は、領域検索要求を受け付けるまで、判定処理を繰り返す。一方、領域検索要求を受け付けたと判定した場合(ステップS10A;Yes)、リクエスト受付部131は、検索処理を実行する(ステップS10B)。
そして、リクエスト受付部131は、リクエスト受付処理を終了したか否かを判定する(ステップS10C)。リクエスト受付処理を終了していないと判定した場合(ステップS10C;No)、リクエスト受付部131は、ステップS10Aに移行する。一方、リクエスト受付処理を終了したと判定した場合(ステップS10C;Yes)、リクエスト受付部131は、処処理を終了する。
[検索処理の手順]
次に、図9AのステップS10Bに示した検索処理について、図9Bを参照して説明する。図9Bは、実施例1に係る検索処理の手順を示すフローチャートである。なお、図9Bの例では、領域検索要求に含まれる位置情報を検索座標として説明する。
リクエスト受付部131によって領域検索要求が受け付けられると、ツリー検索部133は、領域インデックスDB121に基づいて、ルートノードを選択する(ステップS11)。そして、ツリー検索部133は、選択した選択ノードが葉ノードであるか否かを判定する(ステップS12)。
選択ノードが葉ノードでないと判定した場合(ステップS12;No)、ツリー検索部133は、選択ノードの子ノードに検索座標を含むものがあるか否かを、領域インデックスDB121を用いて判定する(ステップS13)。一例として、ツリー検索部133は、領域インデックスDB121に基づいて、選択ノードの子ノードリストを読み出し、読み出した子ノードリストに含まれるそれぞれの子ノードの矩形領域を読み出す。そして、ツリー検索部133は、読み出したそれぞれの子ノードの矩形領域に、検索座標を含むものがあるか否かを判定する。
選択ノードの子ノードに検索座標を含むものがあると判定した場合(ステップS13;Yes)、ツリー検索部133は、検索座標を含む子ノードを選択候補ノードに追加し(ステップS14)、ステップS15に移行する。一方、選択ノードの子ノードに検索座標を含むものがないと判定した場合(ステップS13;No)、ツリー検索部133は、ステップS15に移行する。
続いて、ツリー検索部133は、全ての選択候補ノードの検索を終えたか否かを判定する(ステップS15)。全ての選択候補ノードの検索を終えていないと判定した場合(ステップS15;No)、ツリー検索部133は、選択候補ノード内の1つの未検索ノードを選択し(ステップS16)、ステップS12に移行する。
ステップS12では、選択ノードが葉ノードであると判定した場合(ステップS12;Yes)、ツリー検索部133は、選択した葉ノードが持つ領域データの内、検索座標を含むものがあるか否かを判定する(ステップS17)。一例として、ツリー検索部133は、領域インデックスDB121に基づいて、葉ノードであるノードのデータリストを読み出し、読み出したデータリストに含まれる領域データへのポインタ、例えば領域IDを取り出す。そして、ツリー検索部133は、領域データDB122に基づいて、取り出した領域IDに対応する領域情報122cに検索座標を含むものがあるか否かを判定する。
選択した葉ノードが持つ領域データの内、検索座標を含むものがないと判定した場合(ステップS17;No)、ツリー検索部133は、次の選択候補ノードを検索すべく、ステップS15に移行する。
一方、選択した葉ノードが持つ領域データの内、検索座標を含むものがあると判定した場合(ステップS17;Yes)、ツリー検索部133は、該当領域データの内、重複領域の数が最小の領域データを検索結果に追加する(ステップS18)。一例として、ツリー検索部133は、領域データDB122に記憶された重複領域122dに基づいて、重複領域の数が最小の領域データ(領域ID)を検索結果に追加する。ここで、領域インデックスDB121を用いた検索を終了する。
続いて、重複データ検索部134は、領域データDB122の重複領域122dに基づいて、検索結果に追加した領域データの重複領域から未判定のものを読み出し、読み出した重複領域を1つ選択する(ステップS19)。そして、重複データ検索部134は、選択した重複領域が検索座標を含むか否かを判定する(ステップS20)。選択した重複領域が検索座標を含むと判定した場合(ステップS20;Yes)、重複データ検索部134は、含むと判定した重複領域の領域IDを検索結果に追加し(ステップS21)、ステップS22に移行する。
一方、選択した重複領域が検索座標を含まないと判定した場合(ステップS20;No)、重複データ検索部134は、全重複領域の判定を終えていない場合(ステップS22;No)、次の重複領域を判定すべく、ステップS19に移行する。一方、重複データ検索部134は、全重複領域の判定を終えた場合(ステップS22;Yes)、作成した検索結果を問合せ側へ返答すべく、レスポンス転送部132に出力する(ステップS23)。その後、レスポンス転送部132は、検索結果を領域検索応答として領域検索要求の問合せ側へ送信する。
ステップS15では、全ての選択候補ノードの検索を終えていると判定した場合(ステップS15;Yes)、ツリー検索部133は、選択ノードに検索座標を含むものがないので、検索結果無しとして問合せ側へ返答すべく、レスポンス転送部132に出力する(ステップS24)。その後、レスポンス転送部132は、検索結果を領域検索応答として領域検索要求の問合せ側へ送信する。
[領域データ追加処理の手順]
次に、実施例1に係る領域データ追加処理の手順について、図10、図11を参照して説明する。図10、図11は、実施例1に係る領域データ追加処理の手順を示すフローチャートである。
まず、重複領域設定部135は、領域インデックスDB121に基づいて、ルートノードを選択する(ステップS31)。そして、重複領域設定部135は、選択した選択ノードが葉ノードであるか否かを判定する(ステップS32)。
選択ノードが葉ノードでないと判定した場合(ステップS32;No)、重複領域設定部135は、領域インデックスDB121に基づいて、選択ノードの子ノードに追加領域を包含するものがあるか否かを判定する(ステップS33)。一例として、重複領域設定部135は、領域インデックスDB121に基づいて、選択ノードの子ノードリストを読み出し、読み出した子ノードリストに含まれるそれぞれの子ノードの矩形領域を読み出す。そして、ツリー検索部133は、読み出したそれぞれの子ノードの矩形領域に、追加領域を包含する矩形領域があるか否かを判定する。
追加領域を包含するものがあると判定した場合(ステップS33;Yes)、重複領域設定部135は、追加領域を包含する子ノードの内、矩形領域の面積が最小のものを選択ノードとする(ステップS34)。そして、重複領域設定部135は、ステップS32に移行する。
一方、追加領域を包含するものがないと判定した場合(ステップS33;No)、重複領域設定部135は、追加領域を含めると拡大量が最小になる子ノードを選択ノードとする(ステップS35)。そして、重複領域設定部135は、ステップS32に移行する。
ステップS32では、選択ノードが葉ノードであると判定した場合(ステップS32;Yes)、重複領域設定部135は、ステップS41に移行する。
続いて、重複領域設定部135は、選択した葉ノードに追加領域の領域データを追加する(ステップS41)。一例として、重複領域設定部135は、領域インデックスDB121の該当する葉ノードのデータリストに、追加領域の領域データへのポインタ、例えば領域IDを追加する。そして、重複領域設定部135は、重複領域設定処理を実行する(ステップS42)。
ここで、選択した葉ノードの持つ領域データ数が上限を超える場合がある。この場合には、重複領域設定部135は、以下の処理を行う。重複領域設定部135は、選択した葉ノードの持つ領域データ数が上限を超えるか否かを判定する(ステップS43)。領域データ数が上限を超える場合(ステップS43;Yes)、重複領域設定部135は、葉ノードの矩形領域を分割する場合に、分割結果の矩形領域の大きさの和が最小となるように葉ノードを2分割し、親ノードに追加する(ステップS44)。一方、領域データ数が上限を超えない場合(ステップS43;No)、重複領域設定部135は、領域データ追加処理を終了する。
さらに、追加する親ノードの持つ子ノード数が上限を超える場合がある。この場合には、重複領域設定部135は、以下の処理を行う。重複領域設定部135は、追加する親ノードの持つ子ノード数が上限を超えるか否かを判定する(ステップS45)。追加する親ノードの持つ子ノード数が上限を超える場合(ステップS45;Yes)、重複領域設定部135は、追加する親ノードがルートノードであるか否かを判定する(ステップS46)。一方、追加する親ノードの持つ子ノード数が上限を超えない場合(ステップS45;No)、重複領域設定部135は、領域データ追加処理を終了する。
追加する親ノードがルートノードでないと判定した場合(ステップS46;No)、重複領域設定部135は、分割結果の矩形領域の大きさの和が最小となるようにノードを分割する。そして、重複領域設定部135は、分割後の増加したノードを分割元のノードの親ノードに追加する(ステップS47)。そして、重複領域設定部135は、ステップS45に移行する。
一方、追加する親ノードがルートノードであると判定した場合(ステップS46;Yes)、重複領域設定部135は、現在のルートノードを分割し、現在のルートノードの上に新ルートノードを作成する(ステップS48)。そして、重複領域設定部135は、領域データ追加処理を終了する。
[重複領域設定処理の手順]
次に、図11のステップS42に示した重複領域設定処理について、図12を参照して説明する。図12は、重複領域設定処理の手順を示すフローチャートである。
重複領域設定部135は、領域インデックスDB121に基づいて、ルートノードを選択する(ステップS51)。そして、重複領域設定部135は、選択した選択ノードが葉ノードであるか否かを判定する(ステップS52)。
選択ノードが葉ノードであると判定した場合(ステップS52;Yes)、重複領域設定部135は、選択ノードにある領域データの内、追加領域と重なる領域データの領域を重複領域として選択する(ステップS53)。一例として、重複領域設定部135は、領域インデックスDB121に基づいて、選択ノードのデータリストを読み出し、読み出したデータリストに含まれる領域データへのポインタ、例えば領域IDを取り出す。そして、重複領域設定部135は、領域データDB122に基づいて、取り出した領域IDの内、追加領域と重なる部分がある領域IDを重複領域として選択する。そして、重複領域設定部135は、ステップS56に移行する。
一方、選択ノードが葉ノードでないと判定した場合(ステップS52;No)、重複領域設定部135は、領域インデックスDB121に基づいて、選択ノードの子ノードに追加領域と重なるものがあるか否かを判定する(ステップS54)。選択ノードの子ノードに追加領域と重なるものがあると判定した場合(ステップS54;Yes)、重複領域設定部135は、重なった子ノードを選択候補ノードに加え(ステップS55)、ステップS56に移行する。また、選択ノードの子ノードに追加領域と重なるものがないと判定した場合(ステップS54;No)、重複領域設定部135は、ステップS56に移行する。
続いて、重複領域設定部135は、全ての選択候補ノードの検索を終えたか否かを判定する(ステップS56)。全ての選択候補ノードの検索を終えていないと判定した場合(ステップS56;No)、重複領域設定部135は、選択候補ノード内の1つの未検索ノードを選択し(ステップS57)、ステップS52に移行する。
一方、全ての選択候補ノードの検索を終えたと判定した場合(ステップS56;Yes)、重複領域設定部135は、選択済みの重複領域を追加領域の重複領域に追加する(ステップS58)。一例として、重複領域設定部135は、重複領域として選択した領域データを、領域データDB122の追加領域に対応する重複領域122dに追加する。
さらに、重複領域設定部135は、追加領域を各選択済みの重複領域に重複領域として追加する(ステップS59)。一例として、重複領域設定部135は、追加領域を、領域データDB122の重複領域として選択した各領域データに対応する重複領域122dに追加する。そして、重複領域設定部135は、重複領域設定処理を終了する。
[重複領域設定の具体例]
ここで、重複領域設定の具体例を、図13を参照して説明する。図13は、重複領域設定の具体例を示す図である。なお、図13の例では、選択した葉ノードのデータリストには、領域データとして領域ID「00001」と「00002」とが設定されているものとする。また、追加領域を、領域IDとして「00034」、データ名として「レストランC周辺」、領域情報として「円領域:緯度35.492、緯度139.650、半径100m」とする。
重複領域設定部135は、選択した葉ノードにある領域データの内、追加領域と重なる領域データの領域を重複領域として選択する。ここでは、重複領域設定部135は、葉ノードにある領域データとしての領域ID「00001」について、領域に重なる部分があるので、重複領域として選択する。また、重複領域設定部135は、葉ノードにある領域データとしての領域ID「00002」について、領域に重なる部分がないので、重複領域として選択しない。
そして、重複領域設定部135は、重複領域として選択した領域IDを、領域データDB122の追加領域の重複領域の欄に追加する。ここでは、重複領域設定部135は、領域ID「00001」を、領域データDB122の領域ID「00034」に対応する重複領域R1に追加する。
さらに、重複領域設定部135は、追加領域の領域IDを、領域データDB122の各重複領域の重複領域の欄に追加する。ここでは、重複領域設定部135は、追加領域の領域ID「00034」を、領域データDB122の重複領域の領域ID「00001」に対応する重複領域R2に追加する。
このようにして、重複領域設定部135は、追加領域と、追加領域と重複する各重複領域とを、領域データDB122の重複領域の欄に相互に追加するようにした。しかしながら、追加領域が例えば都心から半径10kmの領域のような広い領域であるような場合、追加領域と重複する重複領域の数が極端に多くなることがある。かかる場合には、重複領域設定部135は、追加領域の重複領域の欄に重複領域を追加しないようにして、検索中にその領域が検索結果になった場合にはインデックスDB検索を継続しても良い。重複領域の欄に追加する重複領域の数が極端に多くなると、重複データ検索部134による検索処理に時間を要するからである。
そこで、重複領域設定部135の処理の変形例として、追加領域と重複する重複領域の数が所定の数以上の場合には、追加領域の重複領域の欄に重複領域を追加しない処理について説明する。なお、所定の数とは、例えば「200」であったり、インデックスツリーの子ノード数の上限値の10倍の数であったり、全領域データ数の0.1%の数であったりするが、これに限定されず、検索処理に遅延をきたさない重複領域の数であれば良い。
[重複領域設定処理の変形例の手順]
図14は、重複領域設定処理の変形例の手順を示すフローチャートである。なお、図12に示す重複領域設定部135の処理と同一の処理S51〜S59については同一符号を示すことで、その重複する処理の説明については省略する。図14に示す重複領域設定部135の処理が図12に示す重複領域設定部135の処理と異なるところは、S61を追加した点にある。
重複領域設定部135は、全ての選択候補ノードの検索を終えたか否かを判定し、全ての選択候補ノードの検索を終えたと判定した場合(ステップS56;Yes)、追加領域と重複する重複領域の数が所定の数以上であるか否かを判定する(ステップS61)。追加領域と重複する重複領域の数が所定の数以上でない場合(ステップS61;No)、重複領域設定部135は、選択済みの重複領域を追加領域の重複領域に追加する(ステップS58)。続いて、重複領域設定部135は、追加領域を各選択済みの重複領域に重複領域として追加する(ステップS59)。
一方、追加領域と重複する重複領域の数が所定の数以上である場合(ステップS61;Yes)、重複領域設定部135は、選択済みの重複領域を追加領域の重複領域に追加せず、重複領域には特殊値である「重複数過大」と記録する(ステップS62)。そして、重複領域設定部135は、追加領域を各選択済みの重複領域に重複領域として追加する(ステップS59)。
なお、かかる重複領域設定処理によって重複領域に「重複数過大」と記録された領域データ(領域ID)が追加される場合がある。かかる場合に、検索処理が、この領域データを検索結果に追加した場合であっても、この領域データを使わないで領域インデックスDB121を用いた検索を継続するようにする。具体的には、図9Bの検索処理のステップS18では、ツリー検索部133は、該当領域データの内、重複領域の数が最小の領域データを検索結果に追加する。一例として、ツリー検索部133は、領域データDB122に記憶された重複領域122dに基づいて、重複領域の数が最小の領域データ(領域ID)を検索結果に追加する。ここで、ツリー検索部133は、検索結果に「重複数過大」と記録された領域データしかない場合には、この領域データを使わないで領域インデックスDB121を用いた検索を継続すべく、ステップS15に移行すれば良い。
[実施例1の効果]
上記実施例1によれば、領域検索サーバ1は、領域を探索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報を領域インデックスDB121として記憶部12に記憶する。そして、領域検索サーバ1は、領域インデックスDB121に記憶されたインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索する。そして、領域検索サーバ1は、該位置を含む領域を検索できた場合、領域データDB122に記憶された重複領域に基づいて、検索できた領域の重複領域の中から該位置を含む領域を検索する。そして、領域検索サーバ1は、検索できた領域の情報を出力する。かかる構成によれば、領域検索サーバ1は、インデックスツリーを用いて、所定の位置を含む領域を検索できた場合、インデックスツリーを用いた検索を終了し、検索できた領域の重複領域を用いた検索に移行することとした。このため、領域検索サーバ1は、インデックスツリーを用いて所定の位置を含む領域を1個検索できれば、検索できた領域の重複領域の中から該位置を含む領域を検索すれば良いので、該位置を含む領域検索の検索時間を高速化できる。
ところで、実施例1に係る領域検索サーバ1では、インデックスツリーを用いて問合せ位置を含む領域を検索し、当該領域を検索できた場合、検索できた領域と重複する重複領域を検索対象として検索する場合を説明した。しかしながら、領域検索サーバ1は、これに限定されず、検索できた領域を次回の検索に活かすべく、前回検索できた領域として記録するようにしても良い。そこで、実施例2では、検索できた領域を前回検索できた領域として記録する領域検索サーバ2について説明する。
[実施例2に係る領域検索サーバの構成]
図15は、実施例2に係る領域検索サーバの構成を示す機能ブロック図である。なお、図1に示す領域検索サーバ1と同一の構成については同一符号を示すことで、その重複する構成および動作の説明については省略する。実施例1と実施例2とが異なるところは、記憶部12に前回位置DB201を追加した点にある。また、実施例1と実施例2とが異なるところは、制御部13に前回領域検索部202と前回領域記録部203とを追加した点にある。
前回位置DB201は、前回領域検索要求があったときに検索できた位置情報を当該要求元に対応付けて管理する。ここで、前回位置DB201のデータ構造の一例を、図16を参照して説明する。図16は、前回位置DB201のデータ構造の一例を示す図である。図16に示すように、前回位置DB201は、センサーID201a毎に、前回検索領域201bを対応付けて記憶する。センサーID201aは、領域検索要求の要求元のセンサーの識別IDを示す。前回検索領域201bは、前回領域検索要求があったときに検索できた領域情報を示す。例えば前回検索領域201bには、検索できた場合に検索できた領域の領域IDが記憶され、検索できなかった場合に「未検出」が記憶される。例えば、センサーID201aが「Sensor0001」である場合、前回検索領域201bとして「未検出」と記憶している。また、センサーID201aが「Sensor0002」である場合、前回検索領域201bとして「領域ID00034」と記憶している。
図15に戻って、前回領域検索部202は、前回領域検索した際に検索できた領域を用いて、所定の位置情報を含む領域を検索する。例えば、前回領域検索部202は、リクエスト受付部131によって受け付けられた領域検索要求の中からセンサーIDおよび位置情報を取り出す。そして、前回領域検索部202は、取り出したセンサーIDの前回検索領域を前回位置DB201に記憶しているか否かを判定する。そして、前回領域検索部202は、センサーIDの前回検索領域を記憶している場合、領域検索要求の中から取り出した位置情報が前回検索領域に含まれるか否かを判定する。そして、前回領域検索部202は、取り出した位置情報が前回検索領域に含まれる場合、当該前回検索領域を検索結果に追加し、前回領域検索部202の検索処理を終了する。その後、重複データ検索部134が、領域データDB122に記憶された重複領域に基づいて、検索結果に対応する重複領域の中から当該位置情報を含む重複領域を検索する。そして、重複データ検索部134は、検索できた重複領域の領域IDを検索結果に追加する。
また、前回領域検索部202は、取り出した位置情報が前回検索領域に含まれない場合、当該位置情報を含む領域をツリー検索部133に検索させる。すなわち、ツリー検索部133が、領域インデックスDB121を用いて、前回検索領域を領域データに持つ葉ノードから当該位置情報を含む領域を検索する。
ツリー検索部133は、葉ノードが持つ領域データの内、当該位置情報を含む領域データがあれば、検索できた領域データを検索結果に追加する。その後、重複データ検索部134が、領域データDB122に記憶された重複領域に基づいて、検索結果に対応する重複領域の中から当該位置情報を含む重複領域を検索する。一方、ツリー検索部133は、葉ノードが持つ領域データの内、当該位置情報を含む領域データがなければ、子ノードからルートノードへノードをボトムアップにノードを順番に辿り、当該位置情報を含むノードを選択する。そして、ツリー検索部133は、選択したノードの子ノードに、当該位置情報を含むものがあるか否かを、領域インデックスDB12を用いて判定する。そして、ツリー検索部133は、当該位置情報を含む子ノードを選択候補ノードとして追加する。そして、ツリー検索部133は、選択候補ノードとして追加されたノードを1つずつ選択し、選択したノードが葉ノードであれば、葉ノードにある領域データの内、当該位置情報を含む領域データがあるか否かを、領域インデックスDB121を用いて判定する。そして、ツリー検索部133は、当該位置情報を含む領域データが1つでもあれば、いずれか1つの領域データを検索結果に追加し、領域インデックスDB121を用いた検索を終了する。その後、重複データ検索部134が、領域データDB122に記憶された重複領域に基づいて、検索結果に対応する重複領域の中から当該位置情報を含む重複領域を検索する。そして、重複データ検索部134は、検索できた重複領域の領域IDを検索結果に追加する。
また、前回領域検索部202は、センサーIDの前回検索領域を記憶していない場合、ツリー検索部133および重複データ検索部134による検索処理に移行する。なお、ツリー検索部133および重複データ検索部134によって行われる検索処理については、実施例1で説明したとおりであるので、その説明を省略する。
前回領域記録部203は、領域検索要求があった要求元のセンサーIDに対応付けて検索結果を前回位置DB201に記録する。ここで、検索結果に検索できた領域IDが複数ある場合がある。かかる場合には、前回領域記録部203は、複数ある領域IDの内、重複領域の数が最小の領域IDを選択し、選択した領域IDを前回位置DB201に記録すれば良い。これにより、次回の領域検索要求で、当該領域検索要求の位置情報が前回記録された領域IDの領域に含まれていれば、続いて行われる当該領域と重複する重複領域に係る検索回数を減らせるからである。
[検索処理の手順]
次に、実施例2に係る検索処理の手順について、図17〜図19を参照して説明する。図17〜図19は、実施例2に係る検索処理の手順を示すフローチャートである。なお、図17〜図19の例では、領域検索要求に含まれる位置情報を検索座標として説明する。
まず、リクエスト受付部131によって領域検索要求が受け付けられると、前回領域検索部202は、問合せのセンサーIDの前回データ(前回検索領域)を前回位置DB201に記憶しているか否かを判定する(ステップS71)。問合せのセンサーIDの前回データを前回位置DB201に記憶していると判定した場合(ステップS71;Yes)、前回領域検索部202は、検索座標が前回データ内にあるか否かを判定する(ステップS72)。検索座標が前回データ内にある場合(ステップS72;Yes)、前回領域検索部202は、前回データを該当データとして検索結果に追加する(ステップS73)。
続いて、重複データ検索部134は、領域データDB122の重複領域122dに基づいて、検索結果に追加した領域データの重複領域から未判定のものを読み出し、読み出した重複領域を1つ選択する(ステップS74)。そして、重複データ検索部134は、選択した重複領域が検索座標を含むか否かを判定する(ステップS75)。選択した重複領域が検索座標を含むと判定した場合(ステップS75;Yes)、重複データ検索部134は、含むと判定した重複領域の領域IDを検索結果に追加し(ステップS76)、ステップS77に移行する。
一方、選択した重複領域が検索座標を含まないと判定した場合(ステップS75;No)、重複データ検索部134は、全重複領域の判定を終えていない場合(ステップS77;No)、次の重複領域を判定すべく、ステップS74に移行する。一方、重複データ検索部134は、全重複領域の判定を終えた場合(ステップS77;Yes)、作成された検索結果を問合せ側へ返答すべく、レスポンス転送部132に出力する(ステップS78)。そして、前回領域記録部203は、重複データ検索部134によって作成された検索結果の内1つの領域IDを問合せのセンサーIDに対応付けて前回位置DB201に記録し(ステップS79)、検索処理を終了する。
ステップS71では、問合せのセンサーIDの前回データを前回位置DB201に記憶していない場合(ステップS71;No)、前回領域検索部202は、ノードをルートノードからトップダウンに辿る検索処理に移行すべく、ステップS11に移行する。
ステップS72では、検索座標が前回データ内にない場合(ステップS72;No)、前回領域検索部202は、ノードをボトムアップに辿る検索処理に移行すべく、ステップS80に移行する。
ステップS80では、ツリー検索部133が、領域インデックスDB121に基づいて、前回データを領域データとしてデータリストに持つ葉ノードまたは親ノードを選択する(ステップS80)。そして、ツリー検索部133は、選択した選択ノードが検索座標を含むか否かを、領域インデックスDB121を用いて判定する(ステップS81)。選択ノードが検索座標を含むと判定した場合(ステップS81;Yes)、ツリー検索部133は、さらにノードを選択ノードからトップダウンに辿る検索処理に移行すべく、ステップS91に移行する。
一方、選択ノードが検索座標を含まないと判定した場合(ステップS81;No)、ツリー検索部133は、選択ノードがルートノードであるか否かを、領域インデックスDB121を用いて判定する(ステップS82)。選択ノードがルートノードでなければ(ステップS82;No)、ツリー検索部133は、親ノードを検索すべく、ステップS80に移行する。
一方、選択ノードがルートノードであれば(ステップS82;Yes)、ツリー検索部133は、検索結果無しとして問合せ側へ返答すべく、レスポンス転送部132に出力する(ステップS83)。そして、前回領域記録部203は、問合せのセンサーIDに対応付けて未検出である旨を前回位置DB201に記録し(ステップS84)、検索処理を終了する。
[前回位置DBに前回データを記憶していない場合の検索処理の手順]
次に、図17のステップS71に示した前回位置DB201に前回データを記憶していない場合の検索処理の手順について、図18を参照して説明する。なお、図18に示すように、ステップS11〜ステップS24については、図9と同様の処理手順であるので、その説明を省略する。図9と図18とが異なる点は、前回領域記録部203が検索結果を記録する点にある。
重複データ検索部134が全重複領域の判定を終えると(ステップS22;Yes)、作成された検索結果を問合せ側へ返答すべく、レスポンス転送部132に出力する(ステップS23)。そして、前回領域記録部203は、重複データ検索部134によって作成された検索結果の内1つの領域IDを問合せのセンサーIDに対応付けて前回位置DB201に記録し(ステップS23A)、検索処理を終了する。
また、ツリー検索部133が全ての選択候補ノードの検索を終えると(ステップS15;Yes)、検索結果無しとして問合せ側へ返答すべく、レスポンス転送部132に出力する(ステップS24)。そして、前回領域記録部203は、問合せのセンサーIDに対応付けて未検出である旨を前回位置DB201に記録し(ステップS24A)、検索処理を終了する。
[選択ノードが検索座標を含む場合の検索処理の手順]
次に、図17のステップS81に示した選択ノードが検索座標を含む場合の検索処理の手順について、図19を参照して説明する。
ツリー検索部133は、検索座標を含む選択ノードが葉ノードであるか否かを、領域インデックスDB121を用いて判定する(ステップS91)。
選択ノードが葉ノードでないと判定した場合(ステップS91;No)、ツリー検索部133は、選択ノードの子ノードに検索座標を含むものがあるか否かを、領域インデックスDB121を用いて判定する(ステップS92)。一例として、ツリー検索部133は、領域インデックスDB121に基づいて、選択ノードの子ノードリストを読み出し、読み出した子ノードリストに含まれるそれぞれの子ノードの矩形領域を読み出す。そして、ツリー検索部133は、読み出したそれぞれの子ノードの矩形領域に、検索座標を含むものがあるか否かを判定する。
選択ノードの子ノードに検索座標を含むものがあると判定した場合(ステップS92;Yes)、ツリー検索部133は、検索座標を含む子ノードを選択候補ノードに追加し(ステップS93)、ステップS94に移行する。一方、選択ノードの子ノードに検索座標を含むものがないと判定した場合(ステップS92;No)、ツリー検索部133は、ステップS94に移行する。
続いて、ツリー検索部133は、全ての選択候補ノードの検索を終えたか否かを判定する(ステップS94)。全ての選択候補ノードの検索を終えていないと判定した場合(ステップS94;No)、ツリー検索部133は、選択候補ノード内の1つの未検索ノードを選択し(ステップS95)、ステップS91に移行する。
ステップS91では、選択ノードが葉ノードであると判定した場合(ステップS91;Yes)、ツリー検索部133は、選択した葉ノードが持つ領域データの内、検索座標を含むものがあるか否かを判定する(ステップS96)。一例として、ツリー検索部133は、領域インデックスDB121に基づいて、葉ノードであるノードのデータリストを読み出し、読み出したデータリストに含まれる領域データへのポインタ、例えば領域IDを取り出す。そして、ツリー検索部133は、領域データDB122に基づいて、取り出した領域IDに対応する領域情報122cに検索座標を含むものがあるか否かを判定する。
選択した葉ノードが持つ領域データの内、検索座標を含むものがないと判定した場合(ステップS96;No)、ツリー検索部133は、次の選択候補ノードを検索すべく、ステップS94に移行する。
一方、選択した葉ノードが持つ領域データの内、検索座標を含むものがあると判定した場合(ステップS96;Yes)、ツリー検索部133は、該当領域データの内の1つを該当データとして検索結果に追加する(ステップS97)。ここで、領域インデックスDB121を用いた検索を終了し、ステップS74に移行する。なお、ツリー検索部133は、該当領域データの内の1つとして、重複領域の数が最小の領域データを検索結果に追加しても良い。これは、ステップS74以降の重複データ検索部134の処理において、さらに検索座標を含む領域を検索する際、検索対象となる重複領域の数を減らすためである。
ステップS94では、全ての選択候補ノードの検索を終えたと判定した場合(ステップS94;Yes)、ツリー検索部133は、選択ノードに検索座標を含むものがないので、さらに親ノードから検索すべく、ステップS80に移行する。
このようにして、重複領域設定部135は、領域検索要求の検索座標(位置情報)を領域データに含む場合に、当該領域データを前回位置DB201に記録するようにした。また、ツリー検索部133は、検索座標(位置情報)を領域データに全く含まない場合に、未検出である旨を前回位置DB201に記録するようにした。しかしながら、ツリー検索部133は、検索座標(位置情報)を領域データに全く含まない場合であっても、検索座標を含むノードがあれば、当該ノードの内最も深いノード(最深ノード)を前回位置DB201に記録するようにしても良い。これは、次回の領域検索要求の際、前回の検索座標を含むノードの内最深ノードから領域検索を行うことで、領域検索にヒットする確率を高くできるとともに、且つ検索回数を減らすことができる可能性があるからである。
[検索処理の変形例の手順]
図20、図21は、実施例に係る検索処理の変形例の手順を示すフローチャートである。なお、図17に示す検索処理と同一の処理S71〜S83については同一符号を示すことで、その重複する処理の説明については省略する。また、図19に示す、選択ノードが検索座標を含む場合の検索処理と同一の処理S91〜S97については同一符号を示すことで、その重複する処理の説明については省略する。
図20に示す検索処理が図17に示す検索処理と異なる点は、S91、S92を追加した点にある。図20に示すように、前回領域検索部202は、問合せのセンサーIDの前回データ(前回検索領域)を前回位置DB201に記憶しているか否かを判定する(ステップS71)。問合せのセンサーIDの前回データを前回位置DB201に記憶していると判定した場合(ステップS71;Yes)、前回領域検索部202は、前回データが領域データ(領域ID)か否かを判定する(ステップS91)。前回データが領域データである場合には(ステップS91;Yes)、前回領域検索部202は、ステップS72に移行する。一方、前回データが領域データでない場合には(ステップS91;No)、前回領域検索部202は、前回データのノードを選択し(ステップS92)、ステップS81に移行する。
また、図20に示す検索処理が図17に示す検索処理と異なる点は、S121〜S123を追加した点にある。図20に示すように、ツリー検索部133は、選択ノードがルートノードであるか否かを、領域インデックスDB121を用いて判定する(ステップS82)。選択ノードがルートノードでなければ(ステップS82;No)、ツリー検索部133は、親ノードを検索すべく、ステップS80に移行する。一方、選択ノードがルートノードであれば(ステップS82;Yes)、ツリー検索部133は、検索結果無しとして問合せ側へ返答すべく、レスポンス転送部132に出力する(ステップS83)。そして、前回領域記録部203は、最深該当ノードがあるか否かを判定する(ステップS121)。最深該当ノードがあれば(ステップS121;Yes)、前回領域記録部203は、前回位置DB201に最深該当ノードを問合せのセンサーIDに対応付けて記録し(ステップS122)、検索処理を終了する。一方、最深該当ノードがなければ(ステップS121;No)、前回領域記録部203は、問合せのセンサーIDに対応付けて未検出である旨を前回位置DB201に記録し(ステップS123)、検索処理を終了する。
図21に示す、選択ノードが検索座標を含む場合の検索処理が図19に示す、同様の検索処理と異なる点は、S101、S102を追加した点にある。図21に示すように、ツリー検索部133は、選択ノードが最深該当ノードより深いか否かを判定する(ステップS101)。選択ノードが最深該当ノードより深い場合には(ステップS101;Yes)、ツリー検索部133は、選択ノードを最深該当ノードとして一時的に記憶部12に記録し(ステップS102)、ステップS91に移行する。一方、選択ノードが最深該当ノードより深くない場合には(ステップS101;No)、ツリー検索部133は、ステップS91に移行する。
また、図21に示す、選択ノードが検索座標を含む場合の検索処理が図19に示す、同様の検索処理と異なる点は、S103、S104を追加した点にある。図21に示すように、選択ノードが葉ノードでない場合(ステップS91;No)且つ選択ノードの子ノードに検索座標を含むものがある場合(ステップS92;Yes)、ツリー検索部133は、以下の処理を行う。ツリー検索部133は、検索座標を含む子ノードを選択候補ノードに追加し(ステップS93)、当該子ノードが最深該当ノードより深いか否かを判定する(ステップS103)。そして、当該子ノードが最深該当ノードより深い場合(ステップS103;Yes)、ツリー検索部133は、子ノードを最深該当ノードとして一時的に記憶部12に記録し(ステップS104)、ステップS94に移行する。一方、当該子ノードが最深該当ノードより深くない場合(ステップS103;No)、ツリー検索部133は、ステップS94に移行する。
[最深ノードの説明]
ここで、最深ノードの具体例について、図22を参照して説明する。図22は、最深ノードの具体例を説明する図である。図22に示すように、ルートノードR0は、中間ノードR1〜R4の矩形領域を全て含む矩形領域であり、中間ノードR1は、子ノードR5〜R8の矩形領域を全て含む矩形領域である。領域検索要求の位置情報をP0で示す検索座標とすると、検索座標P0は、ルートノードR0に含まれ、且つ中間ノードR1に含まれている。ところが、検索座標P0は、中間ノードR2〜R4や、中間ノードR1に含まれる子ノードR5〜R8に含まれない。そこで、ツリー検索部133は、最深ノードを、検索座標P0を含むノードの内最も深いノードであるR1とする。そして、前回領域記録部203は、前回位置DB201に最深ノードR1を領域検索要求のセンサーIDに対応付けて記録する。
[実施例2の効果]
上記実施例2によれば、領域検索サーバ2は、所定の位置を含む領域検索要求を取得すると、該位置が前回検索できた領域に含まれるか否かを判定する。そして、領域検索サーバ2は、判定の結果、該位置が前回検索できた領域に含まれると判定された場合、領域データDB122に基づいて、含まれると判定された領域の重複領域の中から該位置を含む領域を検索する。かかる構成によれば、領域検索サーバ2は、次回の領域検索を前回検索できた領域から行うこととした。仮に、領域検索要求を行う要求元が領域の大きさに対して小さい移動距離しか移動しないような場合には、次回の領域検索要求の位置が前回検索できた領域の近傍にある可能性が高くなる。このため、領域検索サーバ2は、前回検索できた領域から次回の領域検索を行うことにより次回の位置を含む領域検索の検索時間を高速化できる。
また、上記実施例2によれば、領域検索サーバ2は、所定の位置を含む領域検索要求を取得すると、該位置が前回検索できた領域に含まれるか否かを判定する。そして、領域検索サーバ2は、判定の結果、該位置が前回検索できた領域に含まれないと判定された場合、ツリー構造を形成するノードの中で、含まれないと判定された領域を含むインデックスの葉ノードから該位置を含む領域を検索する。そして、領域検索サーバ2は、該位置を含む領域を検索できた場合、検索できた情報の重複領域の中から該位置を含む領域を検索する。かかる構成によれば、領域検索サーバ2は、次回の領域検索を前回検索できた領域から行うこととした。仮に、領域検索要求を行う要求元が領域の大きさに対して小さい移動距離しか移動しないような場合には、次回の領域検索要求の位置が前回検索できた領域の近傍にある可能性が高くなる。このため、領域検索サーバ2は、次回の領域検索要求の位置が前回検索できた領域に含まれていなくても、当該位置が前回検索できた領域の近傍を含むインデックスの葉ノードから次回の領域検索を行うことにより次回の位置を含む領域検索の検索時間を高速化できる。
[領域検索の検索回数の比較結果]
ここで、ルートノードから検索を開始した場合と、前回検索できた領域から検索を開始した場合との領域検索の検索回数の比較結果を、図23を参照して説明する。図23は、検索回数の比較結果を説明する図である。図23に示すように、Rツリーは、深さ5のインデックスツリーである。そして、ルートノードR0は、深さが1のノードR1等の矩形領域を全て含む矩形領域である。ノードR1は、深さが2のノードR2等の矩形領域を全て含む矩形領域である。ノードR2は、深さが3のノードR3等の矩形領域を全て含む矩形領域である。ノードR3は、深さが4のノードRA、RBの矩形領域を全て含む矩形領域である。ノードRAは、A1、A2、A3の領域データを含む。ノードRBは、B1、B2、B3の領域データを含む。そして、A2は、A1、A3、B1と重複する重複領域である。A3は、A1、A2、B1と重複する重複領域である。
まず、領域検索サーバ2は、最初にP2の位置を含む領域検索要求の領域検索を行った結果、P2の位置を含む領域データA2、B1の内、A2を前回検索領域として前回位置DB201に記録したものとする。そして、領域検索サーバ2は、次回、P3の位置を含む領域検索要求の領域検索を行うとする。すると、領域検索サーバ2によって行われる検索回数N1は、以下のようになる。
N1=1(A2)+3(A2の重複領域)=4
すなわち、N1は、P3の位置がA2の領域に含まれるかを検索する1回と、P3の位置がA2の領域に含まれているので、A2の領域と重複する重複領域A1、A3、B1にP3の位置が含まれているかを検索する3回とを加算した値4となる。
一方、ルートノードから検索を開始した場合には、検索回数O1は、以下のようになる。なお、各ノードの子ノードが3であるとする。
O1=4×3(R0〜R3)+3(RA)+3(RB)=18
すなわち、O1には、R0〜R3の4個のノードについて各子ノードの数(3)分P3の位置が各ノードに含まれるかを検索する12回が設定される。さらに、P3の位置がRA、RBに含まれているので、RAに含まれる3個の領域データにP3の位置が含まれているかを検索する3回をO1に加算した15回が設定される。さらに、RBに含まれる3個の領域データにP3の位置が含まれているかを検索する3回をO1に加算した18回が設定される。
領域検索サーバ2が次回の領域検索を行った結果、P3の位置を含む領域データA1、A2、A3、B1の内、A2を前回検索領域として前回位置DB201に記録したものとする。そして、領域検索サーバ2は、さらに次回、P4の位置を含む領域検索要求の領域検索を行うとする。すると、領域検索サーバ2によって行われる検索回数N2は、以下のようになる。
N2=1(A2)+3(RA)+3(A3の重複領域)=7
すなわち、N2には、P4の位置がA2の領域に含まれるかを検索する1回が設定される。さらに、P4の位置がA2の領域に含まれていないので、A2のノードRAに含まれる3個の領域データにP4の位置が含まれているかを検索する3回をN2に加算した4回が設定される。さらに、P4の位置がA3の領域に含まれているので、A3の領域と重複する重複領域A1、A2、B1にP4の位置が含まれているかを検索する3回をN2に加算した7回が設定される。一方、ルートノードから検索を開始した場合には、検索回数O1、すなわち18回となる。
このようにして、領域検索サーバ2は、前回検索領域から次回の領域検索を行うことにより次回の位置を含む領域検索の検索回数を、ルートノードから検索を開始した場合の検索回数より少なくでき、検索時間を高速化できる。
なお、重複領域設定部135の処理の変形例として、追加領域と重複する重複領域が所定の数以上の場合には、追加領域の重複領域の欄に重複領域を追加しないようにした。しかしながら、重複領域設定部135は、これに限定されず、追加領域と重複する重複領域が所定の数以上の場合には、追加領域の重複領域の欄に「重複領域数過多」である旨の情報を追加するようにしても良い。
また、前回位置DB201は、センサーID201aと前回検索領域201とを対応付けるものとして説明した。しかしながら、前回位置DB201は、センサーID201aを、例えば、領域検索を要求する端末装置の装置IDに代えても良いし、領域検索を要求する携帯電話の携帯電話番号に代えても良い。すなわち、センサーID201aに相当するIDは、ユースケース毎に変えることができる。
また、ツリー検索部133は、検索座標(位置情報)を領域データに全く含まない場合であっても、検索座標を含むノードがあれば、当該ノードの内最も深いノード(最深ノード)を前回位置DB201に記録するようにした。ここで、同じ深さで複数の最深ノードが存在する場合がある。かかる場合には、ツリー検索部133は、例えば最深ノード毎に有する子ノードの数が最小の最深ノードを前回位置DB201に記録すれば良い。また、別の例では、ツリー検索部133は、最深ノード毎に有する矩形領域の面積あたりの子ノードの数が最小の最深ノードを前回位置DB201に記録する。具体的には、ツリー検索部133は、最深ノード毎に、子ノードリストの子ノード数を矩形領域の面積で割った値を算出し、算出した値が最小の最深ノードを選択し、選択した最深ノードを前回位置DB201に記録する。つまり、次回の検索量が少なくなるノードであることが望ましいのである。
[プログラムなど]
なお、領域検索サーバ1、2は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記したツリー検索部133、重複データ検索部134などの各機能を搭載することによって実現することができる。
また、図示した各装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、ツリー検索部133と重複データ検索部134とを1個の部として統合しても良い。一方、ツリー検索部133を、葉ノードにおける検索処理と葉ノード以外のノードにおける検索処理とに分散しても良い。また、領域データDB122などの記憶部を領域検索サーバ1、2の外部装置としてネットワーク経由で接続するようにしても良い。
また、上記実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図1に示した領域検索サーバ1と同様の機能を実現する領域検索プログラムを実行するコンピュータの一例を説明する。図24は、領域検索プログラムを実行するコンピュータの一例を示す図である。
図24に示すように、コンピュータ200は、各種演算処理を実行するCPU201と、ユーザからのデータの入力を受け付ける入力装置202と、ディスプレイ203を有する。また、コンピュータ200は、記憶媒体からプログラム等を読取る読み取り装置204と、ネットワークを介して他のコンピュータとの間でデータの授受を行うインタフェース装置205とを有する。また、コンピュータ200は、各種情報を一時記憶するRAM206と、ハードディスク装置207を有する。そして、各装置201〜207は、バス208に接続される。
ハードディスク装置207は、領域検索プログラム207a、重複領域設定プログラム207bを記憶する。CPU201は、各プログラム207a〜207bを読み出して、RAM206に展開する。領域検索プログラム207aは、領域検索プロセス206aとして機能する。重複領域設定プログラム207bは、重複領域設定プロセス206bとして機能する。
例えば、領域検索プロセス206aは、ツリー検索部133および重複データ検索部134に対応する。重複領域設定プロセス206bは、重複領域設定部135に対応する。
なお、各プログラム207a〜207bについては、必ずしも最初からハードディスク装置207に記憶させておかなくてもよい。例えば、コンピュータ200に挿入されるフレキシブルディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」に各プログラムを記憶させておく。そして、コンピュータ200がこれらから各プログラム207a〜207bを読み出して実行するようにしても良い。
以上の実施例1〜2を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータが
領域を探索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索し、
該位置を含む領域を検索できた場合、複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶した記憶部に基づいて、検索できた領域の重複領域の中から該位置を含む領域を検索し、
検索できた領域の情報を出力する
ことを実行する領域検索方法。
(付記2)所定の位置を含む領域の問合せ要求を取得すると、該位置が前回検索できた領域に含まれるか否かを判定し、
判定の結果、該位置が前回検索できた領域に含まれると判定された場合、前記記憶部に基づいて、含まれると判定された領域の重複領域の中から該位置を含む領域を検索することを特徴とする付記1に記載の領域検索方法。
(付記3)前記判定の結果、該位置が前回検索できた領域に含まれないと判定された場合、前記ツリー構造を形成するノードの中で、含まれないと判定された領域を含むインデックス情報の葉ノードから該位置を含む領域を検索し、
該位置を含む領域を検索できた場合、検索できた情報の重複領域の中から該位置を含む領域を検索することを特徴とする付記2に記載の領域検索方法。
(付記4)前記領域を検索する処理において、検索できた領域が複数ある場合、複数ある領域の内、重複領域の数が最も小さい領域を選択することを特徴とする付記2または付記3に記載の領域検索方法。
(付記5)前記記憶部に記憶する処理は、領域と重複する重複領域が所定の値を超える場合、当該領域に関する重複領域の情報を記憶しないことを特徴とする付記1に記載の領域検索方法。
(付記6)コンピュータに、
領域を探索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索し、
該位置を含む領域を検索できた場合、複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶した記憶部に基づいて、検索できた領域の重複領域の中から該位置を含む領域を検索し、
検索できた領域の情報を出力する
各処理を実行させることを特徴とする領域検索プログラム。
(付記7)複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶した記憶部と、
領域を探索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索する第1の検索部と、
前記第1の検索部によって該位置を含む領域を検索できた場合、前記記憶部に基づいて、検索できた領域の重複領域の中から該位置を含む領域を検索する第2の検索部と、
前記第1の検索部および前記第2の検索部によって検索できた領域の情報を出力する出力部と
を有することを特徴とする情報処理装置。