5.10 ネットワーク・バッファ

ネットワーク・データ・モデル(NDM)では、ネットワーク表現に加えて対象範囲とコストの情報を取得するネットワーク・バッファ表現が導入されています。空間バッファ・アプローチとは対照的に、ネットワーク・バッファのコスト情報は正確で効率的です。

LOD Java APIを使用してネットワーク・バッファを計算できます。各バッファ・センターは、ノードまたはリンク(PointOnNet)に沿ったポイントのいずれかであり、ネットワーク・バッファには複数のバッファ・センターを含めることができます。大規模な移動時間および距離の分析では、データベース内のネットワーク・バッファを事前に計算して永続化できます。さらに、単純なSQL文を使用して、空間操作やネットワーク分析を使用せずに、1つまたは複数のネットワーク・バッファの対象範囲、コストおよび最短パスを問い合せることができます。

次の項では、Javaスニペットを使用したデータベースに対するネットワーク・バッファを作成してデータベースに保持し、SQLを使用して対象範囲とコストの情報を問い合せる例を示しています。

5.10.1 ネットワーク・バッファの作成

Java APIを使用してネットワーク・バッファを作成できます。

次の例は、Network Analystクラスを使用して、1つの場所から車で10分以内の対象範囲を取得するネットワーク・バッファを作成する方法を示しています。新しく作成されたバッファは、接頭辞SFを使用してデータベースのネットワーク・バッファ表に格納されます。ただし、writeNetworkBuffer()メソッドは、ネットワーク・バッファ表がデータベースにまだ存在していない場合にのみ作成することに注意してください。それ以外の場合は、既存の表が使用されます。

例5-3 ネットワーク・バッファの作成

PointOnNet[] startPoint = {new PointOnNet(linkId, percent)};
double cost = 600; // 600 seconds

// Creates a network buffer with the given start point and cost
NetworkBuffer buffer = analyst.networkBuffer(startPoint, cost, null);
int bufferId = 0;
String tableNamePrefix = "SF";

// Writes the network buffer tables
networkIO.writeNetworkBuffer(buffer, bufferId, tableNamePrefix);

5.10.2 Java APIを使用したネットワーク・バッファの分析

NDM Java APIを使用してネットワーク・バッファ分析を実行できます。

次の例では、PointOnNetの特定の場所へのネットワーク・バッファに関連するコストを取得します。

例5-4 Java APIを使用したコストの取得

// The cost is Double.POSITIVE_INFINITY if not covered
double cost = buffer.getCosts(pt) == null ? Double.POSITIVE_INFINITY : buffer.getCosts(pointOnNet)[0];

// To get the ids and costs of the covered nodes and links from a network buffer:

// Finds all covered nodes
LogicalNode[] nodes = buffer.getElements().getNodes();
for (LogicalNode node : nodes) {
    long nodeId = node.getId();
    // Returns the minimum costs to reach the node from a buffer center
    double[] nodeCosts = buffer.getNodeCosts(node.getId());
}

// Coverage and cost information for covered links stored in LinkIntervals
NetworkBuffer.LinkIntervals[] linkIntervals = buffer.getElements().getLinkIntervals();

// Finds all covered links
for (int i = 0; i < linkIntervals.length; i++) {
    LogicalLink link = linkIntervals[i].getLink();
    long linkId = link.getId(); // link Id
    NetworkBuffer.DoubleInterval[] intervals = linkIntervals[i].getIntervals();
    // Finds costs for the covered links
    for (NetworkBuffer.DoubleInterval interval : intervals) {
        NetworkBuffer.DoubleInterval costs =
                buffer.getLinkIntervalCosts(linkId, interval);
        // Computes the cost of the mid-point of the covered link
        double percentage = 0.5; // range:[0,1]
        double[] cost = buffer.getCosts(new PointOnNet(linkId, percent));
    }
}

ノート:

その他の例は、Oracle Spatial APIパッケージを参照してください。

5.10.3 SQL問合せを使用したネットワーク・バッファの分析

ネットワーク・バッファ表に対して直接SQL問合せを使用して、ネットワーク・バッファ分析を実行できます。

例5-5 SQL問合せを使用したコストの取得

次の例では、中心位置(link_id=945669955, percentage=0.95)からのすべてのバッファのコストを昇順で取得します。

SELECT buffer_id, MIN(start_cost+(0.95-start_percentage)*(end_cost-start_cost)/(end_percentage-start_percentage)) cost
FROM SF_NBl$
WHERE link_id=945669955
AND (0.95-start_percentage)*(end_percentage-start_percentage)>=0
GROUP BY buffer_id
ORDER BY cost;

例5-6 SQL問合せを使用した最短パスのリンクの取得

次の例では、階層問合せを使用して、特定の場所(link_id =799415310)から特定のバッファ・センター(buffer_id = 1)への最短パスのリンクを取得します。

SELECT buffer_id, link_id, prev_link_id
FROM SF_NB1$
WHERE buffer_id = 1
START WITH link_id = 799415310
CONNECT BY PRIOR prev_link_id = link_id AND
      PRIOR start_cost = end_cost AND
      PRIOR buffer_id = buffer_id
ORDER BY start_cost;