通過したソース フィーチャのコピー(Copy Traversed Source Features) (Network Analyst)
サマリ
2 つのフィーチャクラスと 1 つのテーブルを作成し、それらをすべて使用して、ネットワーク解析レイヤの解析中に通過したエッジ、ジャンクション、およびターンに関する情報を格納します。
使用法
-
このツールは入力ネットワーク解析レイヤがまだ解析されていない場合は、その解析を実行します。解析レイヤは、最後の解析の後に入力が変更された場合には、再解析されます。
通過したソース フィーチャは、次のネットワーク解析レイヤに対して生成できます。
- ルート
- 到達圏
- 最寄り施設
- 配車ルート
通過したソース フィーチャは、次のレイヤに対しては生成できません。
- OD コスト マトリックス
- ロケーション-アロケーション
出力ジャンクション フィーチャクラスは、通過したネットワーク ジャックションを表すポイントだけでなく、次の場所を表すポイントも含みます。
- 通過したポイント バリア
- 通過したラインおよびポリゴン バリアの開始ポイントと終了ポイント
- ルート解析の訪問ストップ
- 到達圏解析における訪問施設と休憩の終了
- 最寄り施設解析における訪問施設とインシデント
- 配車ルートにおける訪問先、拠点、休憩
出力フィーチャクラスの座標系を制御するには、出力座標系環境設定を指定するか、出力場所パラメータの値としてジオデータベースのフィーチャ データセットを指定します。出力座標系環境設定が指定されず、出力場所パラメータがフィーチャ データセットではない場合、出力フィーチャクラスの座標系は入力ネットワーク解析レイヤの座標系と同じになります。
構文
パラメータ | 説明 | データ タイプ |
input_network_analysis_layer |
通過したソース フィーチャのコピー元になるネットワーク解析レイヤ。ネットワーク解析レイヤに有効な結果がない場合は、結果を得るためにレイヤが解析されます。 | Network Analyst Layer |
output_location |
出力テーブルと 2 つのフィーチャクラスが保存されるワークスペース。 | Workspace; Feature Dataset |
edge_feature_class_name |
通過したエッジ ソース フィーチャに関する情報が入るフィーチャクラスの名前。解析されたネットワーク解析レイヤがエッジ フィーチャを通過しない場合は、空のフィーチャクラスが作成されます。 | String |
junction_feature_class_name |
通過したジャンクション ソース フィーチャに関する情報が入るフィーチャクラスの名前。これには、システム ジャンクションと、入力ネットワーク解析レイヤからの関連ポイントが含まれます。解析されたネットワーク解析レイヤがジャンクションを通過しない場合は、空のフィーチャクラスが作成されます。 | String |
turn_table_name |
基本エッジのコストを増減する、通過したグローバル ターンおよびターン フィーチャに関する情報が入るテーブルの名前。解析されたネットワーク解析レイヤがターンを通過しない場合は、空のテーブルが作成されます。規制ターンは通過されないため、出力に含まれることはありません。 | String |
コードのサンプル
次の Python ウィンドウ スクリプトは、CopyTraversedSourceFeatures(通過したソース フィーチャのコピー)ツールを使用して通過したエッジ、ジャンクション、およびターンをルート ネットワーク解析レイヤから、メモリ内ワークスペースのフィーチャクラスとテーブルに書き込む方法を示しています。
import arcpy
arcpy.na.CopyTraversedSourceFeatures("Route","in_memory",
"TraversedEdges",
"TraversedJunctions",
"TraversedTurns")
次のスタンドアロン Python スクリプトは、CopyTraversedSourceFeatures(通過したソース フィーチャのコピー)を使用して、国勢調査地区の重心から最寄りの消防署までのルートに共通する道路を見つける方法を示しています。これらの結果は、どの道路が最も頻繁に使用される緊急時の経路かを示すために役立ちます。
# Name: CopyTraversedSourceFeatures_ex02.py
# Description: The scenario shows how to find the streets that are common to the
# routes between the closest fire station and the census tract
# centroids. These streets can be used to identify critical points
# in case of an emergency.
# Requirements: Network Analyst Extension
#Import system modules
import os
import arcpy
from arcpy import env
try:
#Check out the Network Analyst extension license
arcpy.CheckOutExtension("Network")
#Set environment settings
env.workspace = "C:/data/SanFrancisco.gdb"
env.overwriteOutput = True
#Set local variables
inNetworkDataset = "Transportation/Streets_ND"
outNALayerName = "EmergencyRoutes"
impedanceAttribute = "TravelTime"
inFacilities = "Analysis/FireStations"
inIncidents = "Analysis/TractCentroids"
edgeFrequency = "in_memory/EdgeFrequency"
outLayerFile = "C:/data/output" + "/" + outNALayerName + ".lyr"
outFeatures = "CriticalStreets"
#Create a new closest facility analysis layer. For this scenario, the default
#value for all the remaining parameters statisfies the analysis requirements
outNALayer = arcpy.na.MakeClosestFacilityLayer(inNetworkDataset, outNALayerName,
impedanceAttribute, "TRAVEL_FROM")
#Get the layer object from the result object. The closest facility layer can
#now be referenced using the layer object.
outNALayer = outNALayer.getOutput(0)
#Get the names of all the sublayers within the closest facility layer.
subLayerNames = arcpy.na.GetNAClassNames(outNALayer)
#Stores the layer names that we will use later
facilitiesLayerName = subLayerNames["Facilities"]
incidentsLayerName = subLayerNames["Incidents"]
#Load fire station features as facilities and ensure that they are not
#located on restricted portions of the network. Use default field mappings
#and search tolerance
arcpy.na.AddLocations(outNALayer,facilitiesLayerName,inFacilities,"", "",
exclude_restricted_elements = "EXCLUDE")
#Load tract centroids as incidents and ensure that they are not located on
#restricted portions of the network. Map the ID field from Tract Centroids
#as the name for incidents using field mappings
fieldMappings = arcpy.na.NAClassFieldMappings(outNALayer, incidentsLayerName)
fieldMappings['Name'].mappedFieldName = "ID"
arcpy.na.AddLocations(outNALayer,incidentsLayerName, inIncidents,
fieldMappings,"", exclude_restricted_elements = "EXCLUDE")
#Solve the closest facility layer and copy the travered source features to a
#temporary in-memory workspace. Use default names for the output feature
#classes and table. Get only the first output which are the edges traversed.
traversedEdges = arcpy.na.CopyTraversedSourceFeatures(outNALayer,
"in_memory").getOutput(0)
#Calculate the frequency of SourceOID in the traversed edges
arcpy.analysis.Frequency(traversedEdges, edgeFrequency,
["SourceOID", "SourceName"])
#Get the full path to the streets feature class by describing the network
#dataset referenced by the network analysis layer.
network = arcpy.Describe(outNALayer.dataSource)
edgeSources = network.edgeSources
for es in edgeSources:
if es.name.lower() == "streets":
streetsSource = os.path.join(os.path.dirname(network.catalogPath),
es.name)
break
else:
raise Exception("Failed to detrmine the path for the streets feature class")
#Join the frequency field to the streets feature class. In order to speed up
#the join select the streets that share a line segment with traversed streets.
streetsLayer = "StreetsLayer"
arcpy.management.MakeFeatureLayer(streetsSource,streetsLayer)
arcpy.management.SelectLayerByLocation(streetsLayer, "SHARE_A_LINE_SEGMENT_WITH",
traversedEdges)
arcpy.management.JoinField(streetsLayer, "ObjectID", edgeFrequency,
"SourceOID", "FREQUENCY")
#Copy the streets that have a frequency value to a new feature class.
arcpy.management.SelectLayerByAttribute(streetsLayer, "SUBSET_SELECTION",
"FREQUENCY IS NOT NULL")
arcpy.management.CopyFeatures(streetsLayer,outFeatures)
#Delete the Frequency field from the streets feature class
arcpy.management.DeleteField(streetsLayer, "FREQUENCY")
#Save the solved na layer as a layer file on disk with relative paths
arcpy.management.SaveToLayerFile(outNALayer,outLayerFile,"RELATIVE")
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 occured on line %i" % tb.tb_lineno
print str(e)