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

Network Analyst のライセンスで利用可能。

ネットワーク データセットのエバリュエーターは、各ネットワーク エレメントの属性値を計算して割り当てます。 エバリュエーターには、フィールド スクリプト エバリュエーターとエレメント スクリプト エバリュエーターの 2 つのタイプがあります。 それぞれのエバリュエーターは、式を使用して各エレメントに割り当てられる値を計算します。 フィールド スクリプト エバリュエーターは、ネットワーク ソースのフィールドを使用します。エレメント スクリプト エバリュエーターは、同じ属性のパラメーターまたは他のネットワーク属性の値を使用します。

各エバリュエーター、つまりフィールド スクリプト エバリュエーターおよびエレメント スクリプト エバリュエーターは、[フィールド演算 (Calculate Field)] ツールに似た Python 式を使用します。

このトピックでは、Python を使用して構成されるフィールド スクリプト エバリュエーターとエレメント スクリプト エバリュエーターの例を示します。

ネットワークで使用されるエバリュエーターの種類の詳細

フィールド スクリプト エバリュエーターの例

フィールド スクリプト エバリュエーターは、ネットワーク データセットのソース フィーチャクラスのフィールドを参照して属性の値を計算します。

フィールド スクリプト エバリュエーター ダイアログ ボックス

Python を使用してフィールド スクリプト エバリュエーターを作成する際、フィールドはフィールド名 (エイリアスではない) を使用して参照され、! を使用して名前を囲​​むようコーディングする必要があります。 たとえば、RoadClass というフィールドを使用する場合は、Python でこのフィールドを !RoadClass! のようにコーディングします。

フィーチャのジオメトリは、図形の長さを含む計算で使用できます。 シェープ ジオメトリ オブジェクトは、ソース フィーチャクラスの座標系の単位で、ソース セグメントの比例測地線長に基づいて計算されます。 たとえば、フィーチャクラスのシェープ フィールドの名前が Shape の場合は、Python!Shape! のようにコーディングします。 !Shape! が距離ベースのコスト属性の一部として使用されると、ソース セグメントの比例長が使用され、座標系の単位はコスト属性の単位に変換されます。 ジオメトリ オブジェクトのプロパティおよびメソッド (!Shape!.length!Shape!.getLength() など) はサポートされていません。 フィールド エバリュエーターでは、基本の !Shape! のみがサポートされています。

フィーチャの平面線長が格納される !Shape_Length! フィールドも長さの計算に使用できますが、座標系やフィーチャの比例長を考慮せずに数値として処理されます。 エバリュエーター内部では、その単位は、座標系の単位ではなく、属性の単位と同じ単位として解釈されます。 そのため、代わりに新しい !Shape! を使用することをおすすめします。

null 値は、値のコンテキストに応じて処理が異なります。 ブール型演算では、null は、目的の基準に一致するか、一致しないかのいずれかです。 ただし、数学演算で null 値が使用されると、エバリュエーターは目的の値を計算できない可能性があり、ネットワーク データセットの構築時に構築エラーが発生します。 フィールド スクリプト エバリュエーターを使用する場合は、ネットワーク データセットを構築または解析する際にエラーを回避するよう null 値を処理することが重要です。

このコード サンプルでは、ソース フィーチャクラス内の 2 つのフィールドから計算した分単位のコスト属性の構成を示します。 RoadClass フィールドは道路クラスを表し、スクリプトは道路クラスを使用して道路の速度制限を決定します。 Miles フィールドは道路の長さをマイル単位で表します。 これらの 2 つのフィールドの値が結合され、道路に沿った移動時間が分単位で返されます。 null および予期しない RoadClass フィールド値は、これらの道路にデフォルトの速度制限値を割り当てることで処理されます。 null の Miles フィールド値は処理されず、ネットワーク データセットが構築される際にエラーが発生します。 ネットワークが正常に機能するには、これらのエラーを修正する必要があり、道路セグメントの長さに適したデフォルト値を設定することは不可能なためこれは推奨されることです。

Value:
calc_time(!RoadClass!, !Miles!)

Code Block:
def calc_time(rc, d):
    # This example assumes that the speed limit is in miles per hour
    # and that the distance field is in miles
    if rc == 1:  # Local roads
        speed_limit = 30
    elif rc == 6:  # Major roads
        speed_limit = 55
    elif rc == 2:  # Highways
        speed_limit = 70
    else:  # Set a default speed limit if RoadClass does not match any other option
        speed_limit = 45   
    return 60 * d / speed_limit

エレメント スクリプト エバリュエーターの例

エレメント スクリプト エバリュエーター ダイアログ ボックス

エレメント スクリプト エバリュエーターは、ネットワーク データセットの他の属性、パラメーター、プロパティの値を参照して、属性の値を計算します。 エレメント スクリプト エバリュエーターでは、その値は、ネットワーク データセットが構築されるときではなく、解析されるときに計算されるので、解析のパフォーマンスに悪影響を及ぼす傾向があります。 可能であれば、他のエバリュエーターを使用してください。

