5.12 縮約階層を使用したネットワーク管理と分析

縮約階層は、グラフ内の最短パスを見つけるために使用できます。従来の最短パスアルゴリズム(DijkstraやA*など)よりも優れたパフォーマンスを得られる可能性があります。

そのため、リリース21cから、Spatialにはネットワーク・データ・モデルを使用するための方法が2つ提供されています。

  • ロード・オンデマンド(LOD)では、ビジネス・ルールとデータのカスタマイズをサポートします。
  • 縮約階層には、静的ネットワークにかかわるWebサービスの開発と展開を簡単にするためのREST APIが含まれています。

縮約階層の方法では、次の処理を実行します。

  • ノード順序(重要度)とショートカット・リンクを事前に計算して、ファイルのセットに保存します。
  • 問合せ時に重要度が低いノードをスキップすることで、ショートカット・リンクによる最短パスを見つけます。
  • ショートカット・リンクをマップして元のグラフ表現に戻します。

縮約階層を使用するときには、縮約階層のモデル管理と分析のために縮約階層REST APIを使用することになります。

サブトピックは、次のとおりです。

  • 縮約階層REST API
  • 縮約階層REST APIの例
  • 縮約階層モデルの管理
  • 縮約階層分析
  • 縮約階層REST APIの使用(Webデモを含む)
  • REST APIリファレンス情報

縮約階層REST API

縮約階層REST APIは、縮約階層モデルの管理とモデルについての分析に使用できます。HTTPプロトコルとHTTPSプロトコルを使用することで、リクエストの発行と応答の受信が可能になります。JSON形式とXML形式の両方がサポートされます。

次の図は、縮約階層REST APIのアーキテクチャを示しています。

図5-4 縮約階層REST APIのアーキテクチャ

図5-4の説明が続きます
「図5-4 縮約階層REST APIのアーキテクチャ」の説明
次に、この図の意味を説明します。
  • ユーザーのアプリケーションは、縮約階層REST APIを使用して、縮約階層RESTサービスにリクエストを送信し、レスポンスを受信します。

  • 縮約階層RESTサービスは、モデル管理リクエストを受信すると、そのリクエストを処理するためにネットワーク・データ・モデルのロジックに渡して、戻される情報を受信します。

    RESTサービスは分析リクエストを受信すると、そのリクエストを処理するために縮約階層モデルに渡して、戻される情報を受信します。

  • NDMモデルのロジックは、モデルを必要に応じて更新してから、縮約階層RESTサービスに情報を戻し、関連する縮約階層モデルが含まれているファイルを更新します。

  • 縮約階層モデルに対する更新を受信したときには、関連するモデル・ファイルが更新されます。

このアーキテクチャのいくつかのコンポーネントについては、このトピックで詳しく説明します。

縮約階層REST APIの例

事前構成済ディレクトリに縮約階層ネットワーク・モデルを作成する場合のRESTful JSONリクエスト:

{"createNetworkRequest":
    {
        "chName":"my_example",
        "networkName":"MY_NETWORK_NAME",
        "dbUrl":"jdbc:oracle:thin:@<host>:<port>:<sid>",
        "dbUser":"my_username",
        "dbPassword":"my_password",
        "processGeometry":true,
        "processTurnRestrictions":false,
        "primaryLinkCostColumn":"LENGTH",
        "primaryCostUnit":"meter",
        "primaryCostScaleFactor":10,
        "secondaryLinkCostColumns":["LENGTH/S"],
        "secondaryCostUnits":["second"],
        "secondaryCostScaleFactors":[10]
    }
}

メモリーに縮約階層ネットワーク・モデルをロードする場合のRESTful JSONリクエスト:

{"loadNetworkRequest":
    {
        "chName":"my_example",
        "networkName":"MY_NETWORK_NAME",
        "considerTurnRestrictions":false
    }
}

最短パス分析のためのRESTful JSONリクエスト:

{
    "chName":"my_example",
    "shortestPathRequest":{
        "startPoints" : { "pointOnNet" : [ 
            { "linkId" : 238135, "percentage" : 0.28 } 
        ] }, 
        "endPoints" : { "pointOnNet" : [ 
            { "linkId" : 261315, "percentage" : 0.93 }
        ] },         
        "geometry":true
    }
}

最短パス分析のRESTful JSONレスポンス(読みやすい形式に変更してあります):

