OD コスト マトリックス解析レイヤーの作成 (Make OD Cost Matrix Analysis Layer) (Network Analyst)

サマリー

OD (起点-終点) コスト マトリックス ネットワーク解析レイヤー」を作成し、解析プロパティを設定します。 OD コスト マトリックス解析レイヤーは、複数の出発地から複数の目的地までのコスト マトリックスを表すときに役立ちます。 このレイヤーを作成するには、ローカル ネットワーク データセットを使用するか、オンラインでホストされたサービスまたはポータル内のサービスを使用します。

使用法

  • このツールで解析レイヤーを作成した後は、[ロケーションの追加 (Add Locations)] ツールを使用して解析レイヤーにネットワーク解析オブジェクトを追加し、[解析の実行 (Solve)] ツールを使用して解析を実行し、[レイヤー ファイルの保存 (Save To Layer File)] ツールを使用して結果をディスクに保存することができます。

  • このツールをジオプロセシング モデルに使用するときは、モデルをツールとして動作させる場合、出力ネットワーク解析レイヤーにモデル パラメーターを作成する必要があります。そうしないと、出力レイヤーはマップのコンテンツに追加されません。

  • ArcGIS AllSource では、ネットワーク解析レイヤーのデータは、ディスク上のファイル ジオデータベースのフィーチャクラスに格納されます。 プロジェクトでネットワーク解析レイヤーを作成する場合、レイヤーのデータは、「現在のワークスペース」環境の新しいフィーチャ データセット内に作成されます。 Python スクリプトでネットワーク解析レイヤーを作成する場合、まず arcpy.env.workspace = "<path to file gdb>" を使用して、ワークスペース環境をレイヤーのデータが格納するファイル ジオデータベースに明示的に設定する必要があります。 レイヤーが作成されるとき、適切なサブレイヤーのフィーチャクラスを含む新しいフィーチャ データセットがこのファイル ジオデータベースに追加されます。

パラメーター

ラベル説明データ タイプ
ネットワーク データ ソース

ネットワーク解析が実行されるネットワーク データセットまたはサービス。 サービスのポータル URL を使用します。

Network Dataset Layer;String
レイヤー名
(オプション)

作成するネットワーク解析レイヤーの名前。

String
移動モード
(オプション)

解析で使用する移動モードの名前。 「移動モード」は、移動規制や U ターン ポリシーなど、歩行者、車、トラック、その他の交通手段がネットワークをどのように移動するかを決定するネットワーク設定のコレクションを表します。 移動モードは、ネットワーク データ ソースに対して定義されます。

arcpy.na.TravelMode オブジェクトおよび移動モードの有効な JSON 表現を含む文字列もパラメーターの入力として使用できます。

String
カットオフ
(オプション)

指定された起点における終点の検索を停止するインピーダンス値。 この値は、選択した移動モードで使用されているインピーダンス属性の単位になります。 この制限を超える終点は検索されません。 このカットオフ値は、起点サブレイヤーのカットオフ値を個別に指定することで、起点ごとにオーバーライドできます。 デフォルトでは、解析にカットオフは使用されません。

Double
検出する終点の数
(オプション)

起点ごとに検索を実行する終点の数。 起点サブレイヤーの TargetDestinationCount プロパティの値を個別に指定することで、デフォルトをオーバーライドすることができます。 デフォルトでは、制限は使用されず、すべての終点が検索されます。

Long
時刻
(オプション)

起点からの出発日時。

交通量ベースのインピーダンス属性を選択した場合、ここで指定した時刻での動的な交通状況に対する解決策が生成されます。 日時は、2012/05/14 10:30 のように指定できます。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

ネットワーク解析での日時の使用と解釈の詳細

Date
タイム ゾーン
(オプション)

