Копирование пройденных исходных объектов (Copy Traversed Source Features) (Network Analyst)
Резюме
Создает два класса объектов и таблицу, которые содержат сведения о ребрах, соединениях и поворотах, обходимых при расчете слоя сетевого анализа.
Использование
-
Инструмент рассчитывает входной слой сетевого анализа, если это еще не сделано. Слой анализа рассчитывается повторно, если входные данные были изменены после предыдущего расчета.
Пройденные исходные объекты могут быть созданы для следующих слоев сетевого анализа:
- Маршрут (Route)
- Область обслуживания (Service area)
- Ближайший пункт обслуживания (Closest facility)
- Задача выбора маршрута транспортного средства (Vehicle routing problem)
Пройденные исходные объекты нельзя создать для следующих слоев:
- Матрица Источник-Назначение (OD cost matrix)
- Размещение-распределение (Location-allocation)
Выходной класс объектов соединений включает не только точки, представляющие пройденные соединения сети, но также и точки, представляющие следующие элементы:
- Пройденные точечные барьеры
- Точки входа и выхода пройденных линейных и полигональных барьеров
- Посещенные остановки при анализе маршрута
- Посещенные пункты обслуживания и концы границ при анализе области обслуживания
- Посещенные пункты обслуживания и инциденты при анализе ближайшего пункта обслуживания
- Посещенные заказы, станции и границы при решении задачи выбора маршрута транспорта
Системой координат выходных классов объектов можно управлять, указав параметр среды Выходная система координат (Output Coordinate System) или задав набор данных объекта в базе геоданных как значение параметра Выходное местоположение (Output Location). Если параметр среды Выходная система координат (Output Coordinate System) не указан или если значением параметра Выходное местоположение (Output Location) не является набор данных объекта, система координат выходных классов объектов совпадает с системой координат входного слоя сетевого анализа.
Синтаксис
Параметр | Объяснение | Тип данных |
input_network_analysis_layer |
Слой сетевого анализа, из которого копируются пройденные исходные объекты. Если у слоя сетевого анализа нет допустимого результата, слой будет рассчитан для получения результата. | Network Analyst Layer |
output_location |
Рабочая область, в которой будут сохранены выходная таблица и два класса пространственных объектов. | 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)