(57)【特許請求の範囲】
【請求項１】
コンピュータが
領域を検索する際に参照するインデックス情報であって前記領域を複数含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーに基づき、所定の位置を含む領域を検索し、
該位置を含む領域が検索された場合、前記インデックス情報により管理される領域のそれぞれについて該領域を包含する他の領域、該領域に包含される他の領域及び該領域と一部が重複する他の領域を示す重複領域の情報を記憶した記憶部に基づいて、検索された領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する他の領域を除く重複領域の中から該位置を含む領域を検索し、
前記検索領域を包含する重複領域の情報とともに、検索された領域の情報を出力する
ことを実行する領域検索方法。
【請求項２】
該位置を含む領域を検索する処理は、前記インデックス情報により管理される領域のそれぞれについて該領域を包含する外部包含領域の情報、該領域が包含する内部包含領域の情報および該領域と部分的に重複する部分重複領域の情報を記憶した前記記憶部に基づいて、前記検索領域と重複する内部包含領域および部分重複領域の中から該位置を含む領域を検索することを特徴とする請求項１に記載の領域検索方法。
【請求項３】
該位置を含む領域を検索する処理は、
前記検索領域と重複するいずれかの内部包含領域の中から該位置を含む領域が新たに検索された場合、前記記憶部に基づいて、前記検索領域の残りの検索対象である内部包含領域の数および部分重複領域の数の和と、新たに検索された領域の内部包含領域の数および部分重複領域の数の和とを比較し、
前記比較する処理によって新たに検索された領域に係る和の数が前記検索領域に係る和の数より小さい場合、前記検索領域における検索処理を中止し、新たに検索された領域における検索処理を実行する
ことを特徴とする請求項２に記載の領域検索方法。
【請求項４】
該位置を含む領域を検索する処理は、前記検索領域と重複する内部包含領域について、当該内部包含領域が包含する内部包含領域の数および当該内部包含領域の部分重複領域の数の和と、前記検索領域と重複する内部包含領域の数および部分重複領域の数の和との差分を算出し、算出した差分の大きい順に前記検索領域と重複する内部包含領域を選択し、選択した内部包含領域に該位置が含まれるか否かを検索することを特徴とする請求項２または請求項３に記載の領域検索方法。
【請求項５】
所定の位置を含む領域の問合せ要求を取得すると、該位置が前回検索された領域に含まれるか否かを判定し、
判定の結果、該位置が前回検索された領域に含まれると判定された場合、前記記憶部に基づいて、含まれると判定された領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索することを特徴とする請求項１に記載の領域検索方法。
【請求項６】
コンピュータに、
領域を検索する際に参照するインデックス情報であって前記領域を複数含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーに基づき、所定の位置を含む領域を検索し、
該位置を含む領域を検索された場合、前記インデックス情報により管理される領域のそれぞれについて該領域を包含する他の領域、該領域に包含される他の領域及び該領域と一部が重複する他の領域を示す重複領域の情報を記憶した記憶部に基づいて、検索された領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する他の領域を除く重複領域の中から該位置を含む領域を検索し、
前記検索領域を包含する重複領域の情報とともに、検索された領域の情報を出力する
各処理を実行させることを特徴とする領域検索プログラム。
【請求項７】
複数の領域のそれぞれについて該領域を包含する他の領域、該領域に包含される他の領域及び該領域と一部が重複する他の領域を示す重複領域の情報を記憶した記憶部と、
領域を検索する際に参照するインデックス情報であって前記領域を複数含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーに基づき、所定の位置を含む領域を検索する第１の検索部と、
前記第１の検索部によって該位置を含む領域が検索された場合、前記記憶部に基づいて、検索された領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する他の領域を除く重複領域の中から該位置を含む領域を検索する第２の検索部と、
前記検索領域を包含する重複領域の情報とともに、前記第２の検索部によって検索された領域の情報を出力する出力部と
を有することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、領域検索方法などに関する。
【背景技術】
【０００２】
従来、空間内に存在する大量のデータから条件に合ったデータを高速に検索するために、インデックスを用いたデータ管理が利用される。インデックスを用いたデータ管理方式には、一次元のデータを検索する場合に用いられるＢ−Ｔｒｅｅ（Ｂツリー）を利用した方式や多次元データを検索する場合に用いられるＲ−Ｔｒｅｅ（Ｒツリー）を利用した方式がある。
【０００３】
例えば、Ｒツリーを利用したデータ管理について、図２５を参照して説明する。図２５は、Ｒツリーで管理するデータと矩形領域の例を示す図である。図２５に示すように、Ｒ０は、子ノードＲ１〜Ｒ４の矩形領域を全て含む矩形領域であり、Ｒ１は、Ｒ５〜Ｒ８の矩形領域を全て含む矩形領域である。また、最下段のＲ５〜Ｒ１１は葉ノードであり、内部にデータを含む矩形領域である。すなわち、Ｒ０はＲ１のインデックス情報となり、Ｒ１は、Ｒ５のインデックス情報となっている。
【０００４】
条件に合ったデータを検索するために、かかるインデックス情報を用いて該当範囲を検索（「範囲検索」という。）していく場合、ルートノードであるＲ０の４つの子ノードＲ１〜Ｒ４から検索範囲が重なるノードを選択する。重なる部分を持つノードは再帰的に検索範囲が重なるノードを選択し、最終的に葉ノードの中から検索範囲内にあるデータを選択する。
【０００５】
かかる範囲検索の手法として、広い領域に複数のより狭い領域が含まれるというように階層化された領域に関する座標情報とＧＰＳ装置により測定された現在の位置とから、現在の位置が階層化された領域の何れに属するかを検索判定する技術が特許文献２に開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】国際公開第２００６／０５９６２９号
【特許文献２】特開２０００−２４９５６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、インデックスを用いた従来の範囲検索では、検索時間を要してしまうという問題があった。すなわち、Ｒツリーを利用したデータ管理方式では、検索操作を実行する都度、ルートノードから検索を開始するので、常時ｌｏｇＮオーダの検索回数が必要となり、検索時間を要してしまう。
【０００８】
階層化された領域に関する座標情報を用いて範囲検索する場合であっても、現在の位置が測定される都度、測定される現在の位置に関する検索判定を、広い領域から順番に開始するので、検索時間を要してしまうことには変わりがない。
【０００９】
開示の技術は、インデックスを用いた範囲検索の検索時間を高速化することができることを目的とする。
【課題を解決するための手段】
【００１０】
１つの側面では、領域検索方法は、領域を検索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索し、該位置を含む領域を検索できた場合、複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶した記憶部に基づいて、検索できた領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索し、前記検索領域を包含する重複領域の情報とともに、検索できた領域の情報を出力する。
【発明の効果】
【００１１】
本願の開示する領域検索方法の一つの態様によれば、インデックスを用いた範囲検索の検索時間を高速化することができる。
【図面の簡単な説明】
【００１２】
【図１】図１は、実施例１に係る領域検索サーバの構成を示す機能ブロック図である。
【図２】図２は、領域インデックスＤＢに記憶される情報の例を示す図である。
【図３】図３は、領域インデックスＤＢに記憶されるルートノードの情報の例を示す図である。
【図４】図４は、領域インデックスＤＢに記憶される中間ノードの情報の例を示す図である。
【図５】図５は、領域インデックスＤＢに記憶される葉ノードの情報の例を示す図である。
【図６】図６は、領域データＤＢのデータ構造の一例を示す図である。
【図７】図７は、領域の重複関係を示す図である。
【図８】図８は、重複領域設定における内部包含領域追加の具体例を示す図である。
【図９】図９は、領域検索要求の内容の一例を示す図である。
【図１０】図１０は、領域検索応答の内容の一例を示す図である。
【図１１】図１１は、検索に係るリクエスト受付処理の手順を示すフローチャートである。
【図１２】図１２は、実施例１に係る検索処理の手順を示すフローチャートである。
【図１３】図１３は、実施例１に係る検索処理内の重複領域判定処理の手順を示すフローチャートである。
【図１４】図１４は、実施例１に係る検索処理内の重複領域判定処理（変形例）の手順を示すフローチャートである。
【図１５】図１５は、実施例１に係る重複領域設定処理の手順を示すフローチャート（１）である。
【図１６】図１６は、実施例１に係る重複領域設定処理の手順を示すフローチャート（２）である。
【図１７】図１７は、内部包含項目に追加する処理手順の一例を示すフローチャートである。
【図１８】図１８は、実施例２に係る領域検索サーバの構成を示す機能ブロック図である。
【図１９】図１９は、前回位置ＤＢのデータ構造の一例を示す図である。
【図２０】図２０は、実施例２に係る検索処理の手順を示すフローチャート（１）である。
【図２１】図２１は、実施例２に係る検索処理の手順を示すフローチャート（２）である。
【図２２】図２２は、実施例２に係る検索処理の手順を示すフローチャート（３）である。
【図２３】図２３は、実施例２に係る検索処理内の重複領域判定処理の手順を示すフローチャートである。
【図２４】図２４は、領域検索プログラムを実行するコンピュータの一例を示す図である。
【図２５】図２５は、Ｒツリーで管理するデータと矩形領域の例を示す図である。
【発明を実施するための形態】
【００１３】
以下に、本願の開示する領域検索方法、領域検索プログラムおよび情報処理装置の実施例を図面に基づいて詳細に説明する。なお、実施例によりこの発明が限定されるものではない。
【実施例１】
【００１４】
［領域検索サーバ］
図１は、実施例１に係る領域検索サーバの構成を示す機能ブロック図である。図１に示すように、領域検索サーバ１は、通信インタフェース１１と、記憶部１２と、制御部１３とを有する。
【００１５】
通信インタフェース１１は、各端末装置との間で通信を確立して、各端末装置から領域検索要求を受信したり、各端末装置に領域検索応答を送信したりするインタフェースである。ここで、領域検索要求とは、端末装置の位置情報がいずれの領域に含まれるかを検索する要求である。位置情報は、例えば端末装置が存在する位置を示す緯度、経度の情報であるが、端末装置が存在する空間内の範囲を示す情報であっても良い。そして、領域検索要求は、例えば端末装置の位置情報や端末装置が持つセンサーの識別ＩＤを含む内容となる。領域検索応答とは、領域検索要求に対応する応答であり、検索結果を含む内容となる。なお、通信インタフェース１１は、例えば、ＬＡＮやインターネット等と接続するネットワークインタフェースカードや、無線アンテナを有する無線通信部等である。
【００１６】
記憶部１２は、制御部１３が実行するプログラム等を記憶するとともに、領域インデックスＤＢ１２１と領域データＤＢ１２２とを有する。なお、記憶部１２は、例えば、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（flash  memory）等の半導体メモリ素子、または、ハードディスク、光ディスク等の記憶装置である。
【００１７】
領域インデックスＤＢ１２１は、空間内に存在する大量の領域から条件に合った領域を高速に検索するための索引情報である。例えば、領域インデックスＤＢ１２１は、どの領域がどこにあるのかを示したインデックスをＲツリーで保持する。
【００１８】
ここで、領域インデックスＤＢ１２１に記憶される情報の例を、図２を参照して説明する。図２は、領域インデックスＤＢに記憶される情報の例を示す図である。図２に示すように、領域インデックスＤＢ１２１は、ルートノード、中間ノードおよび葉ノードのいずれかを示す領域データで形成されるＲツリーを記憶する。ルートノードは、Ｒツリーに１つ存在する頂点の領域データである。また、葉ノードは、Ｒツリーの最底辺のノードであり、自らは子ノードを含まず、検索対象となる多次元の領域データを１つ以上持つ。それ以外の木の中間に存在するノードは、中間ノードであり、それぞれ子ノードを１つ以上持つ。
【００１９】
図２の例では、ルートノードがＲ１であり、Ｒ１の子ノード且つ中間ノードがＲ１０、Ｒ１１である。Ｒ１がＲ１０、Ｒ１１の矩形領域を全て含む矩形領域となっている。中間ノードＲ１０の子ノードである葉ノードがＲ１００、Ｒ１０１である。Ｒ１０がＲ１００、Ｒ１０１の矩形領域を全て含む矩形領域となっている。中間ノードＲ１１の子ノードである葉ノードがＲ１１０、Ｒ１１１である。Ｒ１１がＲ１１０、Ｒ１１１の矩形領域を全て含む矩形領域となっている。そして、葉ノードであるＲ１００は、検索対象となる領域データ１、２、３を持っている。葉ノードであるＲ１０１は、検索対象となる領域データ４、５を持っている。葉ノードであるＲ１１０は、検索対象となる領域データ６、７を持っている。葉ノードであるＲ１１１は、検索対象となる領域データ８、９を持っている。なお、領域データ１〜９は、例えば領域データを識別可能なＩＤ（IDentification）である領域ＩＤと一意に紐付くので、領域ＩＤとしても良い。
【００２０】
領域インデックスＤＢ１２１は、Ｒツリーの実体としてルート、中間、葉の各ノードの情報を記憶する。図３は、領域インデックスＤＢに記憶されるルートノードの情報の例を示す図である。図３に示すように、領域インデックスＤＢ１２１は、ルートノードＲ１の情報として、「ノード種別、矩形領域、子ノードリスト」を記憶する。「ノード種別」は、ノードがルート、中間、葉のいずれかであるかを示す情報である。「矩形領域」は、子ノードの担当領域を全て含む最小外接矩形の情報である。最小外接矩形とは、子ノードの領域を全て含む最小の矩形領域をいう。「子ノードリスト」は、当該ノードの子ノードへのリンクポインタのリストである。
【００２１】
図３の例では、ルートノードＲ１は、ｘ、ｙの２次元データを管理し、「ｘ１＝３５．５、ｙ１＝１３９．０」が担当領域の最小点であり、「ｘ２＝３５．９、ｙ２＝１３９．５」が担当領域の最大点であることを示す。すなわち、Ｒ１が担当する領域は、両点を頂点として各次元軸に直交した４直線で作られる領域である。また、Ｒ１は、子ノード「Ｒ１０、Ｒ１１」へのポインタのリストを記憶する。
【００２２】
図４は、領域インデックスＤＢに記憶される中間ノードの情報の例を示す図である。図４に示すように、領域インデックスＤＢ１２１は、中間ノードの情報として、「ノード種別、矩形領域、子ノードリスト」を記憶する。ここで記憶される「ノード種別」、「矩形領域」、「子ノードリスト」は、図３と同様であるので詳細な説明は省略する。領域インデックスＤＢ１２１は、Ｒ１０、Ｒ１１について、図４の情報を記憶する。
【００２３】
図４の場合、中間ノードＲ１０は、ｘ、ｙの２次元データを管理し、「ｘ１＝３５．５、ｙ１＝１３９．２」が担当領域の最小点であり、「ｘ２＝３５．７、ｙ２＝１３９．３」が担当領域の最大点であることを示す。すなわち、中間ノードＲ１０が担当する領域は、両点を頂点として各次元軸に直交した４直線で作られる領域である。また、Ｒ１０は、子ノード「Ｒ１００、Ｒ１０１」へのポインタのリストを記憶する。
【００２４】
図５は、領域インデックスＤＢに記憶される葉ノードの情報の例を示す図である。図５に示すように、領域インデックスＤＢ１２１は、葉ノードの情報として、「ノード種別、矩形領域、データリスト」を記憶する。ここで記憶される「ノード種別」、「矩形領域」は、図３と同様であるので詳細な説明は省略する。「データリスト」は、管理する多次元の領域データである。領域インデックスＤＢ１２１は、Ｒ１００、Ｒ１０１、Ｒ１１０、Ｒ１１１について、図５の情報を記憶する。
【００２５】
図５の場合、葉ノードＲ１００は、ｘ、ｙの２次元データを管理し、「ｘ１＝３５．５、ｙ１＝１３９．２」が担当領域の最小点であり、「ｘ２＝３５．６、ｙ２＝１３９．３」が担当領域の最大点であることを示す。すなわち、葉ノードＲ１００が担当する領域は、両点を頂点として各次元軸に直交した４直線で作られる領域である。また、Ｒ１００は、領域データ「Ｘ１、Ｘ２、Ｘ３、Ｘ４」へのポインタのリストを記憶する。領域データへのポインタの一例として、領域データを識別する領域ＩＤが用いられる。各領域データの実体は、後述する領域データＤＢ１２２に格納されている。
【００２６】
図１に戻って、領域データＤＢ１２２は、複数の領域のそれぞれについて領域と重複する重複領域の情報を管理する。
【００２７】
ここで、領域データＤＢ１２２のデータ構造の一例を、図６を参照して説明する。図６は、領域データＤＢのデータ構造の一例を示す図である。図６に示すように、領域データＤＢ１２２は、領域ＩＤ１２２ａ毎に、データ名１２２ｂ、領域情報１２２ｃ、内部包含１２２ｄ、外部包含１２２ｅおよび部分重複１２２ｆを対応付けて記憶する。領域ＩＤ１２２ａは、領域データを一意に識別可能なＩＤを示す。データ名１２２ｂは、領域ＩＤで示される領域データのデータ名を示す。領域情報１２２ｃは、領域ＩＤで示される領域データの実体である具体的な領域の範囲を示す。内部包含１２２ｄは、領域ＩＤで示される領域データの領域の内部に包含される領域（以降、「内部包含領域」という。）の領域ＩＤを示す。外部包含１２２ｅは、領域ＩＤで示される領域データの領域を包含する領域（以降、「外部包含領域」という。）の領域ＩＤを示す。部分重複１２２ｆは、領域ＩＤで示される領域データの領域と部分的に重複する他の領域（以降、「部分重複領域」という。）の領域ＩＤを示す。内部包含１２２ｄ、外部包含１２２ｅおよび部分重複１２２ｆには、０個、１個または複数個の領域ＩＤが記憶される。
【００２８】
例えば、領域ＩＤ１２２ａが「Ｘ０」である場合、データ名１２２ｂとして「ＡＡＡ区ＢＢＢ町付近」、領域情報１２２ｃとして「円領域：緯度Ａ０、経度Ｂ０、半径Ｒ０ｍ」と記憶している。そして、内部包含１２２ｄとして「Ｘ１、Ｘ２、Ｘ３、Ｘ４」、外部包含１２２ｅとして空白、部分重複１２２ｆとして空白と記憶している。また、領域ＩＤ１２２ａが「Ｘ１」である場合、データ名１２２ｂとして「ＣＣＣ工場」、領域情報１２２ｃとして「円領域：緯度Ａ１、経度Ｂ１、半径Ｒ１ｍ」と記憶している。そして、内部包含１２２ｄとして「Ｘ２、Ｘ３」、外部包含１２２ｅとして「Ｘ０」、部分重複１２２ｆとして「Ｘ４」と記憶している。また、領域ＩＤ１２２ａが「Ｘ２」である場合、データ名１２２ｂとして「ＤＤＤ研究所」、領域情報１２２ｃとして「円領域：緯度Ａ２、経度Ｂ２、半径Ｒ２ｍ」と記憶している。そして、内部包含１２２ｄとして「Ｘ３」、外部包含１２２ｅとして「Ｘ０、Ｘ１」、部分重複１２２ｆとして「Ｘ４」と記憶している。また、領域ＩＤ１２２ａが「Ｘ３」である場合、データ名１２２ｂとして「ＮＮＮ付近」、領域情報１２２ｃとして「円領域：緯度Ａ３、経度Ｂ３、半径Ｒ３ｍ」と記憶している。そして、内部包含１２２ｄとして空白、外部包含１２２ｅとして「Ｘ０、Ｘ１、Ｘ２」、部分重複１２２ｆとして「Ｘ４」と記憶している。また、領域ＩＤ１２２ａが「Ｘ４」である場合、データ名１２２ｂとして「ＦＦＦ駅周辺」、領域情報１２２ｃとして「円領域：緯度Ａ４、経度Ｂ４、半径Ｒ４ｍ」と記憶している。そして、内部包含１２２ｄとして空白、外部包含１２２ｅとして「Ｘ０」、部分重複１２２ｆとして「Ｘ１、Ｘ２、Ｘ３」と記憶している。
【００２９】
ここで、図６の領域データＤＢ１２２に記憶された領域ＩＤが示す領域の重複関係について、図７を参照して説明する。図７は、領域の重複関係を示す図である。図７に示すように、領域ＩＤがＸ０である場合、内部包含領域としてＸ１、Ｘ２、Ｘ３、Ｘ４がある。領域ＩＤがＸ１である場合、外部包含領域としてＸ０があり、内部包含領域としてＸ２、Ｘ３があり、部分重複領域としてＸ４がある。領域ＩＤがＸ２である場合、外部包含領域としてＸ０、Ｘ１があり、内部包含領域としてＸ３があり、部分重複領域としてＸ４がある。領域ＩＤがＸ３である場合、外部包含領域としてＸ０、Ｘ１、Ｘ２があり、部分重複領域としてＸ４がある。領域ＩＤがＸ４である場合、外部包含領域としてＸ０があり、部分重複領域としてＸ１、Ｘ２、Ｘ３がある。このように、領域データＤＢ１２２は、複数の領域ＩＤが示す領域のそれぞれについて、領域と重複する内部包含領域、外部包含領域および部分重複領域のそれぞれの領域ＩＤを管理する。
【００３０】
図１に戻って、制御部１３は、リクエスト受付部１３１、レスポンス転送部１３２、ツリー検索部１３３、外包領域結果追加部１３４、重複領域検索部１３５および重複領域設定部１３６を有する。制御部１３は、例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）等の集積回路またはＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）等の電子回路である。
【００３１】
リクエスト受付部１３１は、通信インタフェース１１によって受信された検索リクエストを受け付ける。レスポンス転送部１３２は、検索リクエストに対応する領域検索応答を通信インタフェース１１を介して転送する。
【００３２】
ツリー検索部１３３は、領域インデックスＤＢ１２１を用いて、所定の位置情報を含む領域を検索する。例えば、ツリー検索部１３３は、リクエスト受付部１３１によって受け付けられた領域検索要求の中から位置情報を取り出す。そして、ツリー検索部１３３は、ルートノードから子ノードへトップダウンに辿り順番にノードを選択し、選択したノードの子ノードに、取り出した位置情報を含むものがあるか否かを、領域インデックスＤＢ１２１を用いて判定する。そして、ツリー検索部１３３は、位置情報を含む子ノードがあれば、かかる子ノードを選択候補ノードとして追加する。さらに、ツリー検索部１３３は、選択候補ノードとして追加されたノードを１つずつ選択し、選択したノードが葉ノードであれば、葉ノードにある領域データ（領域ＩＤ）の内、取り出した位置情報を含むものがあるか否かを、領域インデックスＤＢ１２１を用いて判定する。そして、ツリー検索部１３３は、領域データの内、取り出した位置情報を含むものが１つでもあれば、いずれか１つの領域データを検索結果に追加し、領域インデックスＤＢ１２１を用いた検索を終了する。なお、ツリー検索部１３３は、位置情報を含む領域データが複数ある場合には、領域データの内部包含領域および部分重複領域の数の和が最も小さい領域データを検索結果に追加することが望ましい。これは、後述する重複領域検索部１３５がさらに検索結果に追加した領域データの重複領域から位置情報を含む領域を検索することとなるので、検索対象となる領域を減らすべく、検索対象となる重複領域の数が最も小さい領域データを検索結果に追加するものである。
【００３３】
外包領域結果追加部１３４は、検索結果に追加した領域データの外部包含領域が示す領域データを検索対象としないで、検索結果に追加する。すなわち、外報領域結果追加部１３４は、検索結果に追加した領域データが位置情報を含むものであるので、位置情報を含む領域データを包含する外部包含領域について検索するまでもなく、位置情報を含むものであると判断する。これにより、位置情報を含む領域データの外部包含領域の検索処理を省略できるので、検索処理を高速化できる。
【００３４】
重複領域検索部１３５は、ツリー検索部１３３によって所定の位置情報を含む領域を検索できた場合、検索できた領域（以降、「検索領域」という。）の内部包含領域および部分重複領域の中から位置情報を含む領域を検索する。例えば、重複領域検索部１３５は、ツリー検索部１３３によって追加された検索結果から領域データ（領域ＩＤ）を取り出す。そして、重複領域検索部１３５は、領域データＤＢ１２２から、取り出した領域ＩＤに対応する内部包含１２２ｄおよび部分重複１２２ｆの領域ＩＤを読み出す。そして、重複領域検索部１３５は、読み出した領域ＩＤを１つずつ選択し、選択した領域ＩＤの領域が位置情報を含むか否かを判定する。そして、重複領域検索部１３５は、判定結果に基づき、位置情報を含む領域の領域ＩＤを検索結果に追加する。
【００３５】
なお、重複領域検索部１３５は、検索領域の内部包含領域の中から位置情報を含む領域を検索できたとき、検索領域における残りの検索対象である重複領域の数と新たに検索できた領域における検索対象である重複領域の数とを比較するようにしても良い。ここで、領域における検索対象である重複領域とは、領域の内部包含領域および部分重複領域を意味する。そして、重複領域検索部１３５は、検索対象の数が小さい方の領域の重複領域の検索に切り替える。すなわち、重複領域検索部１３５は、検索領域における残りの検索対象の数が新たに検索できた領域における検索対象の数より大きい場合、検索領域における残りの検索対象の検索を中止し、新たに検索できた領域における検索対象の検索を実行する。一方、重複領域検索部１３５は、検索領域における残りの検索対象の数が新たに検索できた領域における検索対象の数より小さいまたは等しい場合、検索領域における残りの検索対象の検索を継続して実行する。つまり、重複領域検索部１３５は、検索効率を上げるために、検索対象の数が小さい方の領域の重複領域を検索するのである。
【００３６】
重複領域設定部１３６は、領域データＤＢ１２２に重複領域の情報を設定する。なお、重複領域設定部１３６は、領域インデックスＤＢ１２１に新たな領域の情報を追加する際に、この追加領域の情報として追加領域と重複する重複領域の情報を領域データＤＢ１２２に追加するようにすれば良い。例えば、重複領域設定部１３６は、ルートノードから子ノードに向かって順番にノードを選択する。そして、重複領域設定部１３６は、選択したノードの子ノードに、追加領域を含むものがあるか否かを、領域インデックスＤＢ１２１を用いて判定する。そして、重複領域設定部１３６は、追加領域を含む子ノードを選択候補ノードとして追加する。そして、重複領域設定部１３６は、選択候補ノードとして追加されたノードを１つずつ選択し、選択したノードが葉ノードであれば、葉ノードにある領域データの内、追加領域と重複する部分がある領域データを重複領域として抽出する。
【００３７】
さらに、重複領域設定部１３６は、抽出した重複領域を１つずつ選択する。そして、重複領域設定部１３６は、選択した重複領域が追加領域の内側に完全に含まれる場合、選択した重複領域の領域ＩＤを追加領域の内部包含領域として、領域データＤＢ１２２に追加する。加えて、重複領域設定部１３６は、追加領域の領域ＩＤを、選択した重複領域の外部包含領域として、領域データＤＢ１２２に追加する。そして、重複領域設定部１３６は、追加領域が、選択した重複領域の内側に完全に含まれる場合、選択した重複領域の領域ＩＤを追加領域の外部包含領域として、領域データＤＢ１２２に追加する。加えて、重複領域設定部１３６は、追加領域の領域ＩＤを、選択した重複領域の内部包含領域として、領域データＤＢ１２２に追加する。そして、重複領域設定部１３６は、追加領域が、選択した重複領域と互いに部分的に重複している場合、選択した重複領域の領域ＩＤを追加領域の部分重複領域として、領域データＤＢ１２２に追加する。加えて、重複領域設定部１３６は、追加領域の領域ＩＤを、選択した重複領域の部分重複領域として、領域データＤＢ１２２に追加する。
【００３８】
なお、重複領域設定部１３６は、領域の領域ＩＤを内部包含領域として領域データＤＢ１２２に追加する場合、領域データＤＢ１２２の内部包含１２２ｄ内に追加する位置を考慮するようにしても良い。すなわち、重複領域検索部１３５は、検索領域の内部包含領域の中から位置情報を含む領域を検索するが、検索する処理効率を上げるために内部包含領域を選択する順序を考慮するものである。
【００３９】
１つの例として、重複領域検索部１３５が、検索領域と重複する内部包含領域内に位置情報を含む確率が高い順に、内部包含領域を選択できるようにしても良い。例えば、重複領域設定部１３６は、領域データＤＢ１２２の内部包含１２２ｄ内に内部包含領域として追加する領域の領域ＩＤを、領域ＩＤの領域の面積が大きい順となるように追加する。
【００４０】
また、別の例として、重複領域検索部１３５が、検索領域と重複する内部包含領域内に位置情報を含むときに当該内部包含領域の重複領域の検索に切り替えた場合に削減できる処理量が多い順に内部包含領域を選択できるようにしても良い。例えば、重複領域設定部１３６は、検索領域における検索対象の数として、検索領域が包含する内部包含領域の数および検索領域の部分重複領域の数の和を算出する。そして、重複領域設定部１３６は、追加する内部包含領域における検索対象の数として、当該領域が内部に包含する内部包含領域の数および当該領域の部分重複領域の数の和を算出する。そして、重複領域設定部１３６は、領域データＤＢ１２２の内部包含１２２ｄ内に内部包含領域として追加する領域の領域ＩＤを、算出した和の差分が大きい順となるように追加する。
【００４１】
さらに、別の例として、重複領域検索部１３５は、上記２つの例を併合するように内部包含領域を選択できるようにしても良い。例えば、重複領域設定部１３６は、追加する内部包含領域の面積と、検索領域における検索対象の数と当該内部包含領域における検索対象の数との差分との積を算出する。そして、重複領域設定部１３６は、領域データＤＢ１２２の内部包含１２２ｄ内に内部包含領域として追加する領域の領域ＩＤを、算出した結果値の大きい順となるように追加する。
【００４２】
ここで、重複領域設定部１３６によって領域データＤＢ１２２の内部包含１２２ｄ内に内部包含領域の領域ＩＤが追加される場合の具体例を、図８を参照して説明する。図８は、重複領域設定における内部包含領域追加の具体例を示す図である。なお、図８は、検索領域と重複する内部包含領域内に位置情報を含む確率と、検索領域と重複する内部包含領域の重複領域の検索に切り替えた場合に削減できる処理量とを考慮した順に内部包含領域を選択できるようにする場合の例である。
【００４３】
図８左側に示すように、検索領域Ａには、それぞれ領域ＩＤをＸ１、Ｘ２、Ｘ３とした内部包含領域が存在している。図８右側に示すＩＤは、各領域における領域ＩＤであるものとする。Ｉｎは、各領域における検索対象である内部包含領域および部分重複領域の数の和であるものとする。Ｓｎは、各領域における面積であるものとする。Ｉａは、検索領域Ａの検索対象の数であるものとし、ここでは、「１０」とする。
【００４４】
このような前提のもと、領域ＩＤがＸ１である領域について、Ｉｎが「６」、ＩａとＩｎとの差分が「４」、Ｓｎが「８００」を示している。そして、重複領域設定部１３６は、Ｘ１である領域について、領域Ｘ１の面積「８００」と、検索領域Ａにおける検索対象の数と領域Ｘ１における検索対象の数との差分「４」との積「３２００」を、検索を優先させるか否かを示す評価値として算出する。また、領域ＩＤがＸ２である領域について、Ｉｎが「４」、ＩａとＩｎとの差分が「６」、Ｓｎが「６５０」を示している。そして、重複領域設定部１３６は、Ｘ２である領域について、領域Ｘ２の面積「６５０」と、検索領域Ａにおける検索対象の数と領域Ｘ２における検索対象の数との差分「６」との積「３９００」を、評価値として算出する。また、領域ＩＤがＸ３である領域について、Ｉｎが「０」、ＩａとＩｎとの差分が「１０」、Ｓｎが「２５」を示している。そして、重複領域設定部１３６は、Ｘ３である領域について、領域Ｘ３の面積「２５」と、検索領域Ａにおける検索対象の数と領域Ｘ３における検索対象の数との差分「１０」との積「２５０」を、評価値として算出する。
【００４５】
そして、重複領域設定部１３６は、領域データＤＢ１２２に記憶された領域ＩＤが「Ａ」を示す内部包含１２２ｄ内に内部包含領域として追加する領域の領域ＩＤを、評価値の大きい順となるように追加する。仮にＸ１が追加する領域であるとすると、重複領域設定部１３６は、Ｘ２、Ｘ１、Ｘ３の順となるようにＸ１を追加する。Ｘ２が追加する領域であるとすると、重複領域設定部１３６は、Ｘ２、Ｘ１、Ｘ３の順となるようにＸ２を追加する。これにより、重複領域検索部１３５は、Ｐｑが位置情報である場合、ツリー検索部１３３によってＰｑを含む領域を検索できた場合、検索できた領域（検索領域Ａ）の内部包含領域をＸ２、Ｘ１、Ｘ３の順でＰｑを含む領域を検索できる。この結果、重複領域検索部１３５は、内部包含領域の早い順でヒットできる確率が高いので、ヒットした内部包含領域の重複領域の検索に切り替えれば検索に要する処理量を削減することが可能となる。
【００４６】
なお、重複領域設定部１３６は、評価値が同じ場合には、面積が大きいものを先の順にしても良いし、検索領域における検索対象の数と検索領域が包含する各内部包含領域における検索対象の数との差分が大きいものを先の順にしても良い。
【００４７】
また、重複領域設定部１３６は、領域を追加する際、追加する領域の評価値を算出し、算出した評価値を、事前に算出された他の内部包含領域の評価値と比較し、追加する領域の領域ＩＤを評価値に該当する位置に追加するようにしても良い。この場合、領域データＤＢ１２２には、領域の領域ＩＤ毎に評価値を設定する項目を用意しておき、領域が追加される度に評価値を算出し、算出した値を当該項目に設定するようにすれば良い。
【００４８】
また、重複領域設定部１３６は、領域を追加する際、追加する領域とともに他の内部包含領域の評価値を算出し、算出したそれぞれの評価値を比較し、追加する領域の領域ＩＤを評価値に該当する位置に追加するようにしても良い。
【００４９】
また、領域が追加される毎に各内部包含領域の評価値は変化する。このため、重複領域設定部１３６は、内部包含領域の追加する際にはリストの末尾に追加しておき、定期的に全ノードの内部包含領域を評価してソートする処理を実施しても良い。この場合、ソート処理は重複領域の追加削除処理が少ない時に行うことが望ましい。
【００５０】
［領域検索要求のデータの一例］
次に、リクエスト受付部１３１が通信インタフェース１１を介して受け付ける領域検索要求の内容について、図９を参照して説明する。図９は、領域検索要求の内容の一例を示す図である。図９に示すように、領域検索要求には、センサーを識別するセンサーＩＤと、緯度および経度とを含む。緯度および経度は、位置情報の一例である。図９の例では、センサーＩＤとして「Ｓｅｎｓｏｒ０００Ｘ」、緯度として「３５．４１３４」、経度として「１３９．６２５２」と設定している。なお、領域検索要求には、センサーＩＤを含むものとしたが、これに限定されず、領域検索を要求する端末装置の装置ＩＤであっても良いし、領域検索を要求する携帯電話の携帯電話番号であっても良い。
【００５１】
［領域検索応答のデータの一例］
次に、レスポンス転送部１３２が通信インタフェース１１を介して出力する領域検索応答の内容について、図１０を参照して説明する。図１０は、領域検索応答の内容の一例を示す図である。図１０に示すように、領域検索応答は、領域検索の結果を示す領域情報のリストであり、領域情報に対応する領域ＩＤと領域名とを含む。図１０の例では、領域ＩＤとして「Ｘ０」、領域名として「ＡＡＡ区ＢＢＢ町付近」と設定している。また、領域ＩＤとして「Ｘ４」、領域名として「ＦＦＦ駅周辺」と設定している。なお、領域情報のリストには、領域ＩＤと領域名とを含むものとしたが、これに限定されず、領域の位置、大きさや形状等を含むものとしても良い。
【００５２】
［リクエスト受付処理の手順］
次に、検索に係るリクエスト受付処理の手順について、図１１を参照して説明する。図１１は、検索に係るリクエスト受付処理の手順を示すフローチャートである。
【００５３】
まず、リクエスト受付部１３１は、領域検索要求を受け付けたか否かを判定する（ステップＳ１０Ａ）。そして、領域検索要求を受け付けていないと判定した場合（ステップＳ１０Ａ；Ｎｏ）、リクエスト受付部１３１は、領域検索要求を受け付けるまで、判定処理を繰り返す。一方、領域検索要求を受け付けたと判定した場合（ステップＳ１０Ａ；Ｙｅｓ）、リクエスト受付部１３１は、検索処理を実行する（ステップＳ１０Ｂ）。
【００５４】
そして、リクエスト受付部１３１は、リクエスト受付処理を終了したか否かを判定する（ステップＳ１０Ｃ）。リクエスト受付処理を終了していないと判定した場合（ステップＳ１０Ｃ；Ｎｏ）、リクエスト受付部１３１は、ステップＳ１０Ａに移行する。一方、リクエスト受付処理を終了したと判定した場合（ステップＳ１０Ｃ；Ｙｅｓ）、リクエスト受付部１３１は、処理を終了する。
【００５５】
［検索処理の手順］
次に、図１１のステップＳ１０Ｂに示した検索処理について、図１２および図１３を参照して説明する。図１２は、実施例１に係る検索処理の手順を示すフローチャートであり、図１３は、実施例１に係る検索処理内の重複領域判定処理の手順を示すフローチャートである。なお、図１２および図１３の例では、領域検索要求に含まれる位置情報を検索座標として説明する。
【００５６】
リクエスト受付部１３１によって領域検索要求が受け付けられると、ツリー検索部１３３は、領域インデックスＤＢ１２１に基づいて、ルートノードを選択する（ステップＳ１１）。そして、ツリー検索部１３３は、選択した選択ノードが葉ノードであるか否かを判定する（ステップＳ１２）。
【００５７】
選択ノードが葉ノードでないと判定した場合（ステップＳ１２；Ｎｏ）、ツリー検索部１３３は、選択ノードの子ノードに検索座標を含むものがあるか否かを、領域インデックスＤＢ１２１を用いて判定する（ステップＳ１３）。一例として、ツリー検索部１３３は、領域インデックスＤＢ１２１に基づいて、選択ノードの子ノードリストを読み出し、読み出した子ノードリストに含まれるそれぞれの子ノードの矩形領域を読み出す。そして、ツリー検索部１３３は、読み出したそれぞれの子ノードの矩形領域に、検索座標を含むものがあるか否かを判定する。
【００５８】
選択ノードの子ノードに検索座標を含むものがあると判定した場合（ステップＳ１３；Ｙｅｓ）、ツリー検索部１３３は、検索座標を含む子ノードを選択候補ノードに追加し（ステップＳ１４）、ステップＳ１５に移行する。一方、選択ノードの子ノードに検索座標を含むものがないと判定した場合（ステップＳ１３；Ｎｏ）、ツリー検索部１３３は、ステップＳ１５に移行する。
【００５９】
続いて、ツリー検索部１３３は、全ての選択候補ノードの検索を終えたか否かを判定する（ステップＳ１５）。全ての選択候補ノードの検索を終えていないと判定した場合（ステップＳ１５；Ｎｏ）、ツリー検索部１３３は、選択候補ノード内の１つの未検索ノードを選択し（ステップＳ１６）、ステップＳ１２に移行する。
【００６０】
ステップＳ１２では、選択ノードが葉ノードであると判定した場合（ステップＳ１２；Ｙｅｓ）、ツリー検索部１３３は、選択した葉ノードが持つ領域データの内、検索座標を含むものがあるか否かを判定する（ステップＳ１７）。一例として、ツリー検索部１３３は、領域インデックスＤＢ１２１に基づいて、葉ノードであるノードのデータリストを読み出し、読み出したデータリストに含まれる領域データへのポインタ、例えば領域ＩＤを取り出す。そして、ツリー検索部１３３は、領域データＤＢ１２２に基づいて、取り出した領域ＩＤに対応する領域情報１２２ｃに検索座標を含むものがあるか否かを判定する。
【００６１】
選択した葉ノードが持つ領域データの内、検索座標を含むものがないと判定した場合（ステップＳ１７；Ｎｏ）、ツリー検索部１３３は、次の選択候補ノードを検索すべく、ステップＳ１５に移行する。
【００６２】
一方、選択した葉ノードが持つ領域データの内、検索座標を含むものがあると判定した場合（ステップＳ１７；Ｙｅｓ）、ツリー検索部１３３は、該当領域データの内、内部包含領域および部分重複領域の数が最小の領域データを検索結果に追加する（ステップＳ１８）。一例として、ツリー検索部１３３は、領域データＤＢ１２２に記憶された、該当領域データの領域ＩＤ１２２ａに対応する内部包含１２２ｄおよび部分重複１２２ｆに基づいて、内部包含領域の数および部分重複領域の数を取得する。そして、ツリー検索部１３３は、該当領域データの領域ＩＤ１２２ａ毎に、取得した内部包含領域および部分重複領域の数の和を算出する。そして、ツリー検索部１３３は、該当領域データの領域ＩＤ１２２ａ毎に算出した和が最小のものを検索結果に追加する。ここで、領域インデックスＤＢ１２１を用いた検索を終了し、重複領域判定処理に移行する。
【００６３】
［重複領域判定処理の手順］
重複領域判定処理では、外包領域結果追加部１３４が、検索結果に追加した該当領域データの外部包含領域の領域データ（領域ＩＤ）を、さらに検索結果に追加する（ステップＳ３１）。該当領域データの外部包含領域は、該当領域データの領域を包含するので、検索座標を含むか否かの検索処理を行うまでもなく、検索座標を含むからである。
【００６４】
続いて、重複領域検索部１３５は、該当領域データの全内部包含領域の判定を終えたか否かを判定する（ステップＳ３２）。該当領域データの全内部包含領域の判定を終えていないと判定した場合（ステップＳ３２；Ｎｏ）、重複領域検索部１３５は、該当領域データの内部包含領域の領域データを１つ選択する（ステップＳ３３）。そして、重複領域検索部１３５は、選択した内部包含領域が検索座標を含むか否かを判定する（ステップＳ３４）。選択した内部包含領域が検索座標を含むと判定した場合（ステップＳ３４；Ｙｅｓ）、重複領域検索部１３５は、含むと判定した内部包含領域の領域ＩＤを検索結果に追加し（ステップＳ３５）、ステップＳ３２に移行する。
【００６５】
一方、選択した内部包含領域が検索座標を含まないと判定した場合（ステップＳ３４；Ｎｏ）、重複領域検索部１３５は、ステップＳ３２に移行する。
【００６６】
続いて、該当領域データの全内部包含領域の判定を終えたと判定した場合（ステップＳ３２；Ｙｅｓ）、重複領域検索部１３５は、該当領域データの全部分重複領域の判定を終えたか否かを判定する（ステップＳ３６）。該当領域データの全部分重複領域の判定を終えていないと判定した場合（ステップＳ３６；Ｎｏ）、重複領域検索部１３５は、該当領域データの部分重複領域の領域データを１つ選択する（ステップＳ３７）。そして、重複領域検索部１３５は、選択した部分重複領域が検索座標を含むか否かを判定する（ステップＳ３８）。選択した部分重複領域が検索座標を含むと判定した場合（ステップＳ３８；Ｙｅｓ）、重複領域検索部１３５は、含むと判定した部分重複領域の領域ＩＤを検索結果に追加し（ステップＳ３９）、ステップＳ３６に移行する。
【００６７】
続いて、該当領域データの全部分重複領域の判定を終えたと判定した場合（ステップＳ３６；Ｙｅｓ）、重複領域検索部１３５は、ステップＳ１９に移行する。そして、重複領域検索部１３５は、作成した検索結果を問合せ側へ返答すべく、レスポンス転送部１３２に出力する（ステップＳ１９）。その後、レスポンス転送部１３２は、検索結果を領域検索応答として領域検索要求の問合せ側へ送信する。
【００６８】
ステップＳ１５では、全ての選択候補ノードの検索を終えていると判定した場合（ステップＳ１５；Ｙｅｓ）、ツリー検索部１３３は、選択ノードに検索座標を含むものがないので、検索結果無しとして問合せ側へ返答すべく、レスポンス転送部１３２に出力する（ステップＳ２０）。その後、レスポンス転送部１３２は、検索結果を領域検索応答として領域検索要求の問合せ側へ送信する。
【００６９】
ところで、検索処理内の重複領域判定処理は、該当領域データの内部包含領域の中に検索座標を含むものがあると判定したとき、該当領域データにおける未判定の重複領域の数と、検索座標を含む内部包含領域における重複領域の数とを比較するようにしても良い。そして、重複領域判定処理は、比較した結果、検索対象である重複領域の数が小さい方の領域の重複領域の検索に切り替える。
【００７０】
［重複領域判定処理の変形例の手順］
そこで、重複領域判定処理の変形例として、該当領域データにおける未判定の重複領域の数と、検索座標を含む内部包含領域における重複領域の数とを比較し、検索対象である重複領域の数が小さい方の領域の重複領域の検索に切り替える場合の手順を説明する。図１４は、実施例１に係る検索処理内の重複領域判定処理（変形例）の手順を示すフローチャートである。なお、図１３に示す重複領域判定処理と同一の手順については同一符号を示すことで、その重複する動作の説明については簡略する。
【００７１】
変形例の重複領域判定処理では、外包領域結果追加部１３４が、検索結果に追加した該当領域データの外部包含領域の領域データ（領域ＩＤ）を、さらに検索結果に追加する（ステップＳ３１）。
【００７２】
続いて、重複領域検索部１３５は、該当領域データの全内部包含領域の判定を終えたか否かを判定する（ステップＳ３２）。該当領域データの全内部包含領域の判定を終えていないと判定した場合（ステップＳ３２；Ｎｏ）、重複領域検索部１３５は、該当領域データの内部包含領域の領域データを１つ選択する（ステップＳ３３）。そして、重複領域検索部１３５は、選択した内部包含領域が検索座標を含むか否かを判定する（ステップＳ３４）。
【００７３】
選択した内部包含領域が検索座標を含むと判定した場合（ステップＳ３４；Ｙｅｓ）、重複領域検索部１３５は、選択した内部包含領域の検索対象の数が該当領域データの未判定の検索対象の数より小さいか否かを判定する。すなわち、重複領域検索部１３５は、選択した内部包含領域の内部包含領域数と部分重複領域数の和が該当領域データの未判定の内部包含領域数と部分重複領域数の和より小さいか否かを判定する（ステップＳ４１）。
【００７４】
選択した内部包含領域の内部包含領域数と部分重複領域数の和が該当領域データの未判定の内部包含領域数と部分重複領域数の和より小さくない場合（ステップＳ４１；Ｎｏ）、重複領域検索部１３５は、選択した内部包含領域の領域ＩＤを、さらに検索結果に追加する（ステップＳ３５）。すなわち、重複領域検索部１３５は、検索対象の数が小さい方の該当領域データの重複領域を継続して検索する。そして、重複領域検索部１３５は、ステップＳ３２に移行する。
【００７５】
一方、選択した内部包含領域の内部包含領域数と部分重複領域数の和が該当領域データの未判定の内部包含領域数と部分重複領域数の和より小さい場合（ステップＳ４１；Ｙｅｓ）、重複領域検索部１３５は、選択した内部包含領域を新しい該当領域データに設定する（ステップＳ４２）。すなわち、重複領域検索部１３５は、検索対象の数が小さい方の、選択した内部包含領域の重複領域の検索に切り替える。そして、重複領域検索部１３５は、検索結果をクリアし（ステップＳ４３）、ステップＳ３１に移行する。
【００７６】
続いて、該当領域データの全内部包含領域の判定を終えたと判定した場合（ステップＳ３２；Ｙｅｓ）、重複領域検索部１３５は、該当領域データの全部分重複領域の判定を終えたか否かを判定する（ステップＳ３６）。該当領域データの全部分重複領域の判定を終えていないと判定した場合（ステップＳ３６；Ｎｏ）、重複領域検索部１３５は、該当領域データの部分重複領域の領域データを１つ選択する（ステップＳ３７）。そして、重複領域検索部１３５は、選択した部分重複領域が検索座標を含むか否かを判定する（ステップＳ３８）。選択した部分重複領域が検索座標を含むと判定した場合（ステップＳ３８；Ｙｅｓ）、重複領域検索部１３５は、含むと判定した部分重複領域の領域ＩＤを検索結果に追加し（ステップＳ３９）、ステップＳ３６に移行する。
【００７７】
続いて、該当領域データの全部分重複領域の判定を終えたと判定した場合（ステップＳ３６；Ｙｅｓ）、重複領域検索部１３５は、ステップＳ１９に移行する。
【００７８】
［重複領域設定処理の手順］
次に、実施例１に係る重複領域設定処理の手順について、図１５、図１６を参照して説明する。図１５は、実施例１に係る重複領域設定処理の手順を示すフローチャート（１）であり、図１６は、実施例１に係る重複領域設定処理の手順を示すフローチャート（２）である。なお、リクエスト受付部１３１は、領域データＤＢ１２２に追加する追加領域の領域情報を受け付け、受け付けた領域情報を重複領域設定部１３６に引き渡したものとする。
【００７９】
すると、重複領域設定部１３６は、領域インデックスＤＢ１２１に基づいて、ルートノードを選択する（ステップＳ５１）。そして、重複領域設定部１３６は、選択した選択ノードが葉ノードであるか否かを判定する（ステップＳ５２）。
【００８０】
選択ノードが葉ノードであると判定した場合（ステップＳ５２；Ｙｅｓ）、重複領域設定部１３６は、選択ノードにある領域データの内、追加領域と重なる領域データの領域を重複領域として抽出する（ステップＳ５３）。一例として、重複領域設定部１３６は、領域インデックスＤＢ１２１に基づいて、選択ノードのデータリストを読み出し、読み出したデータリストに含まれる領域データへのポインタ、例えば領域ＩＤを取り出す。そして、重複領域設定部１３６は、領域データＤＢ１２２に基づいて、取り出した領域ＩＤの内、追加領域と重なる部分がある領域ＩＤを重複領域として抽出する。そして、重複領域設定部１３６は、ステップＳ５６に移行する。
【００８１】
一方、選択ノードが葉ノードでないと判定した場合（ステップＳ５２；Ｎｏ）、重複領域設定部１３６は、領域インデックスＤＢ１２１に基づいて、選択ノードの子ノードに追加領域と重なるものがあるか否かを判定する（ステップＳ５４）。選択ノードの子ノードに追加領域と重なるものがあると判定した場合（ステップＳ５４；Ｙｅｓ）、重複領域設定部１３６は、重なった子ノードを選択候補ノードに加え（ステップＳ５５）、ステップＳ５６に移行する。また、選択ノードの子ノードに追加領域と重なるものがないと判定した場合（ステップＳ５４；Ｎｏ）、重複領域設定部１３６は、ステップＳ５６に移行する。
【００８２】
続いて、重複領域設定部１３６は、全ての選択候補ノードの検索を終えたか否かを判定する（ステップＳ５６）。全ての選択候補ノードの検索を終えていないと判定した場合（ステップＳ５６；Ｎｏ）、重複領域設定部１３６は、選択候補ノード内の１つの未検索ノードを選択し（ステップＳ５７）、ステップＳ５２に移行する。
【００８３】
一方、全ての選択候補ノードの検索を終えたと判定した場合（ステップＳ５６；Ｙｅｓ）、重複領域設定部１３６は、抽出済みの全重複領域の選択が終了したか否かを判定する（ステップＳ６１）。抽出済みの全重複領域の選択が終了したと判定した場合（ステップＳ６１；Ｙｅｓ）、重複領域設定部１３６は、重複領域設定処理を終了する。
【００８４】
一方、抽出済みの全重複領域の選択が終了していないと判定した場合（ステップＳ６１；Ｎｏ）、重複領域設定部１３６は、抽出済みの重複領域から未選択の重複領域を１つ選択する（ステップＳ６２）。そして、重複領域設定部１３６は、選択した重複領域が追加領域の内側に完全に包含されるか否かを判定する（ステップＳ６３）。
【００８５】
選択した重複領域が追加領域の内側に完全に含まれると判定した場合（ステップＳ６３；Ｙｅｓ）、重複領域設定部１３６は、選択した重複領域を、追加領域の内部包含項目に追加する（ステップＳ６４）。例えば、重複領域設定部１３６は、選択した重複領域の領域ＩＤを、領域データＤＢ１２２の追加領域の領域ＩＤに対応する内部包含１２２ｄに追加する。加えて、重複領域設定部１３６は、追加領域を、選択した重複領域の外部包含項目に追加する（ステップＳ６５）。例えば、重複領域設定部１３６は、追加領域の領域ＩＤを、領域データＤＢ１２２の選択した重複領域の領域ＩＤに対応する外部包含１２２ｅに追加する。そして、重複領域設定部１３６は、ステップＳ６１に移行する。
【００８６】
一方、選択した重複領域が追加領域の内側に完全に含まれないと判定した場合（ステップＳ６３；Ｎｏ）、重複領域設定部１３６は、追加領域が、選択した重複領域の内側に完全に含まれるか否かを判定する（ステップＳ６６）。追加領域が、選択した重複領域の内側に完全に含まれると判定した場合（ステップＳ６６；Ｙｅｓ）、重複領域設定部１３６は、選択した重複領域を、追加領域の外部包含項目に追加する（ステップＳ６７）。例えば、重複領域設定部１３６は、選択した重複領域の領域ＩＤを、領域データＤＢ１２２の追加領域の領域ＩＤに対応する外部包含１２２ｅに追加する。加えて、重複領域設定部１３６は、追加領域を、選択した重複領域の内部包含項目に追加する（ステップＳ６８）。例えば、重複領域設定部１３６は、追加領域の領域ＩＤを、領域データＤＢ１２２の選択した重複領域の領域ＩＤに対応する内部包含１２２ｄに追加する。そして、重複領域設定部１３６は、ステップＳ６１に移行する。
【００８７】
一方、追加領域が、選択した重複領域の内側に完全に含まれないと判定した場合（ステップＳ６６；Ｎｏ）、重複領域設定部１３６は、選択した重複領域を、追加領域の部分重複項目に追加する（ステップＳ６９）。例えば、重複領域設定部１３６は、選択した重複領域の領域ＩＤを、領域データＤＢ１２２の追加領域の領域ＩＤに対応する部分重複１２２ｆに追加する。加えて、重複領域設定部１３６は、追加領域を、選択した重複領域の部分重複項目に追加する（ステップＳ７０）。例えば、重複領域設定部１３６は、追加領域の領域ＩＤを、領域データＤＢ１２２の選択した重複領域の領域ＩＤに対応する部分重複１２２ｆに追加する。そして、重複領域設定部１３６は、ステップＳ６１に移行する。
【００８８】
［内部包含項目に追加する処理手順］
次に、図１６のステップＳ６４およびステップＳ６８に示した内部包含項目に追加する処理について、図１７を参照して説明する。図１７は、内部包含項目に追加する処理手順の一例を示すフローチャートである。なお、図１７では、「追加先」とは、内部包含項目に追加される先の領域を意味し、「追加対象」とは、内部包含項目に追加する対象となる領域を意味する。図１６のステップＳ６４では、選択した重複領域が「追加対象」であり、追加領域が「追加先」である。図１６のステップＳ６８では、追加領域が「追加対象」であり、選択した重複領域が「追加先」である。
【００８９】
重複領域設定部１３６は、追加先の領域データ（領域ＩＤ）において検索対象である、内部包含領域および部分重複領域の数の和（Ｉａ）を算出する（ステップＳ８１）。そして、重複領域設定部１３６は、追加対象の領域データ（領域ＩＤ）において検索対象である、内部包含領域および部分重複領域の数の和（Ｉｎ）を算出する（ステップＳ８２）。そして、重複領域設定部１３６は、双方の検索対象の数の差（Ｉａ−Ｉｎ）を算出する（ステップＳ８３）。
【００９０】
続いて、重複領域設定部１３６は、追加対象の領域データにおける領域の面積（Ｓｎ）と算出した検索対象の数の差との積を算出し、算出した値を評価値（Ｅｎ）とする（ステップＳ８４）。ここで、評価値とは、検索を優先させるか否かを示す数値であり、数値が大きければ大きい程、検索をより優先させる。
【００９１】
そして、重複領域設定部１３６は、追加先における内部包含項目（内部包含１２２ｄ）内の評価値（Ｅｎ）に該当する位置に追加対象の領域データ（領域ＩＤ）を追加する（ステップＳ８５）。例えば、重複領域設定部１３６は、領域データＤＢ１２２の内部包含１２２ｄ内に追加対象の領域ＩＤを、評価値の大きい順となるように追加する。
【００９２】
［実施例１の効果］
上記実施例１によれば、領域データＤＢ１２２は、複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶する。そして、領域検索サーバ１は、領域インデックスＤＢ１２１に記憶されたインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索する。そして、領域検索サーバ１は、該位置を含む領域を検索できた場合、領域データＤＢ１２２に基づいて、検索できた領域を示す検索領域と重複する重複領域のうち検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索する。さらに、領域検索サーバ１は、検索領域を包含する重複領域の情報とともに、検索できた領域の情報を出力する。かかる構成によれば、領域検索サーバ１は、インデックスツリーを用いて、所定の位置を含む領域を検索できた場合、インデックスツリーを用いた検索を終了し、検索できた検索領域の重複領域を用いた検索に移行する。さらに、領域検索サーバ１は、検索領域の重複領域を用いた検索のうち検索領域を包含する重複領域の検索を除外する。このため、領域検索サーバ１は、インデックスツリーを用いて所定の位置を含む領域を１個検索できれば、検索できた検索領域の重複領域を用いて該位置を含む領域を検索するので、該位置を含む領域の検索時間を高速化できる。加えて、領域検索サーバ１は、検索領域の重複領域のうち検索領域を包含する重複領域を検索対象から除くので、さらに該位置を含む領域の検索時間を高速化できる。
【００９３】
また、上記実施例１によれば、領域データＤＢ１２２は、複数の領域のそれぞれについて領域を包含する外部包含領域の情報、領域が包含する内部包含領域の情報および領域と部分的に重複する部分重複領域の情報を記憶する。そして、領域検索サーバ１は、領域データＤＢ１２２に基づいて、検索領域と重複する内部包含領域および部分重複領域の中から該位置を含む領域を検索する。かかる構成によれば、領域検索サーバ１は、検索領域の重複領域のうち内部包含領域および部分重複領域の中から該位置を含む領域を検索するので、検索領域の全ての重複領域を検索対象とする場合と比べて検索効率を向上させることができる。
【００９４】
ここで、検索領域の重複領域のうち内部包含領域および部分重複領域の中から領域検索が要求された位置を含む領域を検索する場合と、検索領域の全ての重複領域の中から該位置を含む領域を検索する場合との領域検索の検索回数の比較について説明する。
【００９５】
１つの例として、検索領域の内部包含領域の数が３０個、外部包含領域の数が３０個、部分重複領域の数が８０個の場合について説明する。かかる場合、検索領域の全ての重複領域の中から該位置を含む領域を検索する検索回数Ａ１は、以下のようになる。
Ａ１＝３０＋３０＋８０＝１４０
すなわち、Ａ１は、該位置が内部包含領域に含まれるかを検索する３０回と、該位置が外部包含領域に含まれるかを検索する３０回と、該位置が部分重複領域に含まれるかを検索する８０回とを加算した値１４０となる。
【００９６】
一方、検索領域の重複領域のうち内部包含領域および部分重複領域の中から該位置を含む領域を検索する検索回数Ｂ１は、以下のようになる。
Ｂ１＝３０＋８０＝１１０
すなわち、Ｂ１は、該位置が内部包含領域に含まれるかを検索する３０回と、該位置が部分重複領域に含まれるかを検索する８０回とを加算した値１１０となる。検索回数Ｂ１は、検索回数Ａ１と比べて、約２０％削減されている。よって、領域検索サーバ１は、外部包含領域を除外して検索するので、検索領域の全ての重複領域を検索対象とする場合と比べて検索効率を向上させることができる。
【００９７】
また、上記実施例１によれば、領域検索サーバ１は、検索領域と重複するいずれかの内部包含領域の中から該位置を含む領域を新たに検索できたとする。この場合、領域検索サーバ１は、領域データＤＢ１２２に基づいて、検索領域の残りの検索対象である内部包含領域の数および部分重複領域の数の和と、新たに検索できた領域の内部包含領域の数および部分重複領域の数の和とを比較する。そして、領域検索サーバ１は、比較の結果、新たに検索できた領域に係る和の数が検索領域に係る和の数より小さい場合、検索領域における検索処理を中止し、新たに検索できた領域における検索処理を実行する。かかる構成によれば、領域検索サーバ１は、検索領域より検索対象の数が小さい、新たに検索できた領域の重複領域の検索処理を改めて実行するので、検索領域の全ての重複領域を検索対象とする場合と比べて、さらに該位置を含む領域の検索時間を高速化できる。
【００９８】
ここで、検索領域より検索対象の数が小さい、新たに検索できた領域の重複領域の検索処理を改めて実行する場合と、検索領域の全ての重複領域の検索処理を実行する場合との計算量の比較について説明する。
【００９９】
１つの例として、検索領域の内部包含領域の数が３０個、外部包含領域の数が８０個の場合について説明する。なお、説明の便宜上、領域を２次元の矩形領域とし、要求された位置が当該領域に含まれるか否かを判定する計算回数を１つの領域毎に４回（矩形領域の各頂点の座標との比較として４回）とする。かかる場合に、検索領域の全ての重複領域の中から該位置を含むか否かの判定回数Ａ´１は、以下のようになる。
Ａ´１＝（３０＋８０）×４＝４４０
すなわち、Ａ´１は、該位置が内部包含領域に含まれるか否かを判定する３０×４回と、該位置が外部包含領域に含まれるか否かを判定する８０×４回とを加算した値４４０となる。
【０１００】
一方、検索領域と重複する内部包含領域では、１０番目に行われる内部包含領域の検索処理で該位置が含まれていたとする。つまり、１０番目に検索処理される内部包含領域が新たに検索できた領域となる。また、１０番目の内部包含領域が包含する内部包含領域の数が１１個、部分重複領域の数が２０個であるものとする。かかる場合に、仮に検索領域の残りの検索対象の数より新たに検索できた領域の検索対象の数の方が小さいとすると、新たに検索できた領域の重複領域の検索処理を改めて実行する検索回数Ｂ´１は、以下のようになる。
Ｂ´１＝（１０＋１１）×５＋２０×４＝１８５
すなわち、Ｂ´１は、検索領域の内部包含領域のうち該位置が含まれていると判定される１０番目に至るまでの内部包含領域毎の該位置を含むか否かの判定回数ならびに検索領域との検索対象の数値比較数を示す１０×５回を算出する。そして、Ｂ´１は、１０番目の新たに検索できた内部包含領域が包含する内部包含領域毎の該位置を含むか否かの判定回数ならびに検索領域との検索対象の数値比較数を示す１１×５回を算出する。さらに、Ｂ´１は、１０番目の新たに検索できた内部包含領域の部分重複領域毎の該位置を含むか否かの判定回数を示す２０×４回を算出し、算出した全ての数を加算した値１８５回となる。計算量Ｂ´１は、計算量Ａ´１と比べて、約６０％削減されている。よって、領域検索サーバ１は、検索領域の残りの検索対象の数より新たに検索できた領域の検索対象の数の方が小さい場合、新たに検索できた領域の重複領域の検索処理を改めて実行すれば、さらに該位置を含む領域の検索にかかる計算量が減るので、検索時間を高速化できる。
【０１０１】
また、上記実施例１によれば、領域検索サーバ１は、検索領域と重複する内部包含領域を、当該内部包含領域の面積の大きい順に選択し、選択した内部包含領域に該位置が含まれるか否かを検索する。かかる構成によれば、領域検索サーバ１は、検索領域と重複する内部包含領域の面積が大きければ、早期に内部包含領域に該位置が含まれる確率が高くなる。そうすると、領域検索サーバ１は、早期に内部包含領域に該位置が含まれれば、検索領域における検索処理を中止し、該位置が含まれた内部包含領域における検索処理に移行できるので、該位置を含む領域の検索時間を高速化できる。
【０１０２】
また、上記実施例１によれば、領域検索サーバ１は、検索領域と重複する内部包含領域について、当該内部包含領域が包含する内部包含領域の数および当該内部包含領域の部分重複領域の数の和を算出する。また、領域検索サーバ１は、検索領域と重複する内部包含領域の数および部分重複領域の数の和を算出する。そして、領域検索サーバ１は、双方の差分を算出する。さらに、領域検索サーバ１は、算出した差分の大きい順に検索領域と重複する内部包含領域を選択し、選択した内部包含領域に該位置が含まれるか否かを検索する。かかる構成によれば、領域検索サーバ１は、早期に内部包含領域に該位置が含まれていれば、検索領域の内部包含領域等の数と該位置が含まれた内部包含領域の内部包含領域等の数との差がより大きい。そうすると、領域検索サーバ１は、検索領域における検索処理を中止し、該位置が含まれた内部包含領域における検索処理に移行すれば、検索対象の数がより小さくなり検索処理が少なくなるので、該位置を含む領域の検索時間を高速化できる。
【実施例２】
【０１０３】
ところで、実施例１に係る領域検索サーバ１では、インデックスツリーを用いて問合せ位置を含む領域を検索し、当該領域を検索できた場合、検索できた検索領域と重複する領域のうち検索領域を包含する領域を除くものを検索対象として検索する場合を説明した。しかしながら、領域検索サーバ１は、これに限定されず、問合せ位置を検索できた領域を次回の検索に活かすべく、前回検索できた領域として記録するようにしても良い。そこで、実施例２では、検索できた領域を前回検索できた領域として記録する領域検索サーバ２について説明する。
【０１０４】
［実施例２に係る領域検索サーバの構成］
図１８は、実施例２に係る領域検索サーバの構成を示す機能ブロック図である。なお、図１に示す領域検索サーバ１と同一の構成については同一符号を示すことで、その重複する構成および動作の説明については省略する。実施例１と実施例２とが異なるところは、記憶部１２に前回位置ＤＢ２０１を追加した点にある。また、実施例１と実施例２とが異なるところは、制御部１３に前回領域検索部２０２と前回領域記録部２０４とを追加した点にある。さらに、実施例１と実施例２とが異なるところは、制御部１３のツリー検索部２０３を変更した点にある。
【０１０５】
前回位置ＤＢ２０１は、前回領域検索要求があったときに検索できた位置情報を当該要求元に対応付けて管理する。ここで、前回位置ＤＢ２０１のデータ構造の一例を、図１９を参照して説明する。図１９は、前回位置ＤＢ２０１のデータ構造の一例を示す図である。図１９に示すように、前回位置ＤＢ２０１は、センサーＩＤ２０１ａ毎に、前回検索領域２０１ｂを対応付けて記憶する。センサーＩＤ２０１ａは、領域検索要求の要求元のセンサーの識別ＩＤを示す。前回検索領域２０１ｂは、前回領域検索要求があったときに検索できた領域情報を示す。例えば前回検索領域２０１ｂには、検索できた場合に検索できた領域の領域ＩＤが記憶され、検索できなかった場合に「未検出」が記憶される。例えば、センサーＩＤ２０１ａが「Ｓｅｎｓｏｒ０００１」である場合、前回検索領域２０１ｂとして「未検出」と記憶している。また、センサーＩＤ２０１ａが「Ｓｅｎｓｏｒ０００２」である場合、前回検索領域２０１ｂとして「領域ＩＤ０００３４」と記憶している。
【０１０６】
図１８に戻って、前回領域検索部２０２は、前回領域検索した際に検索できた領域を用いて、所定の位置情報を含む領域を検索する。例えば、前回領域検索部２０２は、リクエスト受付部１３１によって受け付けられた領域検索要求の中からセンサーＩＤおよび位置情報を取り出し、取り出したセンサーＩＤの前回検索領域を前回位置ＤＢ２０１に記憶しているか否かを判定する。また、前回領域検索部２０２は、センサーＩＤの前回検索領域を記憶している場合、領域検索要求の中から取り出した位置情報が前回検索領域に含まれるか否かを判定する。そして、前回領域検索部２０２は、取り出した位置情報が前回検索領域に含まれる場合、当該前回検索領域を検索結果に追加し、前回領域検索部２０２の検索処理を終了する。その後、外包領域結果追加部１３４および重複領域検索部１３５は、前回検索領域と重複する重複領域を検索対象として当該位置情報を含む重複領域を検索することとなる。
【０１０７】
ツリー検索部２０３は、位置情報が前回検索領域に含まれない場合、領域インデックスＤＢ１２１を用いて、前回検索領域を領域データに持つ葉ノードの領域データの内、当該位置情報を含む領域データがあれば、検索できた領域データを検索結果に追加する。その後、外包領域結果追加部１３４および重複領域検索部１３５は、前回検索領域と重複する重複領域を検索対象として当該位置情報を含む重複領域を検索することとなる。
【０１０８】
また、ツリー検索部２０３は、前回検索領域を領域データに持つ葉ノードの領域データの内、当該位置情報を含む領域データがなければ、子ノードからルートノードへノードをボトムアップに順番に辿り、当該位置情報を含むノードを選択する。そして、ツリー検索部２０３は、選択したノードの子ノードに、当該位置情報を含むものがあるか否かを、領域インデックスＤＢ１２１を用いて判定し、判定した結果、当該位置情報を含む子ノードを選択候補ノードとして追加する。そして、ツリー検索部２０３は、選択候補ノードとして追加されたノードを１つずつ選択し、選択したノードが葉ノードであれば、葉ノードの領域データの内、当該位置情報を含む領域データを検索結果に追加する。ここで、ツリー検索部２０３は、領域インデックスＤＢ１２１を用いた検索を終了する。その後、外包領域結果追加部１３４および重複領域検索部１３５は、前回検索領域と重複する重複領域を検索対象として当該位置情報を含む重複領域を検索することとなる。
【０１０９】
前回領域記録部２０４は、領域検索要求があった要求元のセンサーＩＤに対応付けて検索結果を前回位置ＤＢ２０１に記録する。ここで、検索結果に検索できた領域ＩＤが複数ある場合がある。かかる場合には、前回領域記録部２０４は、複数ある領域ＩＤの内、領域ＩＤが示す領域と重複する内部包含領域および部分重複領域の数が最小の領域ＩＤを選択し、選択した領域ＩＤを前回位置ＤＢ２０１に記録すれば良い。これにより、次回の領域検索要求で、当該領域検索要求の位置情報が前回記録された領域ＩＤの領域に含まれていれば、続いて行われる当該領域と重複する重複領域に係る検索回数を減らせるからである。
【０１１０】
［検索処理の手順］
次に、実施例２に係る検索処理の手順について、図２０〜図２３を参照して説明する。図２０〜図２２は、実施例２に係る検索処理の手順を示すフローチャートであり、図２３は、検索処理内の重複領域判定処理の手順を示すフローチャートである。なお、図２０〜図２３の例では、領域検索要求に含まれる位置情報を検索座標として説明する。また、図２１のステップＳ１１１〜Ｓ１１９は、実施例１における図１２のステップＳ１１〜Ｓ１８、Ｓ２０と同様の動作となるので、その説明を簡略する。また、図２３のステップＳ１３１〜Ｓ１３９は、実施例１における図１３のステップＳ３１〜Ｓ３９と同様の動作となるので、その説明を簡略する。
【０１１１】
まず、リクエスト受付部１３１によって領域検索要求が受け付けられると、前回領域検索部２０２は、問合せのセンサーＩＤの前回データ（前回検索領域）を前回位置ＤＢ２０１に記憶しているか否かを判定する（ステップＳ１０１）。問合せのセンサーＩＤの前回データを前回位置ＤＢ２０１に記憶していると判定した場合（ステップＳ１０１；Ｙｅｓ）、前回領域検索部２０２は、検索座標が前回データ内にあるか否かを判定する（ステップＳ１０２）。検索座標が前回データ内にある場合（ステップＳ１０２；Ｙｅｓ）、前回領域検索部２０２は、前回データを該当データとして検索結果に追加する（ステップＳ１０３）。そして、前回領域検索部２０２は、重複領域判定処理に遷移すべく、ステップＳＳ１３１に移行する。
【０１１２】
ステップＳ１０１では、問合せのセンサーＩＤの前回データを前回位置ＤＢ２０１に記憶していないと判定した場合（ステップＳ１０１；Ｎｏ）、前回領域検索部２０２は、ノードをルートノードからトップダウンに辿る検索処理に移行すべく、ステップＳ１１１に移行する。
【０１１３】
ステップＳ１０２では、検索座標が前回データ内にない場合（ステップＳ１０２；Ｎｏ）、前回領域検索部２０２は、ノードをボトムアップに辿る検索処理に移行すべく、ステップＳ１０６に移行する。
【０１１４】
ステップＳ１０６では、ツリー検索部２０３が、領域インデックスＤＢ１２１に基づいて、前回データを領域データとしてデータリストに持つ葉ノードまたは親ノードを選択する（ステップＳ１０６）。そして、ツリー検索部２０３は、選択した選択ノードが検索座標を含むか否かを、領域インデックスＤＢ１２１を用いて判定する（ステップＳ１０７）。選択ノードが検索座標を含むと判定した場合（ステップＳ１０７；Ｙｅｓ）、ツリー検索部２０３は、さらにノードを選択ノードからトップダウンに辿る検索処理に移行すべく、ステップＳ１２１に移行する。
【０１１５】
一方、選択ノードが検索座標を含まないと判定した場合（ステップＳ１０７；Ｎｏ）、ツリー検索部２０３は、選択ノードがルートノードであるか否かを、領域インデックスＤＢ１２１を用いて判定する（ステップＳ１０８）。選択ノードがルートノードでなければ（ステップＳ１０８；Ｎｏ）、ツリー検索部２０３は、親ノードを検索すべく、ステップＳ１０６に移行する。
【０１１６】
一方、選択ノードがルートノードであれば（ステップＳ１０８；Ｙｅｓ）、ツリー検索部２０３は、検索結果無しとして問合せ側へ返答すべく、レスポンス転送部１３２に出力する（ステップＳ１０９）。そして、前回領域記録部２０４は、問合せのセンサーＩＤに対応付けて未検出である旨を前回位置ＤＢ２０１に記録し（ステップＳ１１０）、検索処理を終了する。
【０１１７】
［前回データを前回位置ＤＢ２０１に記憶していない場合の処理手順］
ステップＳ１１１では、ツリー検索部２０３は、領域インデックスＤＢ１２１に基づいて、ルートノードを選択する（ステップＳ１１１）。そして、ツリー検索部２０３は、選択した選択ノードが葉ノードであるか否かを判定する（ステップＳ１１２）。
【０１１８】
選択ノードが葉ノードでないと判定した場合（ステップＳ１１２；Ｎｏ）、ツリー検索部２０３は、選択ノードの子ノードに検索座標を含むものがあるか否かを、領域インデックスＤＢ１２１を用いて判定する（ステップＳ１１３）。
【０１１９】
選択ノードの子ノードに検索座標を含むものがあると判定した場合（ステップＳ１１３；Ｙｅｓ）、ツリー検索部２０３は、検索座標を含む子ノードを選択候補ノードに追加し（ステップＳ１１４）、ステップＳ１１５に移行する。一方、選択ノードの子ノードに検索座標を含むものがないと判定した場合（ステップＳ１１３；Ｎｏ）、ツリー検索部２０３は、ステップＳ１１５に移行する。
【０１２０】
続いて、ツリー検索部２０３は、全ての選択候補ノードの検索を終えたか否かを判定する（ステップＳ１１５）。全ての選択候補ノードの検索を終えていないと判定した場合（ステップＳ１１５；Ｎｏ）、ツリー検索部２０３は、選択候補ノード内の１つの未検索ノードを選択し（ステップＳ１１６）、ステップＳ１１２に移行する。
【０１２１】
ステップＳ１１２では、選択ノードが葉ノードであると判定した場合（ステップＳ１１２；Ｙｅｓ）、ツリー検索部２０３は、選択した葉ノードが持つ領域データの内、検索座標を含むものがあるか否かを判定する（ステップＳ１１７）。
【０１２２】
選択した葉ノードが持つ領域データの内、検索座標を含むものがないと判定した場合（ステップＳ１１７；Ｎｏ）、ツリー検索部２０３は、次の選択候補ノードを検索すべく、ステップＳ１１５に移行する。
【０１２３】
一方、選択した葉ノードが持つ領域データの内、検索座標を含むものがあると判定した場合（ステップＳ１１７；Ｙｅｓ）、ツリー検索部２０３は、該当領域データの内、内部包含領域および部分重複領域の数が最小の領域データを検索結果に追加する（ステップＳ１１８）。ここで、ツリー検索部２０３は、領域インデックスＤＢ１２１を用いた検索を終了し、重複領域判定処理に遷移すべく、ステップＳ１３１に移行する。
【０１２４】
ステップＳ１１５では、全ての選択候補ノードの検索を終えていると判定した場合（ステップＳ１１５；Ｙｅｓ）、ツリー検索部２０３は、選択ノードに検索座標を含むものがないので、検索結果無しとして問合せ側へ返答すべく、レスポンス転送部１３２に出力する（ステップＳ１１９）。そして、前回領域記録部２０４は、問合せのセンサーＩＤに対応付けて未検出である旨を前回位置ＤＢ２０１に記録し（ステップＳ１２０）、検索処理を終了する。
【０１２５】
［選択ノードが検索座標を含む場合の処理手順］
ステップＳ１２１では、ツリー検索部２０３は、選択した選択ノードが葉ノードであるか否かを判定する（ステップＳ１２１）。選択ノードが葉ノードでないと判定した場合（ステップＳ１２１；Ｎｏ）、ツリー検索部２０３は、選択ノードの子ノードに検索座標を含むものがあるか否かを、領域インデックスＤＢ１２１を用いて判定する（ステップＳ１２２）。
【０１２６】
選択ノードの子ノードに検索座標を含むものがあると判定した場合（ステップＳ１２２；Ｙｅｓ）、ツリー検索部２０３は、検索座標を含む子ノードを選択候補ノードに追加し（ステップＳ１２３）、ステップＳ１２４に移行する。一方、選択ノードの子ノードに検索座標を含むものがないと判定した場合（ステップＳ１２２；Ｎｏ）、ツリー検索部２０３は、ステップＳ１２４に移行する。
【０１２７】
続いて、ツリー検索部２０３は、全ての選択候補ノードの検索を終えたか否かを判定する（ステップＳ１２４）。全ての選択候補ノードの検索を終えていないと判定した場合（ステップＳ１２４；Ｎｏ）、ツリー検索部２０３は、選択候補ノード内の１つの未検索ノードを選択し（ステップＳ１２５）、ステップＳ１２１に移行する。
【０１２８】
ステップＳ１２１では、選択ノードが葉ノードであると判定した場合（ステップＳ１２１；Ｙｅｓ）、ツリー検索部２０３は、選択した葉ノードが持つ領域データの内、検索座標を含むものがあるか否かを判定する（ステップＳ１２６）。選択した葉ノードが持つ領域データの内、検索座標を含むものがないと判定した場合（ステップＳ１２６；Ｎｏ）、ツリー検索部２０３は、次の選択候補ノードを検索すべく、ステップＳ１２４に移行する。
【０１２９】
一方、選択した葉ノードが持つ領域データの内、検索座標を含むものがあると判定した場合（ステップＳ１２６；Ｙｅｓ）、ツリー検索部２０３は、該当領域データの内、内部包含領域および部分重複領域の数が最小の領域データを検索結果に追加する（ステップＳ１２７）。ここで、ツリー検索部２０３は、領域インデックスＤＢ１２１を用いた検索を終了し、重複領域判定処理に遷移すべく、ステップＳ１３１に移行する。
【０１３０】
ステップＳ１２４では、全ての選択候補ノードの検索を終えたと判定した場合（ステップＳ１２４；Ｙｅｓ）、ツリー検索部２０３は、選択ノードに検索座標を含むものがないので、さらに親ノードから検索すべく、ステップＳ１０６に移行する。
【０１３１】
［重複領域設定処理の手順］
重複領域判定処理では、外包領域結果追加部１３４が、検索結果に追加した該当領域データの外部包含領域の領域データ（領域ＩＤ）を、さらに検索結果に追加する（ステップＳ１３１）。該当領域データの外部包含領域は、該当領域データの領域を包含するので、検索座標を含むか否かの検索処理を行うまでもなく、検索座標を含むからである。
【０１３２】
続いて、重複領域検索部１３５は、該当領域データの全内部包含領域の判定を終えたか否かを判定する（ステップＳ１３２）。該当領域データの全内部包含領域の判定を終えていないと判定した場合（ステップＳ１３２；Ｎｏ）、重複領域検索部１３５は、該当領域データの内部包含領域の領域データを１つ選択する（ステップＳ１３３）。そして、重複領域検索部１３５は、選択した内部包含領域が検索座標を含むか否かを判定する（ステップＳ１３４）。選択した内部包含領域が検索座標を含むと判定した場合（ステップＳ１３４；Ｙｅｓ）、重複領域検索部１３５は、含むと判定した内部包含領域の領域ＩＤを検索結果に追加し（ステップＳ１３５）、ステップＳ１３２に移行する。
【０１３３】
一方、選択した内部包含領域が検索座標を含まないと判定した場合（ステップＳ１３４；Ｎｏ）、重複領域検索部１３５は、ステップＳ１３２に移行する。
【０１３４】
続いて、該当領域データの全内部包含領域の判定を終えたと判定した場合（ステップＳ１３２；Ｙｅｓ）、重複領域検索部１３５は、該当領域データの全部分重複領域の判定を終えたか否かを判定する（ステップＳ１３６）。該当領域データの全部分重複領域の判定を終えていないと判定した場合（ステップＳ１３６；Ｎｏ）、重複領域検索部１３５は、該当領域データの部分重複領域の領域データを１つ選択する（ステップＳ１３７）。そして、重複領域検索部１３５は、選択した部分重複領域が検索座標を含むか否かを判定する（ステップＳ１３８）。選択した部分重複領域が検索座標を含むと判定した場合（ステップＳ１３８；Ｙｅｓ）、重複領域検索部１３５は、含むと判定した部分重複領域の領域ＩＤを検索結果に追加し（ステップＳ１３９）、ステップＳ１３６に移行する。
【０１３５】
続いて、該当領域データの全部分重複領域の判定を終えたと判定した場合（ステップＳ１３６；Ｙｅｓ）、重複領域検索部１３５は、ステップＳ１０４に移行する。そして、重複領域検索部１３５は、作成した検索結果を問合せ側へ返答すべく、レスポンス転送部１３２に出力する（ステップＳ１０４）。そして、前回領域記録部２０４は、重複領域検索部１３５によって作成された検索結果の内１つの領域ＩＤを問合せのセンサーＩＤに対応付けて前回位置ＤＢ２０１に記録し（ステップＳ１０５）、検索処理を終了する。
【０１３６】
なお、検索処理内の重複領域判定処理は、該当領域データの内部包含領域の中に検索座標を含むものがあると判定したとき、該当領域データにおける未判定の重複領域の数と、検索座標を含む内部包含領域における重複領域の数とを比較するようにしても良い。そして、重複領域判定処理は、比較した結果、検索対象である重複領域の数が小さい方の領域の重複領域の検索に切り替える。かかる重複領域判定処理の変形例は、実施例１における図１４で説明した処理と同様であるので、その説明を省略する。
【０１３７】
［実施例２の効果］
上記実施例２によれば、領域検索サーバ２は、所定の位置を含む領域検索要求を取得すると、該位置が前回検索できた領域に含まれるか否かを判定する。そして、領域検索サーバ２は、判定の結果、該位置が前回検索できた領域に含まれると判定された場合、領域データＤＢ１２２に基づいて、検索できた領域を示す検索領域と重複する重複領域のうち検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索する。かかる構成によれば、領域検索サーバ２は、次回の領域検索を前回検索できた領域から行うこととした。仮に、領域検索要求を行う要求元が領域の大きさに対して小さい移動距離しか移動しないような場合には、次回の領域検索要求の位置が前回検索できた領域の近傍にある可能性が高くなる。このため、領域検索サーバ２は、前回検索できた領域から次回の領域検索を行うことにより次回の位置を含む領域検索の検索時間を高速化できる。
【０１３８】
また、上記実施例２によれば、領域検索サーバ２は、所定の位置を含む領域検索要求を取得すると、該位置が前回検索できた領域に含まれるか否かを判定する。そして、領域検索サーバ２は、判定の結果、該位置が前回検索できた領域に含まれないと判定された場合、ツリー構造を形成するノードの中で、含まれないと判定された領域を含むインデックスの葉ノードから該位置を含む領域を検索する。そして、領域検索サーバ２は、該位置を含む領域を検索できた場合、検索できた領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索する。かかる構成によれば、領域検索サーバ２は、次回の領域検索を前回検索できた領域から行うこととした。仮に、領域検索要求を行う要求元が領域の大きさに対して小さい移動距離しか移動しないような場合には、次回の領域検索要求の位置が前回検索できた領域の近傍にある可能性が高くなる。このため、領域検索サーバ２は、次回の領域検索要求の位置が前回検索できた領域に含まれていなくても、当該位置が前回検索できた領域の近傍を含むインデックスの葉ノードから次回の領域検索を行うことにより次回の位置を含む領域検索の検索時間を高速化できる。
【０１３９】
［プログラムなど］
なお、前回位置ＤＢ２０１は、センサーＩＤ２０１ａと前回検索領域２０１ｂとを対応付けるものとして説明した。しかしながら、前回位置ＤＢ２０１は、センサーＩＤ２０１ａを、例えば、領域検索を要求する端末装置の装置ＩＤに代えても良いし、領域検索を要求する携帯電話の携帯電話番号に代えても良い。すなわち、センサーＩＤ２０１ａに相当するＩＤは、ユースケース毎に変えることができる。
【０１４０】
また、領域検索サーバ１は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記したツリー検索部１３３、外包領域結果追加部１３４などの各機能を搭載することによって実現することができる。また、領域検索サーバ２は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記した前回領域検索部２０２、ツリー検索部２０３などの各機能を搭載することによって実現することができる。
【０１４１】
また、図示した各装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、外包領域結果追加部１３４と重複領域検索部１３５とを１個の部として統合しても良い。一方、ツリー検索部１３３を、葉ノードにおける検索処理と葉ノード以外のノードにおける検索処理とに分散しても良い。また、領域データＤＢ１２２などの記憶部を領域検索サーバ１、２の外部装置としてネットワーク経由で接続するようにしても良い。
【０１４２】
また、上記実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図１に示した領域検索サーバ１と同様の機能を実現する領域検索プログラムを実行するコンピュータの一例を説明する。図２４は、領域検索プログラムを実行するコンピュータの一例を示す図である。
【０１４３】
図２４に示すように、コンピュータ２００は、各種演算処理を実行するＣＰＵ２０１と、ユーザからのデータの入力を受け付ける入力装置２０２と、ディスプレイ２０３を有する。また、コンピュータ２００は、記憶媒体からプログラム等を読取る読み取り装置２０４と、ネットワークを介して他のコンピュータとの間でデータの授受を行うインタフェース装置２０５とを有する。また、コンピュータ２００は、各種情報を一時記憶するＲＡＭ２０６と、ハードディスク装置２０７を有する。そして、各装置２０１〜２０７は、バス２０８に接続される。
【０１４４】
ハードディスク装置２０７は、領域検索プログラム２０７ａ、重複領域設定プログラム２０７ｂを記憶する。ＣＰＵ２０１は、各プログラム２０７ａ〜２０７ｂを読み出して、ＲＡＭ２０６に展開する。領域検索プログラム２０７ａは、領域検索プロセス２０６ａとして機能する。重複領域設定プログラム２０７ｂは、重複領域設定プロセス２０６ｂとして機能する。
【０１４５】
例えば、領域検索プロセス２０６ａは、ツリー検索部１３３、外包領域結果追加部１３４および重複領域検索部１３５に対応する。重複領域設定プロセス２０６ｂは、重複領域設定部１３６に対応する。
【０１４６】
なお、各プログラム２０７ａ〜２０７ｂについては、必ずしも最初からハードディスク装置２０７に記憶させておかなくてもよい。例えば、コンピュータ２００に挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」に各プログラムを記憶させておく。そして、コンピュータ２００がこれらから各プログラム２０７ａ〜２０７ｂを読み出して実行するようにしても良い。
【０１４７】
以上の実施例１〜２を含む実施形態に関し、さらに以下の付記を開示する。
【０１４８】
（付記１）コンピュータが
領域を検索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索し、
該位置を含む領域を検索できた場合、複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶した記憶部に基づいて、検索できた領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索し、
前記検索領域を包含する重複領域の情報とともに、検索できた領域の情報を出力する
ことを実行する領域検索方法。
【０１４９】
（付記２）該位置を含む領域を検索する処理は、複数の領域のそれぞれについて領域を包含する外部包含領域の情報、領域が包含する内部包含領域の情報および領域と部分的に重複する部分重複領域の情報を記憶した前記記憶部に基づいて、前記検索領域と重複する内部包含領域および部分重複領域の中から該位置を含む領域を検索することを特徴とする付記１に記載の領域検索方法。
【０１５０】
（付記３）該位置を含む領域を検索する処理は、
前記検索領域と重複するいずれかの内部包含領域の中から該位置を含む領域を新たに検索できた場合、前記記憶部に基づいて、前記検索領域の残りの検索対象である内部包含領域の数および部分重複領域の数の和と、新たに検索できた領域の内部包含領域の数および部分重複領域の数の和とを比較し、
前記比較する処理によって新たに検索できた領域に係る和の数が前記検索領域に係る和の数より小さい場合、前記検索領域における検索処理を中止し、新たに検索できた領域における検索処理を実行する
ことを特徴とする付記２に記載の領域検索方法。
【０１５１】
（付記４）該位置を含む領域を検索する処理は、前記検索領域と重複する内部包含領域を、当該内部包含領域の面積の大きい順に選択し、選択した内部包含領域に該位置が含まれるか否かを検索することを特徴とする付記２または付記３に記載の領域検索方法。
【０１５２】
（付記５）該位置を含む領域を検索する処理は、前記検索領域と重複する内部包含領域について、当該内部包含領域が包含する内部包含領域の数および当該内部包含領域の部分重複領域の数の和と、前記検索領域と重複する内部包含領域の数および部分重複領域の数の和との差分を算出し、算出した差分の大きい順に前記検索領域と重複する内部包含領域を選択し、選択した内部包含領域に該位置が含まれるか否かを検索することを特徴とする付記２または付記３に記載の領域検索方法。
【０１５３】
（付記６）所定の位置を含む領域の問合せ要求を取得すると、該位置が前回検索できた領域に含まれるか否かを判定し、
判定の結果、該位置が前回検索できた領域に含まれると判定された場合、前記記憶部に基づいて、含まれると判定された領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索することを特徴とする付記１に記載の領域検索方法。
【０１５４】
（付記７）前記判定の結果、該位置が前回検索できた領域に含まれないと判定された場合、前記ツリー構造を形成するノードの中で、含まれないと判定された領域を含むインデックス情報の葉ノードから該位置を含む領域を検索し、
該位置を含む領域を検索できた場合、検索できた領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索することを特徴とする付記６に記載の領域検索方法。
【０１５５】
（付記８）コンピュータに、
領域を検索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索し、
該位置を含む領域を検索できた場合、複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶した記憶部に基づいて、検索できた領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索し、
前記検索領域を包含する重複領域の情報とともに、検索できた領域の情報を出力する
各処理を実行させることを特徴とする領域検索プログラム。
【０１５６】
（付記９）複数の領域のそれぞれについて領域と重複する重複領域の情報を記憶した記憶部と、
領域を検索する際に用いられるインデックス情報であって複数の領域を含む領域情報とともに前記領域を管理するインデックス情報をツリー構造で表したインデックスツリーを用いて、所定の位置を含む領域を検索する第１の検索部と、
前記第１の検索部によって該位置を含む領域を検索できた場合、前記記憶部に基づいて、検索できた領域を示す検索領域と重複する重複領域のうち前記検索領域を包含する重複領域を除く重複領域の中から該位置を含む領域を検索する第２の検索部と、
前記検索領域を包含する重複領域の情報とともに、前記第２の検索部によって検索できた領域の情報を出力する出力部と
を有することを特徴とする情報処理装置。
【符号の説明】
【０１５７】
１、２  領域検索サーバ
１１  通信インタフェース
１２  記憶部
１２１  領域インデックスＤＢ
１２２  領域データＤＢ
１３  制御部
１３１  リクエスト受付部
１３２  レスポンス転送部
１３３、２０３  ツリー検索部
１３４  外包領域結果追加部
１３５  重複領域検索部
１３６  重複領域設定部
２０１  前回位置ＤＢ
２０２  前回領域検索部
２０４  前回領域記録部
【図１】
0005845818.tif 000002
【図２】
0005845818.tif 000003
【図３】
0005845818.tif 000004
【図４】
0005845818.tif 000005
【図５】
0005845818.tif 000006
【図６】
0005845818.tif 000007
【図７】
0005845818.tif 000008
【図８】
0005845818.tif 000009
【図９】
0005845818.tif 000010
【図１０】
0005845818.tif 000011
【図１１】
0005845818.tif 000012
【図１２】
0005845818.tif 000013
【図１３】
0005845818.tif 000014
【図１４】
0005845818.tif 000015
【図１５】
0005845818.tif 000016
【図１６】
0005845818.tif 000017
【図１７】
0005845818.tif 000018
【図１８】
0005845818.tif 000019
【図１９】
0005845818.tif 000020
【図２０】
0005845818.tif 000021
【図２１】
0005845818.tif 000022
【図２２】
0005845818.tif 000023
【図２３】
0005845818.tif 000024
【図２４】
0005845818.tif 000025
【図２５】
0005845818.tif 000026