[時刻] パラメーターのタイム ゾーン。

  • ロケーションのローカル タイム[時刻] パラメーターが、起点の場所のタイム ゾーンを表します。 これがデフォルトです。
  • UTC[時刻] パラメーターが、UTC (協定世界時) を参照します。 特定の時刻 (たとえば今) における OD コスト マトリックスを計算する場合で、起点がある場所のタイム ゾーンがわからない場合、このオプションを選択します。
String
ライン形状
(オプション)

出力ライン形状を指定します。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

  • ラインなし出力の起点-終点のルートに形状は生成されません。 これは、起点と終点の数が多く、OD コスト マトリックス テーブル内のインピーダンス コストのみが必要であり、OD コスト マトリックスをマップ上で視覚化する必要がない場合に便利です。
  • 直線出力ルート形状は各起点~終点間を結ぶ 1 本の直線になります。 これがデフォルトです。
String
累積属性
(オプション)

解析中に累積されるコスト属性のリスト。 これらの累積属性は、参考情報としてのみ使用されます。解析では、指定されている移動モードで使用されるコスト属性のみが使用されます。

累積されるコスト属性ごとに、ネットワーク解析の出力フィーチャに Total_[Impedance] プロパティが入力されます。

このパラメーターは、ネットワーク データ ソースが ArcGIS Online サービスであるか、ネットワーク データ ソースが累積をサポートしていないバージョンの Portal for ArcGIS のサービスである場合には使用できません。

String
解析時に無効なロケーションを除外
(オプション)

無効な入力ロケーションを除外するかどうかを指定します。 通常、「ネットワーク上に配置」できないロケーションは無効です。 無効なロケーションを除外する場合は、そのロケーションがスキップされ、残りのロケーションを使用して解析が実行されます。

  • オン - 無効な入力ロケーションが除外され、有効なロケーションだけが使用されます。 これがデフォルトです。
  • オフ - すべての入力ロケーションが使用されます。 ロケーションが無効な場合は、解析が正常に実行されません。
Boolean

派生した出力

ラベル説明データ タイプ
Network Analyst レイヤー

新しく作成されたネットワーク解析レイヤー。

Network Analyst Layer

arcpy.management.MakeODCostMatrixAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {cutoff}, {number_of_destinations_to_find}, {time_of_day}, {time_zone}, {line_shape}, {accumulate_attributes}, {ignore_invalid_locations})
名前説明データ タイプ
network_data_source

ネットワーク解析が実行されるネットワーク データセットまたはサービス。 サービスのポータル URL を使用します。

Network Dataset Layer;String
layer_name
(オプション)

作成するネットワーク解析レイヤーの名前。

String
travel_mode
(オプション)

解析で使用する移動モードの名前。 「移動モード」は、移動規制や U ターン ポリシーなど、歩行者、車、トラック、その他の交通手段がネットワークをどのように移動するかを決定するネットワーク設定のコレクションを表します。 移動モードは、ネットワーク データ ソースに対して定義されます。

arcpy.na.TravelMode オブジェクトおよび移動モードの有効な JSON 表現を含む文字列もパラメーターの入力として使用できます。

String
cutoff
(オプション)

指定された起点における終点の検索を停止するインピーダンス値。 この値は、選択した移動モードで使用されているインピーダンス属性の単位になります。 この制限を超える終点は検索されません。 このカットオフ値は、起点サブレイヤーのカットオフ値を個別に指定することで、起点ごとにオーバーライドできます。 デフォルトでは、解析にカットオフは使用されません。

Double
number_of_destinations_to_find
(オプション)

起点ごとに検索を実行する終点の数。 起点サブレイヤーの TargetDestinationCount プロパティの値を個別に指定することで、デフォルトをオーバーライドすることができます。 デフォルトでは、制限は使用されず、すべての終点が検索されます。

Long
time_of_day
(オプション)

起点からの出発日時。

交通量ベースのインピーダンス属性を選択した場合、ここで指定した時刻での動的な交通状況に対する解決策が生成されます。 日時は、2012/05/14 10:30 のように指定できます。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