以下のセクションでは、ネットワーク属性とパラメーター、およびネットワーク エレメントのその他のプロパティを使用して、Python でエレメント スクリプト エバリュエーターを構築する方法を説明します。

ネットワーク属性とパラメーターの使用

The AttributeValueByName() 法は他のネットワーク属性の値を使用できますが、ParameterValueByName() 法は、エバリュエーターが記述されているのと同じ属性であるコンテキスト属性のパラメーター値を使用します。

方法説明

AttributeValueByName

コンテキスト ネットワーク エレメントの別の属性の値を使用します。

この方法は、ネットワーク属性名を入力文字列として受け取ります。

例:

Edge.AttributeValueByName("OtherCost")

Junction.AttributeValueByName("OtherRestriction")

Turn.AttributeValueByName("OtherRestriction")

ParameterValueByName

コンテキスト ネットワーク属性の指定されたネットワーク属性パラメーターの値を使用します。

この方法は、コンテキスト ネットワーク属性パラメーター名を入力文字列として受け取ります。

例:

ParameterValueByName("OtherParamName")

ネットワーク属性の詳細

ネットワーク パラメーターの詳細

次の例では、[CostAdjustedforSlope] というコスト属性の道路セグメントを通過するためのインピーダンスを決定します。道路を自転車で通過する際の時間コストは、道路セグメントの傾斜に応じて変更されます。 ネットワークには [AverageSlope] という記述子属性があり、道路セグメントの平均傾斜を計算します。 ネットワークには、道路セグメントを通過するのにかかる時間を分単位で計算する [Minutes] というコスト属性もあります。 [CostAdjustedforSlope] で、[SteepUpFactor] と [SteepDownFactor] という 2 つのパラメーターが設定されています。 これらは、それぞれ急な坂を上ったり下ったりする場合の修正係数を表します。 [AverageSlope] が -0.05 を下回る場合、道路セグメントが急勾配であることを示しますが、道路を移動する時間が短縮されます。 [AverageSlope] の値が 0.075 を上回る場合は、時間コストが増えます。

Value:
cost_adjusted_for_slope("Minutes", "AverageSlope", "SteepUpFactor", "SteepDownFactor")

Code Block:
def cost_adjusted_for_slope(
    time_cost_attr_name, slope_attr_name,
    up_factor_param_name, down_factor_param_name
):
    # Retrieve the values of other attributes for this road
    time_cost = Edge.AttributeValueByName(time_cost_attr_name)
    slope = Edge.AttributeValueByName(slope_attr_name)

    # Retrieve the value of parameters for this attribute
    up_factor = ParameterValueByName(up_factor_param_name)
    down_factor = ParameterValueByName(down_factor_param_name)

    # Set default values in case the parameter values are null
    if up_factor is None: 
        up_factor = 1.25
    if down_factor is None: 
        down_factor = 0.80

    # Calculate the modified travel time cost based on slope
    factor = 1
    if slope < -0.05:  # Steep downhill
        factor = down_factor
    elif slope > 0.075: # Steep uphill
        factor = up_factor
    modified_cost = factor * time_cost

    return modified_cost

次の例では、[ClosedForEvent] という制限に対するエレメント スクリプト エバリュエーターです。この制限は、[MarketEvent] というブール型パラメーターに基づいてジャンクションを規制します。 [MarketIntersection] という記述子属性には、所定のジャンクションがイベントの影響を受けるかどうかを判定するブール値が格納されています。 [MarketEvent] と [MarketIntersection] の両方が true の場合はジャンクションが規制され、そうでなければ通行可能になります。

Value:
is_closed_for_event("MarketIntersection", "MarketEvent")

Code Block:
def is_closed_for_event(is_conditionally_open_attr_name, event_closure_bool_param_name):
    is_affected_by_event = Junction.AttributeValueByName(is_conditionally_open_attr_name)
    is_closed_for_event_param = ParameterValueByName(event_closure_bool_param_name)
    return is_affected_by_event and is_closed_for_event_param

ネットワーク エレメント プロパティの使用

エレメント スクリプト エバリュエーターは、コンテキスト ネットワーク エレメントのプロパティも使用します。 エレメント スクリプト エバリュエーターのコードでネットワーク エレメント プロパティを使用するには、エレメント タイプの名前の後でプロパティを呼び出します。

この例は、ターン エレメントの Angle プロパティを使用して、エレメント スクリプト エバリュエーターでターン規制属性を構成する方法を示します。 ターン角度が特定の値の範囲に含まれる急なターンは規制されます。

Value:
no_backwards_turn(Turn.Angle)

Code Block:
def no_backwards_turn(angle):
    if angle >= 135 and angle <= 225:
        # Restrict turns with sharp angles
        return True
    return False