到達圏解析レイヤーの作成 (Make Service Area Analysis Layer) (Network Analyst)

概要

到達圏ネットワーク解析レイヤーを作成し、解析プロパティを設定します。到達圏解析レイヤーは、施設の場所から指定したコストの閾値内で到達できるエリアを決定する際に役立ちます。レイヤーは、ローカル ネットワーク データセットや、オンラインでホストされたルート サービスまたはポータル内のルート サービスを使用して作成できます。

使用法

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

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

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

構文

MakeServiceAreaAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {travel_direction}, {cutoffs}, {time_of_day}, {time_zone}, {output_type}, {polygon_detail}, {geometry_at_overlaps}, {geometry_at_cutoffs}, {polygon_trim_distance}, {exclude_sources_from_polygon_generation}, {accumulate_attributes})
パラメーター説明データ タイプ
network_data_source

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

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

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

String
travel_mode
(オプション)

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

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

String
travel_direction
(オプション)

施設に向かう移動方向か、施設から離れる移動方向かを指定します。

  • FROM_FACILITIES到達圏は、施設から離れる方向への移動を表します。これがデフォルトです。
  • TO_FACILITIES到達圏は、施設に向かう方向への移動を表します。

このパラメーターを使用することで、移動する方向に基づいた一方通行規制およびさまざまなインピーダンスを考慮して、ネットワーク上にさまざまな到達圏を作成することが可能になります。たとえば、宅配ピザの到達圏であれば、施設から離れる方向に作成し、病院の到達圏であれば、施設に向かう方向に作成します。

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

計算される到達圏の範囲。単位は、選択した移動モードで使用されるインピーダンス属性の単位です。たとえば、運転時間を解析している場合、カットオフ値の 10 は、結果の到達圏が運転時間 10 分以内に到達できるエリアを表すことを意味します。

同心状の到達圏を作成するために、複数のカットオフを設定できます。たとえば、同じ施設に対して 2 分、3 分、および 5 分の到達圏を検索する場合は、このパラメーターの値として 2、3、5 を指定します。

このデフォルトのカットオフ値は、施設サブレイヤーのブレーク値を個別に指定することで、施設ごとにオーバーライドできます。

Double
time_of_day
(オプション)

到達圏レイヤーの施設からの出発時間または到着時間です。この値が出発時間と到着時間のどちらに解釈されるかは、施設への移動方向に依存します。

  • travel_direction='FROM_FACILITIES' の場合、出発時間を表します。
  • travel_direction='TO_FACILITIES' の場合、到着時間を表します。

time_of_day パラメーターは、動的な交通状況など、時間とともに変化するインピーダンス属性を使用する移動モードに基づいて到達できる道路を検索する場合に最も便利です。同じ解析を time_of_day の値を変えて実行すると、時間の経過に伴う施設の到着時間の変化を確認できます。たとえば、消防署から 5 分間の到達圏は、早朝には大きくなり、混雑する朝の時間帯は縮小し、朝の遅い時間帯には拡大するなど、一日を通して変化します。

日時は、2015/10/21 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[時刻] パラメーターは、施設がある場所のタイム ゾーンを使用します。到達圏の開始または終了時間には、タイム ゾーンによってずれが生じます。これがデフォルトです。たとえば、[時刻] を午前 9 時に設定すると、解析によって、東部標準時ゾーン内のどの施設でも東部標準時の午前 9 時、中央標準時ゾーン内の施設では中央標準時の午前 9 時、山地標準時ゾーン内の施設では山地標準時の午前 9 時について (以下同様に)、到達圏が生成されます。米国全体でチェーン展開されている店舗が現地時間の午前 9 時に開店する場合、このパラメーター値を選択すると、1 つの解析ですべての店舗の開店時刻におけるマーケット領域が検出されます。最初に、東部標準時ゾーン内の店舗が開店し、ポリゴンが生成されます。1 時間遅れて、中央標準時ゾーン内の店舗が開店します。9 時は常に現地時間ですが、実時間ではずれが発生することになります。
  • UTC[時刻] パラメーターが、UTC (協定世界時) を参照します。施設の場所のタイム ゾーンに関係なく、施設への到着または施設からの出発はすべての施設で同時になります。[時刻] を午後 2 時に設定すると、解析によって、東部標準時ゾーン内のどの施設でも東部標準時の午前 9 時、中央標準時ゾーン内の施設では中央標準時の午前 8 時、山地標準時ゾーン内の施設では山地標準時の午前 7 時について (以下同様に)、到達圏が生成されます。
    メモ:

    上記のシナリオは、標準時を想定しています。サマータイム中、東部時間、中部時間、および山岳部時間は、それぞれ 1 時間進められます (つまり、それぞれ午前 10 時、9 時、および 8 時になります)。

    UTC オプションが便利なケースの 1 つは、2 つのタイム ゾーンに分割された行政区域の緊急対応範囲の視覚化です。緊急車両は施設として読み込まれます。[時刻] は UTC で現在に設定されます (このオプションを正しく使用するには、現在の日時が UTC で何日の何時になるかを確認する必要があります)。他のプロパティが設定され、解析が実行されます。タイム ゾーン境界によって車両が分割されている場合でも、結果には現在の交通状況で到達できるエリアが示されます。この同じプロセスを、現在だけではなく、他の時刻にも使用できます。