ネットワーク解析での日時の使用と解釈の詳細

Date
time_zone
(オプション)

[時刻] パラメーターのタイム ゾーン。

  • LOCAL_TIME_AT_LOCATIONS[時刻] パラメーターが、起点の場所のタイム ゾーンを表します。 これがデフォルトです。
  • UTC[時刻] パラメーターが、UTC (協定世界時) を参照します。 特定の時刻 (たとえば今) における OD コスト マトリックスを計算する場合で、起点がある場所のタイム ゾーンがわからない場合、このオプションを選択します。
String
line_shape
(オプション)

出力ライン形状を指定します。

  • NO_LINES出力の起点-終点のルートに形状は生成されません。 これは、起点と終点の数が多く、OD コスト マトリックス テーブル内のインピーダンス コストのみが必要であり、OD コスト マトリックスをマップ上で視覚化する必要がない場合に便利です。
  • STRAIGHT_LINES出力ルート形状は各起点~終点間を結ぶ 1 本の直線になります。 これがデフォルトです。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

String
accumulate_attributes
[accumulate_attributes,...]
(オプション)

解析中に累積されるコスト属性のリスト。 これらの累積属性は、参考情報としてのみ使用されます。解析では、指定されている移動モードで使用されるコスト属性のみが使用されます。

累積されるコスト属性ごとに、ネットワーク解析の出力フィーチャに Total_[Impedance] プロパティが入力されます。

このパラメーターは、ネットワーク データ ソースが ArcGIS Online サービスであるか、ネットワーク データ ソースが累積をサポートしていないバージョンの Portal for ArcGIS のサービスである場合には使用できません。

String
ignore_invalid_locations
(オプション)

無効な入力ロケーションを除外するかどうかを指定します。 通常、「ネットワーク上に配置」できないロケーションは無効です。 無効なロケーションを除外する場合は、そのロケーションがスキップされ、残りのロケーションを使用して解析が実行されます。

  • SKIP無効な入力ロケーションが除外され、有効なロケーションだけが使用されます。 これがデフォルトです。
  • HALTすべての入力ロケーションが使用されます。 ロケーションが無効な場合は、解析が正常に実行されません。
Boolean

派生した出力

名前説明データ タイプ
out_network_analysis_layer

新しく作成されたネットワーク解析レイヤー。

Network Analyst Layer

コードのサンプル

MakeODCostMatrixAnalysisLayer の例 1 (Python ウィンドウ)

必須パラメーターのみを使用してツールを実行します。

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeODCostMatrixAnalysisLayer(network, "DrivetimeCosts")
MakeODCostMatrixAnalysisLayer の例 2 (Python ウィンドウ)

すべてのパラメーターを使用してツールを実行します。

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeODCostMatrixAnalysisLayer(network, "DrivetimeCosts", 
                                "Driving Time", 10, 20, "1/1/1900 9:00 AM",
                                "UTC", "NO_LINES", ["Meters", "DriveTime"])
MakeODCostMatrixAnalysisLayer の例 3 (ワークフロー)

次のスタンドアロン Python スクリプトは、MakeODCostMatrixAnalysisLayer 関数を使用して、商品を倉庫からすべての店舗に 10 分以内の走行時間で配達する際の OD コスト マトリックスを作成する方法を示しています。

# Name: MakeODCostMatrixAnalysisLayer_Workflow.py
# Description: Create an origin-destination cost matrix for delivery of goods
#              from the warehouses to all stores within a 10-minute drive time
#              and save the results to a layer file on disk. Such a matrix can
#              be used as an input for logistics, delivery and routing analyses.
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import os

