ネットワークで使用するエバリュエータの種類

ネットワークに定義されている各属性は、ネットワークに含まれる各ソースの値を持つ必要があります。エバリュエータは、各ソースの属性の値を割り当てます。ArcGIS の前段階(ARC/INFO と ArcView GIS)では、属性の値はシェープファイルまたはカバレッジのフィールドから割り当てられました。ArcGIS では、フィールド エバリュエータがネットワーク ソースのフィールドからネットワーク属性に値を割り当てます。さらに、ArcGIS では定数エバリュエータ、フィールド式エバリュエータ、関数エバリュエータ、スクリプト エバリュエータなど、他の種類のエバリュエータも使用できます。

次に、エバリュエータについて説明します。

エバリュエータ

説明

フィールド エバリュエータ

ネットワーク属性に値を割り当てる最も一般的な方法は、ネットワーク データセットの構築時にネットワーク属性の値となる 1 つのフィールドを指定する方法です。たとえば、メートルで示した各道路セグメントの長さのように、値が測定値を説明する場合にフィールド エバリュエータを使用できます。

フィールド式エバリュエータ

[フィールド エバリュエータ] は、1 つのフィールドの代わりに、値としてフィールド式を指定することができます。この場合は、[フィールド エバリュエータ] ダイアログ ボックス上で VBScript あるいは Python を使って式を作成します。たとえば、ネットワーク属性の単位がメートルで、ソース データの単位がフィートの場合、ネットワーク データセットの構築時にフィートをメートルに変換する式を作成できます。

ヒントヒント:

VBScript で書かれたフィールド式エバリュエータは Python で書かれたものよりも格段に速く実行します。こうした理由から VBScript の使用をお勧めしますが、スクリプト言語を選ぶ際に次の点を認識する必要があります。

  • ほとんどの ArcGIS 製品は VBScript や Python を解釈することができます。
  • ArcGIS for Server(Linux)は Python のみを解釈することができます。
  • フィールド式エバリュエータのスクリプトはネットワーク データベースが構築された時に実行されます。
これらのポイントの論理的な意味は次のとおりです。
  • ネットワーク データセットを ArcGIS for Server(Linux)以外の ArcGIS 製品を使って構築しようとする場合には、スクリプトを VBScript で書くことができます。
  • ネットワーク データセットを ArcGIS for Server(Linux)上で構築しようとする場合には、Python でスクリプトを書かなくてはなりません。
  • ネットワーク データセットを ArcGIS for Server(Linux)以外の ArcGIS 製品を使って構築しようとする場合、構築されたネットワーク データセットを参照するネットワーク解析を実行するために ArcGIS for Server(Linux)を使い、VBScript を使ってスクリプトを書くことができます。

定数エバリュエータ

属性には、定数を割り当てることができます。コスト属性、記述子属性、階層属性の値は数値(0、1、2)です。規制属性では、ブール式データ タイプの [規制を使用] または [規制を無視] になります。

関数エバリュエータ

関数エバリュエータは属性値を計算するために、別の属性値またはパラメータ値で乗法関数または論理関数を実行します。数値属性の場合、たとえば DriveTime * 1.25 のように、別の属性の値と何らかの値を乗算する式から値が導出されます。属性タイプがブール値の場合は、別の属性値とパラメータ値を比較する式(MaxHeight < VehicleHeight など)から属性値が求められます。

グローバル ターン遅延エバリュエータ

グローバル ターン遅延エバリュエータは、2 つのエッジ エレメントの間を移動するためのデフォルトとなるコスト値を割り当てます。コストは 2 つのエッジ間の相対角度と通過するエッジの道路クラス(幹線道路、一般道路、生活道路)に基づきます。道路クラスは [階層範囲] ダイアログ ボックスと階層属性を使用して指定します。たとえば、グローバル ターン遅延エバリュエータを使用して、すべての左折(左折かどうかは相対角度によって決定されます)について、生活道路から一般道路への左折を生活道路間の左折に比べて時間を要する設定にすることができます。また、2 本の一般道路の交差点を直進する際に 10 秒間の遅延を追加するなど、他の移動に対して追加のコストを指定することもできます。

グローバル ターンの作成の詳細

スクリプト エバリュエータ

属性を VBScript または Python スクリプトの実行結果から割り当てることができます。これにより、複雑な属性をモデリングできます。他のエバリュエータとは異なり、スクリプト エバリュエータはネットワークの構築時に値を割り当てません。その代わりに、解析中に、特定のネットワーク解析でその属性の使用が必要になった場合に値を割り当てます。属性の値が絶えず変化する場合は、スクリプト エバリュエータを使用することにより、それぞれのネットワーク解析について属性を確実に更新することができます。