String
output_type
(オプション)

生成される出力のタイプを指定します。到達圏の出力は、カットオフを超えるまで到達可能な道路を表すライン フィーチャ、またはこれらのラインを囲む (到達可能なエリアを表す) ポリゴン フィーチャです。

  • POLYGONS到達圏の出力には、ポリゴンのみが含まれます。これがデフォルトです。
  • LINES到達圏の出力には、ラインのみが含まれます。
  • POLYGONS_AND_LINES到達圏の出力には、ポリゴンとラインが含まれます。

ネットワーク データ ソースが、ラインの生成に対応していない Portal for ArcGIS のバージョンのサービスである場合、[ライン] および [ポリゴンとライン] 出力タイプは使用できません。

String
polygon_detail
(オプション)

出力ポリゴンの詳細レベルを指定します。

  • STANDARD標準的な詳細レベルのポリゴンを作成します。これがデフォルトです。
  • GENERALIZED結果を早く作成するために、ネットワークの階層属性を使用して、単純化ポリゴンを作成します。ネットワークに階層属性がないと、このオプションは使用できません。
  • HIGH正確な結果が重要となるアプリケーションのために、より高い詳細レベルのポリゴンを作成します。

解析する市街地の道路網が格子状であれば、単純化されたポリゴンと詳細なポリゴンの違いはあまりありません。ただし、山間部や地方の道路では、一般的に、単純化されたポリゴンよりも標準または詳細なポリゴンのほうがはるかに高い精度を提供します。

String
geometry_at_overlaps
(オプション)

互いに関連する複数の施設から出力された到達圏の振舞いを指定します。

  • OVERLAP施設ごとに別々のポリゴンまたはラインのセットが作成されます。ポリゴンまたはラインは重なり合うことができます。これがデフォルトです。
  • DISSOLVE同じカットオフ値を持つ複数の施設のポリゴンが 1 つのポリゴンに結合されます。このパラメーターは、ライン出力には適用されません。
  • SPLITエリアは最寄り施設に割り当てられるため、ポリゴンまたはラインは重なり合いません。
String
geometry_at_cutoffs
(オプション)

複数のカットオフ値が指定されているときに、1 つの施設に対して出力された到達圏の振舞いを指定します。このパラメーターは、ライン出力には適用されません。

  • RINGS各ポリゴンは、連続するカットオフ値の間にあるエリアのみを含みます。施設と小さい方のカットオフの間にあるエリアは含まれません。たとえば、5 分間の到達圏と 10 分間の到達圏を生成する場合、5 分間の到達圏ポリゴンには 0 ~ 5 分で到達可能なエリア、10 分間の到達圏ポリゴンには 5 ~ 10 分で到達可能なエリアが含まれます。これがデフォルトです。
  • DISKS各ポリゴンには、施設からカットオフ値までに到達可能なエリアが含まれます。小さい方のカットオフ値までに到達可能なエリアも含まれます。たとえば、5 分間の到達圏と 10 分間の到達圏を生成する場合、5 分間の到達圏ポリゴンが 10 分間の到達圏ポリゴンに含められます。
String
polygon_trim_distance
(オプション)

到達圏ポリゴンの切詰め距離。ポリゴンの切詰め距離は、ライン バッファー サイズと同様に、他に到達可能な道路が近くにない場合に、到達圏ポリゴンが道路から延長する距離です。ネットワークがまばらで、フィーチャが存在しない広範領域が到達圏内に含まれるのを防ぎたい場合に役立ちます。

このパラメーターには距離の値と単位が含まれます。デフォルト値は 100 メートルです。