{
  "shortestPathResponse" : {
    "cost" : 2906.6,
    "geometry" : "{\"type\":\"LineString\",\"coordinates\":[[-74.00501,40.70583],[-74.00457,40.70549],[-74.00447,40.70541],[-74.00418,40.70559],[-74.00386,40.70579],[-74.00361,40.70595],[-74.00346,40.70605],[-74.00335,40.70611],[-74.00318,40.70621],[-74.00231,40.7067],[-74.00274,40.70722],[-74.00311,40.70767],[-74.00336,40.708],[-74.00345,40.70808],[-74.00407,40.70745],[-74.00412,40.70757],[-74.00433,40.70783],[-74.00477,40.70841],[-74.00505,40.70876],[-74.00513,40.70885],[-74.00524,40.70893],[-74.00532,40.70899],[-74.00547,40.70909],[-74.00643,40.70956],[-74.00705,40.70987],[-74.00774,40.71022],[-74.00906,40.71089],[-74.01046,40.71153],[-74.01013,40.71209],[-74.00967,40.71274],[-74.00927,40.71326],[-74.00902,40.71359],[-74.00885,40.71381],[-74.0084,40.71437],[-74.00795,40.71494],[-74.00755,40.71544],[-74.00882,40.71602],[-74.0092,40.71619],[-74.00911,40.71692],[-74.00906,40.71726],[-74.009,40.7176],[-74.00894,40.71793],[-74.00888,40.71827],[-74.00882,40.71864],[-74.00875,40.71903],[-74.0087,40.7193],[-74.00858,40.71996],[-74.00847,40.72065],[-74.00842,40.72089],[-74.00837,40.7212],[-74.00834,40.72133],[-74.00823,40.72198],[-74.00812,40.72264],[-74.00801,40.72328],[-74.00795,40.72365],[-74.00793,40.72376],[-74.00786,40.72382],[-74.00777,40.72388],[-74.00773,40.72392],[-74.00771,40.72393],[-74.00745,40.72412],[-74.00736,40.72417],[-74.00728,40.72424],[-74.00723,40.72429],[-74.0071,40.72441],[-74.00703,40.7245]]}",
    "linkIds" : [ 238135, 69834, 69856, 187992, 39327, 39328, 18867, 189084, 189085, 189086, 189087, 142716, 142717, 142718, 142719, 142720, 193362, 193363, 54588, 54589, 54657, 153376, 68912, 61331, 61332, 177603, 177604, 177605, 177606, 177607, 106801, 96723, 96724, 96725, 96726, 65028, 176816, 176817, 65012, 65013, 65014, 65015, 261314, 261315 ],
    "nodeIds" : [ 42427254, 42427256, 42440356, 3350498747, 42452620, 42457292, 42444271, 42440270, 42440271, 673008453, 42440278, 42440280, 42440282, 42440284, 42440287, 42428385, 42440290, 42453943, 42453952, 42430004, 42429562, 42449597, 42431611, 42445356, 42445357, 42436322, 42430571, 42430529, 42429833, 42436326, 42436327, 42436330, 42436333, 42436335, 42436336, 42424610, 1104165608, 42436308, 42424408, 42436340, 42436014, 4142105822, 42424619, 42424630, 42423514 ],
    "startIndex" : 0,
    "startPercentage" : 0.28,
    "endIndex" : 43,
    "endPercentage" : 0.93
  },
  "unit" : "meter"
}

縮約階層モデルの管理

縮約階層モデルは、データベース内の任意のSpatialネットワーク・データ・モデルから作成できます。それぞれのモデルは、特定のディレクトにファイルのセットとして保存されます。

モデルの作成後に、そのモデルをメモリーにロードして、分析を実行できます。

縮約階層分析

次に示すように、複数の縮約階層分析ファンクションがサポートされています。

  • 最短パス: 2点間の最短パス
  • マルチストップ最短パス: 一連の点間の最短パス
  • コスト・マトリックス: マトリックス形式(N×M)の始点Nから終点Mまでのコスト
  • 巡回セールスマン・パス: 所定のすべての点を訪れる最短パス
  • 代替パス: パスの重複が特定の割合を超過しないK個の代替パス
  • セカンダリ・コスト: パスの使用可能なすべてのセカンダリ・コストを取得します。

パス・ジオメトリなどの追加の分析情報は、REST APIを使用して取得することもできます。

縮約階層REST APIの使用

縮約階層REST APIを利用するアプリケーションの開発には、次のステップを使用できます。

  1. 縮約階層のearファイル(chrest.ear)をJ2EEコンテナにデプロイします。

    これにより、REST APIを処理する縮約階層サービスをデプロイします。

  2. データベースのSpatial Network Data Modelモデルから縮約階層モデルを作成し、縮約階層モデルをファイル・システムに格納します。

  3. 縮約階層モデルをメモリーにロードして、分析を実行します。

chrest.earファイルには、REST APIの使用方法を示すデモも付随しています。このデモを使用する場合は、次のURLに移動します。

https://<host>:<port>/chrest/

Contraction Hierarchies Web Demo (縮約階層Webデモ)のメイン・ページでは、ファイルに格納された論理および空間ネットワーク・データを問い合せて、Spatial Network Data Modelの分析ファンクションを実行できます。

このデモでは、次のリンクを使用できます。

  • Documentation & Schema (ドキュメントとスキーマ)
  • Contraction Hierarchies Network Analysis (縮約階層ネットワーク分析)
  • Visualization Demo (視覚化デモ)
  • 構成

REST APIリファレンス情報

縮約階層サポート用のREST APIに関する参照情報は、REST API for Oracle Spatialを参照してください。