try:
    #Check out Network Analyst license if available. Fail if the Network Analyst license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")
    
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/Paris.gdb"
    network = os.path.join(input_gdb, "Transportation", "ParisMultimodal_ND")
    layer_name = "WarehouseToStoreDrivetimeMatrix"
    travel_mode = "Driving Time"
    search_tolerance = "1000 Meters"
    origins = os.path.join(input_gdb, "Analysis", "Warehouses")
    destinations = os.path.join(input_gdb, "Analysis", "Stores")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new OD Cost matrix layer. We wish to find all stores within a 10
    #minute cutoff.
    result_object = arcpy.na.MakeODCostMatrixAnalysisLayer(network, layer_name,
                                                travel_mode, 10)

    #Get the layer object from the result object. The OD cost matrix layer can
    #now be referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the OD cost matrix layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    origins_layer_name = sublayer_names["Origins"]
    destinations_layer_name = sublayer_names["Destinations"]

    #Load the warehouse locations as origins using a default field mappings and
    #a search tolerance of 1000 Meters.
    arcpy.na.AddLocations(layer_object, origins_layer_name, origins, "",
                          search_tolerance)

    #Load the store locations as destinations and map the NOM field from stores
    #features as Name property using field mappings
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                        destinations_layer_name)
    field_mappings["Name"].mappedFieldName = "NOM"
    arcpy.na.AddLocations(layer_object, destinations_layer_name, destinations,
                          field_mappings, search_tolerance)

    #Solve the OD cost matrix layer
    arcpy.na.Solve(layer_object)

    #Save the solved OD cost matrix layer as a layer file on disk
    layer_object.saveACopy(output_layer_file)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))
MakeODCostMatrixAnalysisLayer の例 4 (ワークフロー)

次のスタンドアロン Python スクリプトは、サブレイヤーへのアクセス方法、入力および出力レイヤーの結合方法、入力元および入力先から出力ライン レイヤーへのフィールド値の転送方法を示しています。

レガシー:

GetNASublayer」関数を使用して、ネットワーク解析レイヤーのサブレイヤーを取得できます。 これは ArcGIS Pro 2.7 で導入されました。 以前のソフトウェア バージョンでは、サブレイヤー名をワイルドカードとして使用するネットワーク解析の「Layer」オブジェクトの listLayers メソッドを使用することがネットワーク解析レイヤーのサブレイヤー オブジェクトを取得する最適な方法でした。

# Name: MakeODCostMatrixAnalysisLayer_Workflow2.py
# Description: Find the travel time to the closest hospital from each census
#               tract and join the travel time and hospital name to the input
#               tracts.
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import datetime
import os