Linear Unit
exclude_sources_from_polygon_generation
[exclude_sources_from_polygon_generation,...]
(オプション)

到達圏ポリゴンの生成時に除外されるネットワーク データセットのエッジ ソース。除外されたソースの周囲には、解析で通過された場合でも、ポリゴンが生成されません。

到達圏ポリゴンからネットワーク ソースを除外しても、そのソースの通行が防止されるわけではありません。到達圏ポリゴンからソースを除外した場合、到達圏のポリゴンの形状のみに影響が生じます。特定のネットワーク ソースの通行を防止するには、ネットワーク データセットの定義時に適切な規制を設定する必要があります。

ポリゴンの精度が損なわれるため、または到達圏解析にそれほど重要ではないため、ポリゴン生成に含めたくないネットワーク ソースがある場合に役立ちます。たとえば、道路および線路の複合ネットワークで徒歩時間の到達圏を作成する場合、ポリゴン生成から線路を除外するように選択する必要があります。移動者は線路を使用できますが、線路の途中で止まり、近くの建物に入ることはできません。代わりに、線路の全長を移動し、地下鉄システムの駅を出てから、道路を使って建物まで歩く必要があります。この場合、線路の周囲にポリゴン フィーチャを生成しても正確な結果は作成されません。

このパラメーターは、出力ジオメトリ タイプにポリゴンが含まれない場合、ネットワークに 1 つ以下のエッジ ソースしか存在しない場合、ネットワーク データ ソースが ArcGIS Online サービスである場合、またはネットワーク データ ソースがソースの除外をサポートしていないバージョンの Portal for ArcGIS のサービスである場合は使用できません。

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

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

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

このパラメーターは、解析レイヤーがラインを出力できるよう構成されていない場合や、ネットワーク データ ソースが ArcGIS Online サービスである場合、あるいはネットワーク データ ソースが累積をサポートしないバージョンの Portal for ArcGIS のサービスである場合には使用できません。

String

派生した出力

名前説明データ タイプ
out_network_analysis_layer

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

Network Analyst レイヤー

コードのサンプル

MakeServiceAreaAnalysisLayer (到達圏解析レイヤーの作成) の例 1 (Python ウィンドウ)

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

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeServiceAreaAnalysisLayer(network, "FireStationCoverage")
MakeServiceAreaAnalysisLayer (到達圏解析レイヤーの作成) の例 2 (Python ウィンドウ)

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

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeServiceAreaAnalysisLayer(network, "WarehouseCoverage",
                                "Driving Time", "FROM_FACILITIES", [5, 10, 15],
                                "1/1/1900 9:00 AM", "UTC", "POLYGONS",
                                "STANDARD", "DISSOLVE", "RINGS", "100 meters",
                                ["Metro_Lines", "Transfer_Stations",
                                "Transfer_Street_Station"], ["Meters", 
                                "DriveTime"])
MakeServiceAreaAnalysisLayer (到達圏解析レイヤーの作成) の例 3 (ワークフロー)

次のスタンドアロン Python スクリプトは、MakeServiceAreaAnalysisLayer ツールを使用して消防署から 1 分、2 分、3 分以内の到達圏を生成する方法を示しています。

# Name: MakeServiceAreaAnalysisLayer_Workflow.py
# Description: Generate 1-,2-,3- minute service areas around fire stations and
#              save the results to a layer file on disk. The service area
#              polygons can be used to visualize the areas that do not have
#              adequate coverage from the fire stations
# 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/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "FireStationCoverage"
    travel_mode = "Driving Time"
    facilities = os.path.join(input_gdb, "Analysis", "FireStations")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new service area layer. We wish to generate the service area
    #polygons as rings, so that we can easily visualize the coverage for any
    #given location. We also want overlapping polygons so we can determine the
    #number of fire stations that cover a given location. We will specify these
    #options while creating the new service area layer.
    result_object = arcpy.na.MakeServiceAreaAnalysisLayer(network, layer_name,
                                    travel_mode, "FROM_FACILITIES", [1, 2, 3],
                                    polygon_detail="HIGH",
                                    geometry_at_overlaps="OVERLAP",
                                    geometry_at_cutoffs="RINGS")

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

    #Get the names of all the sublayers within the service area layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]

    #Load the fire stations as facilities using default field mappings and
    #default search tolerance
    arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities, "",
                                                                            "")

    #Solve the service area layer
    arcpy.na.Solve(layer_object)

    #Save the solved service area 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))