ヒントヒント:

スクリプト エバリュエータでは、その値が解析時に計算されるので、解析のパフォーマンスに悪影響をおよぼす傾向があります。できるだけ他のエバリュエータを使用することをお勧めします。

VBScript で書かれたスクリプト エバリュエータは Python で書かれたものよりも格段に速く実行します。こうした理由から VBScript の使用をお勧めしますが、スクリプト言語を選ぶ際に次の点を認識する必要があります。

  • ほとんどの ArcGIS 製品は VBScript や Python を解釈することができます。
  • ArcGIS for Server(Linux)は Python のみを解釈することができます。
  • スクリプト エバリュエータのスクリプトはネットワーク解析レイヤを解析するときに実行されます。
これらのポイントの論理的な意味は次のとおりです。
  • ネットワーク解析を ArcGIS for Server(Linux)以外の ArcGIS 製品を使って実行しようとする場合には、スクリプトを VBScript で書くことができます。
  • ArcGIS for Server(Linux)上で解析を実行しようとする場合には、Python でスクリプトを書かなくてはなりません。

エッジ交通量エバリュエータ

エッジ交通量エバリュエータは、交通量データに使用します。履歴データまたはライブデータを使用して、特定の曜日および時刻の移動時間を提供します。特定時刻の移動時間が利用できないときに平日および週末の移動時間を提供する代替コスト属性が含まれています。エッジ交通量エバリュエータには、ルート解析でのストップや配車ルート解析での訪問を順序付けるときに Network Analyst で参照される、時間に中立的なコスト属性も含まれます。

交通量データの詳細

すべてのジャンクション ソースとターン ソースは、1 つのエバリュエータを持つことができます。すべてのエッジ ソースは、2 つのエバリュエータ(エッジのデジタイズ方向ごとに 1 つずつ)を持つことができます。

エッジ、ジャンクション、ターンには、デフォルトのエバリュエータを割り当てることができます。特定のソースに明示的にエバリュエータを指定しなかった場合、そのソースの値はデフォルトのエバリュエータによって割り当てられます。

次に、エバリュエータを割り当てる一般的なワークフローを説明します。

  1. エバリュエータの割り当てが必要なソースを選択します。
  2. [フィールド][定数][関数]、または [スクリプト] など、エバリュエータの種類を選択します。
  3. ネットワーク属性に割り当てる値を指定します。

    フィールドから値を得る場合は、ドロップダウン メニューから [フィールド] を選択します。フィールド式に基づいて値を計算する場合は、エバリュエータのタイプとして [フィールド] を選択し、キーボードの F12 キーを押して [フィールド エバリュエータ] ダイアログ ボックスを表示します。また、[エバリュエータ] ダイアログ ボックスでソースを右クリックし、[値] メニューから [プロパティ] を選択して [フィールド エバリュエータ] ダイアログ ボックスを表示することもできます。

エバリュエータの例

コスト属性への値の割り当て

次の図の DriveTime ネットワーク属性は、Streets ソース フィーチャクラスにフィールド エバリュエータを使用しています。これは [タイプ] 列を見るとわかります。[値] 列は、Streets ソースの From-To 方向のネットワーク属性値が [FT_Minutes] フィールドから取得されることを示しています。同様に、Streets ソースの To-From 方向の値は [TF_Minutes] フィールドから取得されます。

この例では、このネットワークのその他のエッジ ソースはトランジット エッジで、走行時間を持ちません。したがって、定数値 -1 を割り当てることができます。より望ましいのは、定数値 0 と、自動車などの路上車両を禁止する任意の規制属性を割り当てることです。

詳細詳細:

負のコストよりも規制の方が望ましいのは、負のコストはコスト属性の累積時に減算されるためです。

コスト属性への値の割り当て

または、コスト属性を関数エバリュエータを使用して別のコスト属性から導出することができます。たとえば、遅い車両の移動時間をモデリングする属性は、関数エバリュエータを使用することで、標準の移動時間をモデリングする属性を参照し、属性を減速係数と乗算することができます。

長い移動時間をモデリングする関数エバリュエータ

規制属性への値の割り当て

規制属性の値のデータ タイプはブールです。ソース エレメントは関連付けられた規制を使用することも、無視することもできるため、定数値である [規制を使用] または [規制を無視] を割り当てることができます。

規制属性への値の割り当て