try:
    #Check out Network Analyst license if available. Fail if the Network Analyst license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")
    
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set inputs and outputs
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    origins = os.path.join(input_gdb, "Analysis", "TractCentroids")
    destinations = os.path.join(input_gdb, "Analysis", "Hospitals")
    output_features = "TractCentroids_withOD"

    #Define some OD cost matrix analysis settings
    layer_name = "HospitalsOD"
    #User settings for driving
    travel_mode = "Driving Time"
    #Calculate the total distance, even though the analysis is optimizing time
    accumulate_attributes = ["Meters"]
    #Find only the closest hospital
    num_hospitals_to_find = 1
    #Set the time of day for the analysis to 6PM on a generic Monday.
    start_time = datetime.datetime(1900, 1, 1, 18, 0, 0)
    #Don't output line shapes (output Lines will still list travel times)
    out_lines = "NO_LINES"

    #Create a new OD cost matrix layer.
    result_object = arcpy.na.MakeODCostMatrixAnalysisLayer(network, layer_name,
                    travel_mode,
                    number_of_destinations_to_find=num_hospitals_to_find,
                    time_of_day=start_time, line_shape=out_lines, 
                    accumulate_attributes=accumulate_attributes)

    #Get the layer object from the result object. The OD layer can
    #now be referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the OD layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Store the layer names for later use
    origins_layer_name = sublayer_names["Origins"]
    destinations_layer_name = sublayer_names["Destinations"]

    #The input census tract data has a unique ID field that can be transferred
    #to the analysis layer. Add the field, and then use field mapping to
    #transfer the values.
    arcpy.na.AddFieldToAnalysisLayer(layer_object, origins_layer_name,
                                                        "Tract_ID", "TEXT")
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                            origins_layer_name)
    field_mappings["Tract_ID"].mappedFieldName = "ID"

    #Load the census tracts as origins.
    arcpy.na.AddLocations(layer_object, origins_layer_name, origins,
                            field_mappings, "")

    #Map the input hospital NAME field to a new Hospital_Name field in
    #Destinations
    arcpy.na.AddFieldToAnalysisLayer(layer_object, destinations_layer_name,
                                                        "Hospital_Name", "TEXT")
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                        destinations_layer_name)
    field_mappings["Hospital_Name"].mappedFieldName = "NAME"

    #Load the hospitals as desinations.
    arcpy.na.AddLocations(layer_object, destinations_layer_name, destinations,
                            field_mappings, "")

    #Solve the OD layer
    arcpy.na.Solve(layer_object)

    #Get sublayers
    #listLayers returns a list of sublayer layer objects contained in the NA
    #group layer, filtered by layer name used as a wildcard. Use the sublayer
    #name from GetNAClassNames as the wildcard string in case the sublayers
    #have non-default names.
    origins_sublayer = layer_object.listLayers(origins_layer_name)[0]
    destinations_sublayer = layer_object.listLayers(destinations_layer_name)[0]
    lines_sublayer = layer_object.listLayers(sublayer_names["ODLines"])[0]

    #Use the JoinField tool to transfer OD Cost Matrix information to the
    #output feature class
    #Transfer the tract ID from the input Origins to the output Lines
    arcpy.management.JoinField(lines_sublayer, "OriginID",
                                    origins_sublayer, "ObjectID", "Tract_ID")
    #Transfer the hospital name from the input Destinations to the output Lines
    arcpy.management.JoinField(lines_sublayer, "DestinationID",
                            destinations_sublayer, "ObjectID", "Hospital_Name")
    #Transfer fields of interest (hospital name, impedance attribute, and other
    #accumulated costs) from the output Lines to a copy of the input census
    #tracts feature class using the Tract_ID field
    # Determine the impedance attribute
    solver_props = arcpy.na.GetSolverProperties(layer_object)
    impedance = solver_props.impedance
    output_impedance_fieldname = "Total_" + impedance
    fields_to_transfer = ["Hospital_Name", output_impedance_fieldname]
    for field in accumulate_attributes:
        fields_to_transfer.append("Total_" + field)
    arcpy.management.CopyFeatures(origins, output_features)
    arcpy.management.JoinField(output_features, "ID",
                                lines_sublayer, "Tract_ID", fields_to_transfer)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))
MakeODCostMatrixAnalysisLayer の例 5 (スタンドアロン スクリプト)

次のスタンドアロン Python スクリプトは、修正版の移動モードをネットワーク データセットから作成し、新しい OD コスト マトリックス レイヤーの作成時にこの移動モードを使用する方法を示します。

import json

network = r"C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
# Get all travel modes from the network dataset
travel_modes = arcpy.na.GetTravelModes(network)
# Get the Driving Distance travel mode
dd_travel_mode = travel_modes["Driving Distance"]
# Make a json representation of the travel mode
travel_mode_json = json.loads(str(dd_travel_mode))
# Modify the userHierarchy property to turn hierarchy off, and update the name
travel_mode_json["useHierarchy"] = False
travel_mode_json["name"] = "Driving Distance without Hierarchy"
# Create a new travel mode object from the modified json
new_travel_mode_object = arcpy.na.TravelMode(json.dumps(travel_mode_json))
# Use the new travel mode object to MakeODCostMatrixAnalysisLayer
# We could also pass in the json directly without first converting it to an object
arcpy.na.MakeODCostMatrixAnalysisLayer(network, "OD Without Hierarchy", new_travel_mode_object)