MakeServiceAreaAnalysisLayer (到達圏解析レイヤーの作成) の例 4 (ワークフロー)

この例は、複数の時刻において施設の周りに到達圏を作成する方法、および入力フィーチャから出力フィーチャにフィールドを移し、既存のフィーチャクラスに出力ポリゴンを追加する方法を示しています。

# Name: MakeServiceAreaAnalysisLayer_Workflow2.py
# Description: Generate 3-minute service areas around fire stations at several
#               times of day to compare coverage differences due to varying
#               traffic conditions. Save the results to a feature class on disk.
# Requirements: Network Analyst Extension

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

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/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "FireStationCoverage"
    out_featureclass = os.path.join(output_dir, "Output.gdb",
                                                        "FireStationCoverage")
    travel_mode = "Driving Time"
    facilities = os.path.join(input_gdb, "Analysis", "FireStations")
    times_of_day = [datetime.datetime(2014, 9, 25, 7, 0, 0),
                    datetime.datetime(2014, 9, 25, 12, 30, 0),
                    datetime.datetime(2014, 9, 25, 17, 30, 0),
                    datetime.datetime(2014, 9, 25, 21, 0, 0)]

    #Create a new service area layer.
    result_object = arcpy.na.MakeServiceAreaAnalysisLayer(network, layer_name,
                                                travel_mode, "FROM_FACILITIES",
                                                [3], polygon_detail="HIGH",
                                                geometry_at_overlaps="OVERLAP")

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

    #Get the names of all the sublayers within the service area layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]
    polygons_layer_name = sublayer_names["SAPolygons"]

    #The input data has a field for FireStationID that we want to transfer to
    #our analysis layer. Add the field, and then use field mapping to transfer
    #the values.
    arcpy.na.AddFieldToAnalysisLayer(layer_object, facilities_layer_name,
                                                    "FireStationID", "TEXT")
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    facilities_layer_name)
    field_mappings["FireStationID"].mappedFieldName = "FireStationID"

    #Load the fire stations as facilities.
    arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities,
                            field_mappings, "")

    # Add fields to the output Polygons sublayer for later use.
    arcpy.na.AddFieldToAnalysisLayer(layer_object, polygons_layer_name,
                                        "FireStationID", "TEXT")
    arcpy.na.AddFieldToAnalysisLayer(layer_object, polygons_layer_name,
                                        "TimeOfDay", "TEXT")

    #Get sublayers to work with later
    facilities_sublayer = layer_object.listLayers(facilities_layer_name)[0]
    polygons_sublayer = layer_object.listLayers(polygons_layer_name)[0]

    #Get the Service Area Layer's solver properties. This can be used to
    #set individual properties later without re-creating the layer.
    solver_properties = arcpy.na.GetSolverProperties(layer_object)

    #Solve the Service Area for each time of day in the time list
    for t in times_of_day:

        print("Calculating service area for time of day: ", t)

        #Use the solver properties to set the time of day for the solve
        solver_properties.timeOfDay = t

        #Solve the service area layer
        arcpy.na.Solve(layer_object)

        #Transfer the FireStationID field from the input Facilities to the
        #output Polygons
        arcpy.management.AddJoin(polygons_sublayer, "FacilityID",
                                        facilities_sublayer, "ObjectID")
        #The joined fields are qualified by the feature class name of the joined
        #table, so determine the feature class names
        field_qualifier_pol = os.path.basename(polygons_sublayer.dataSource)
        target_field_name = "%s.FireStationID" % field_qualifier_pol
        field_qualifier_fac = os.path.basename(facilities_sublayer.dataSource)
        expression = "!%s.FireStationID!" % field_qualifier_fac
        arcpy.management.CalculateField(polygons_sublayer, target_field_name,
                                        expression, "PYTHON")
        arcpy.management.RemoveJoin(polygons_sublayer)

        #Populate the TimeOfDay field in the output feature class
        expression = '"' + str(t) + '"'
        arcpy.management.CalculateField(polygons_sublayer, "TimeOfDay",
                                            expression, "PYTHON")

        #Append the polygons to the output feature class. If this was the first
        #solve, create the feature class.
        if not arcpy.Exists(out_featureclass):
            arcpy.management.CopyFeatures(polygons_sublayer, out_featureclass)
        else:
            arcpy.management.Append(polygons_sublayer, out_featureclass)

    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))

ライセンス情報

  • Basic: はい
  • Standard: はい
  • Advanced: はい