あるいは、規制属性は関数エバリュエータを使用し、別の属性をパラメータ値と比較することで導出できます。たとえば、車高規制をモデリングする属性は、関数エバリュエータを使用して、道路の高さ制限を属性パラメータに格納されている車両の実際の高さと比較することができます。式の評価が True である場合、道路に対して制限が使用されます。式の評価が False である場合、制限は無視されます。この規則に対する例外として、オペランド(MaxHeight または Vehicle Height)のいずれかの値がゼロである場合は必ず、式の評価結果は false となります。

高さ規制をモデリングする関数エバリュエータ

ネットワーク属性でのパラメータの使用の詳細

ソース フィーチャクラスのフィールドから規制属性の値を割り当てることもできます。たとえば、フィールド論理式を評価して結果が True(真)であればエレメントに規制を適用し、False(偽)であれば規制を適用しない、などが可能です。

ネットワーク データセットの作成時、ArcGIS Network Analyst エクステンションはすべてのソースを検索して、Oneway(一方通行)など、一般によく使用されるフィールドを探します。いずれかのソースで Oneway フィールドが見つかった場合は Oneway ネットワーク属性が作成され、フィールド式に基づいて、関連するソースの値が割り当てられます。

次の 2 つの画像は一方通行規制の属性を表す VBScript 式です。道路の各デジタイズ方向に 1 つのエバリュエータと 1 つの式が
あります。

From-To 方向のフィールド式エバリュエータ (VBScript)
To-From 方向のフィールド式エバリュエータ (VBScript)

これらの式は、Oneway フィールド内のテキスト値に基づいて許可される移動方向を決定します。

  • FT または F = ライン フィーチャのデジタイズされた方向への移動のみが許可されます(From-To 方向)。
  • TF または T = ライン フィーチャのデジタイズされた方向と反対向きの移動のみが許可されます(To-From 方向)。
  • N = どちらの方向への移動も許可されません。
  • 他の任意の値 = 両方への移動が許可されます。

注意注意:

ネットワーク エバリュエータには VBScript が推奨されていますが、エバリュエータが ArcGIS for Server(Linux)上で実行される場合には Python でスクリプトを書く必要があります。エバリュエータ ダイアログ ボックスの[事前に作成されたスクリプト コード] および [Value =] セクションに入力するものは、VBScript と Python で異なります。

VBScriptでは、式を[事前に作成されたスクリプト コード] に書いて変数を定義し、次に [Value =] でその変数を設定します。

Python エバリュエータを書くには、関数を [事前に作成されたスクリプト コード] テキスト ボックスに書く必要があります。それは「def」 キーワードで始まり、return キーワードのある位置で値を返したあと、[Value =] テキストボックスから関数を呼び出します。次の 2 つの画像は、一方通行規制を設定する Python フィールド式エバリュエータを書く方法を示したものです。VBScript と Pthon でエバリュエータ式を書く違いをより深く理解するために上記の VBScript での例と比べてください。

From-To 方向のフィールド式エバリュエータ (Python)
To-From 方向のフィールド式エバリュエータ (Python)
上記の Python の例では、NULL 値を検知しエラーを避けるために、if 文が単純な論理式では無く、複雑な論理式を使っていることに注意してください。が「if value and value.upper() in ('N', 'FT', 'F'):」から削除される場合、そして NULL 値が ONEWAY フィールドから渡される場合には、value.upper() 関数が NULL 値を扱えないので、エラーが発生します。その代わりに、が False と評価し、Python は value.upper() を評価する前に if 文を直ちに終了します。

規制の使用法パラメータ

規制属性には、[規制の使用法] というパラメータが常に関連付けられています。このパラメータは、制限を使用するエレメントを禁止するのか、単に回避するのか、それとも優先するのかを決定します。ほとんどの場合は、[規制の使用法] を [禁止] に設定しますが、他の設定を選択できる場合もあります。

制限の使用の詳細

階層の割り当て

ネットワーク データセットに階層を割り当てることで、エッジをさまざまな階層レベルに分類して解析時間を短縮することができます。ただし、階層を使用した解析の結果は階層を使用しない解析に比べて最適でない場合があります。階層の内容と使用する目的についてよく理解していただくために、「階層を使用したネットワーク解析について」をお読みいただくことをお勧めします。

階層レベルは 1 から始まる連続した整数で定義されます。一番小さい整数(1)が最も高い階層レベルを表します。整数値が大きくなるにつれて、階層レベルは低くなります。たとえば、ネットワークを 3 つの階層レベルに分割する場合は、幹線道路に 1 を割り当て、一般道路に 2 を割り当て、生活道路に 3 を割り当てます。幹線道路には高速道路が含まれ、生活道路には住宅街の道路が含まれます。

多くの場合、ネットワーク データセットの階層はフィールドまたはフィールド式エバリュエータによって割り当てられます。Streets フィーチャクラスに、それぞれ高速道路、幹線道路、一般道路を表す 1、2、3 という値の道路クラス属性(階層)が存在する場合、フィールド エバリュエータを使用するだけで階層属性を設定できます。

階層の割り当て

通常、3 つから 5 つの階層レベルが階層属性に割り当てられます。ただ、各レベルが 1 から始まる連続した整数で表されていれば、好きな数だけ階層レベルを割り当てることができます。ただし、非常に多くの階層レベルを割り当てるのは避けてください。残りの階層に対して接続されないエッジを残してしまうと、ネットワーク解析レイヤの解析を実行する際に失敗する原因となります。

ソースのフィーチャクラスの属性が求める階層レベルの数以上のグループ数に分類されている場合、フィールド式エバリュエータを使用して求める階層レベルの数を満たすようグループを分類することができます。たとえば、Streets フィーチャクラスが Func_Class という名前の整数フィールドを持ち、次に示す 6 種類の道路クラスを持っていると仮定します。

Func_Class

道路の種類

1

高速道路

2

有料道路

3

都市高速道路

4

主要な一般道路

5

一般道路

6

高速道路のランプ

さらに、3 つの階層レベルを作成して Func_Class の値を以下に示すテーブルのように分類したいと仮定します。

階層レベル

Func_Class の値

1

1(高速道路)

2(有料道路)

6(高速道路のランプ)

2

3(都市高速道路)

4(主要な一般道路)

3

5(各地方の道路)

このシナリオをモデリングするには、階層属性のフィールド エバリュエータにスクリプトを追加します。スクリプトは、VBScript で作成するか、Python スクリプトで作成するかを選択できます。以下の例は VBScript で作成したもので、「level」という名前の変数を作成し、3(この例で最も低い階層レベル)に設定しています。次に、以下の条件が設定されます。Func_Class が 1、2、6 の場合、「level」に 1 が割り当てられます。Func_Classが 3 あるいは 4 の場合、「level」に 2 が割り当てられます。その他の場合には、値は 3 のままです。[値] テキスト ボックスには「level」が入力されているため、この階層ネットワーク属性では、「level」が表す値がスクリプトの最後に評価されます。

プリロジック VBScript を使用した階層レベルの設定

これにより、Func_Class 1、2、6 のすべてのエレメントには階層属性値 1 が割り当てられ、Func_Class 3、4 のすべてのエレメントには 2 が割り当てられます。それ以外のすべてのエレメント(つまり Func_Class 5 のエレメント)には階層属性値 3 が割り当てられます。

レガシーレガシー:

ArcGIS 10 以前では、[階層範囲] ダイアログ ボックスは複数のフィールド値を正確に 3 つの階層レベルに変換するために使用されていました。しかし現時点では、グローバル ターン遅延エバリュエータを操作したり交通量を表示するために縮尺範囲を設定したりする際に、幹線道路、一般道路、生活道路を定義するだけの目的で使用されます。つまり、[階層範囲] ダイアログ ボックスはネットワーク データセットの階層属性には何の影響もおよぼさず、グローバル ターン遅延エバリュエータのみに影響します。

[階層範囲] ダイアログ ボックス
[属性] パネルの [範囲] をクリックして、[階層範囲] ダイアログ ボックスを表示します。

階層属性とともにグローバル ターン遅延エバリュエータが使用する場合、エッジを 3 つのクラス(生活道路、一般道路、幹線道路)に分類します。階層属性の階層レベルの数は自由に指定できるため、[階層範囲] ダイアログ ボックスによってこれらの階層レベルを正確に 3 つの道路クラスに分類します。これにより、道路クラスに基づいて、ターン操作に対してデフォルトで追加するコストを指定できます。たとえば、一般道路から生活道路へのすべての左折に 10 秒の遅延を追加し、生活道路から別の生活道路へのすべての左折に 3 秒の遅延を追加できます。グローバル ターン遅延エバリュエータと道路クラスを使用する場合、他にも多くのターンの組み合わせがあります。

グローバル ターンの作成の詳細

マップを拡大するときにすべての道路の交通量を表示できるように、交通量を表示するときの縮尺範囲を設定できます。縮小すると、生活道路、一般道路、幹線道路の順に表示からフィルタされます。これにより、交通量のマップが把握しやすくなり、さまざまなマップ縮尺に対して適切な道路の階層レベルだけが表示されます。縮尺範囲は、[階層範囲] ダイアログ ボックスで指定した階層範囲に対して設定されます。

交通量の視覚化の詳細

関連トピック

5/28/2014