Resumen
Crea una capa de análisis de red de área de servicio y establece sus propiedades de análisis. Una capa de análisis del área de servicio es útil para determinar el área de accesibilidad dentro de un coste de valor límite dado desde la ubicación de una instalación. La capa se puede crear utilizando un dataset de red local o un servicio de generación de rutas alojado en línea o en un portal.
Uso
Después de crear la capa de análisis con esta herramienta, puede agregarle objetos de análisis de red usando la herramienta Agregar ubicaciones, resolver el análisis usando la herramienta Resolver y guardar los resultados en el disco usando la herramienta Guardar en archivo de capa.
Al utilizar esta herramienta en modelos de geoprocesamiento, si el modelo se ejecuta como herramienta, la capa de análisis de red de salida debe convertirse en parámetro de modelo; de lo contrario, la capa de salida no se agrega al contenido del mapa.
En ArcGIS Pro, los datos de las capas de análisis de red se almacenan en el disco en las clases de entidad de geodatabase de archivos. Al crear una capa de análisis de red en un proyecto, los datos de la capa se crearán en un nuevo dataset de entidades en el entorno de Espacio de trabajo actual. Al crear una capa de análisis de red en un script de Python, primero debe definir explícitamente el entorno del espacio de trabajo en la geodatabase de archivos donde desea que se almacenen los datos de la capa utilizando arcpy.env.workspace = "<path to file gdb>". Cuando se crea la capa, un dataset de entidades nuevo que contiene las clases de entidades de la subcapa correspondiente se agregará a esta geodatabase de archivos.
Sintaxis
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})
Parámetro | Explicación | Tipo de datos |
network_data_source | El servicio o dataset de red en el que se realizará el análisis de red. Utilice la dirección URL del portal para un servicio. | Network Dataset Layer;String |
layer_name (Opcional) | El nombre de la capa de análisis de red que se creará. | String |
travel_mode (Opcional) | El nombre del modo de viaje que se utilizará en el análisis. El modo de viaje representa un conjunto de parámetros de red como, por ejemplo, restricciones del viaje y las normas sobre cambios de sentido, que determina cómo un peatón, un coche, un camión u otro medio de transporte se desplaza por la red. Los modos de viaje se definen en su fuente de datos de red. También puede utilizar como entrada del parámetro un objeto arcpy.na.TravelMode y una cadena que contenga la representación JSON válida de un modo de viaje. | String |
travel_direction (Opcional) | Especifica la dirección de viaje hacia o desde las instalaciones.
Utilizando esta parámetro se pueden encontrar distintas áreas de servicio en una red con restricciones unidireccionales e impedancias diferentes basadas en la dirección del viaje. El área de servicio de una tienda de entrega de pizzas, por ejemplo, se debe crear desde la instalación, mientras que el área de servicio de un hospital se debe crear hacia la instalación. | String |
cutoffs [cutoffs,...] (Opcional) | La extensión del área de servicio que se debe calcular, expresada en las unidades del atributo de impedancia que se utiliza en el modo de viaje seleccionado. Por ejemplo, al analizar un tiempo de recorrido, un valor límite de 10 significa que el área de servicio resultante representará un área a la que se puede llegar en 10 minutos conduciendo. Se pueden establecer varios valores límites para crear áreas de servicio concéntricas. Por ejemplo, para encontrar áreas de servicio a 2, 3 y 5 minutos de la misma instalación, debe especificar 2, 3 y 5 como valores de este parámetro. Se puede invalidar este valor límite predeterminado por instalación, especificando valores de corte individuales en la subcapa de instalaciones. | Double |
time_of_day (Opcional) | La hora de salida o de llegada a las instalaciones de la capa de área de servicio. La interpretación de este valor como una hora de salida o llegada depende de si el viaje es desde o hacia las instalaciones.
El parámetro time_of_day resulta más útil para buscar las carreteras a las que se puede llegar con arreglo a un modo de viaje que utiliza un atributo de impedancia que varía según la hora del día, como el que está basado en las condiciones dinámicas del tráfico. Solucionar el mismo análisis utilizando diferentes valores de time_of_day le permite ver cómo llegar a una instalación cambia con el transcurso del tiempo. Por ejemplo, el área de servicio de cinco minutos alrededor de una estación de bomberos podría comenzar con gran volumen en las primeras horas de la mañana, disminuir en la hora pico, aumentar en las últimas horas de la mañana y así sucesivamente durante el día. Una fecha y hora se puede especificar como 21/10/2015 10:30 a.m. En lugar de usar una fecha determinada, también se puede especificar un día de la semana utilizando las siguientes fechas:
| Date |
time_zone (Opcional) | Especifica la zona horaria del parámetro de hora del día.
| String |
output_type (Opcional) | Especifica el tipo de salida que se generará. La salida de áreas de servicio puede ser entidades de línea que representan las carreteras a las que se puede llegar antes de sobrepasar los valores límite o entidades poligonales que abarquen estas líneas (representan el área a la que se puede llegar).
Los tipos de salida Líneas y Polígonos y líneas no están disponibles si la fuente de datos de red es un servicio en una versión de Portal for ArcGIS que no admite la generación de líneas. | String |
polygon_detail (Opcional) | Especifica el nivel de detalle de los polígonos de salida.
Si su análisis incluye un área urbana con una red de calles semejante a una cuadrícula, la diferencia entre los polígonos generalizados y estándar será mínima. Sin embargo, para los caminos rurales y de montaña, los polígonos estándares y detallados pueden presentar resultados significativamente más precisos que los polígonos generalizados. | String |
geometry_at_overlaps (Opcional) | Especifica el comportamiento de la salida del área de servicio desde varias instalaciones en relación a cada una de ellas.
| String |
geometry_at_cutoffs (Opcional) | Especifica el comportamiento de la salida del área de servicio para una única instalación cuando se especifican varios valores límite. Este parámetro no se aplica a la salida de línea.
| String |
polygon_trim_distance (Opcional) | Distancia de corte del polígono del área de servicio. La distancia de corte del polígono es la distancia que el polígono de área de servicio se extenderá desde la carretera cuando no haya cerca otras carreteras a las que se pueda acceder, de forma parecida al tamaño de una zona de influencia de línea. Esto es útil cuando la red es dispersa y no desea que el área de servicio cubra grandes áreas en las que no hay entidades. Este parámetro incluye un valor y unidades para la distancia. El valor predeterminado es 100 metros. | Linear Unit |
exclude_sources_from_polygon_generation [exclude_sources_from_polygon_generation,...] (Opcional) | Orígenes de eje de dataset de red que se excluirán al generar polígonos de área de servicio. No se generarán polígonos alrededor de los orígenes excluidos, a pesar de que se recorran en el análisis. La exclusión de una fuente de red de los polígonos de las áreas de servicio no evita que dichas fuentes se atraviesen. Excluir las fuentes de los polígonos de las áreas de servicio solo influye en la forma poligonal de las áreas de servicio. Para evitar atravesar una determinada fuente de red, debe crear una restricción adecuada al definir su dataset de red. Esta opción es útil cuando no desea incluir algunas fuentes de red en la generación de polígonos porque crean polígonos menos exactos o porque son intrascendentes para el análisis del área de servicio. Por ejemplo, mientras crea un área de servicio de recorrido a pie en una red multimodal que incluye calles y líneas de metro, debe elegir excluir las líneas de metro de la generación del polígono. Aunque el viajero puede utilizar las líneas de metro, no pueden detenerse a medio camino en la línea de metro y entrar en un edificio cercano. En cambio, deben viajar hasta la siguiente parada, salir de la estación de metro y utilizar las calles para ir a pie hasta el edificio. Sería impreciso generar una entidad poligonal alrededor de una línea de metro. Este parámetro no está disponible cuando los tipos de geometría de salida no incluyen polígonos, hay menos de dos fuentes de eje en la red, la fuente de datos de red es un servicio de ArcGIS Online, o bien la fuente de datos de red es un servicio de una versión de Portal for ArcGIS que no admite la exclusión de fuentes. | String |
accumulate_attributes [accumulate_attributes,...] (Opcional) | Lista de los atributos de coste que se acumularán durante el análisis. Estos atributos acumulados solo se utilizan como referencia; el solucionador solo utiliza el atributo de coste empleado en el modo de viaje indicado al solucionar el análisis. Para cada atributo de coste acumulado, se rellena una propiedad Total_[Impedance] en las entidades de salida del análisis de red. Este parámetro no está disponible si la capa de análisis no está configurada para líneas de salida, si la fuente de datos de red es un servicio ArcGIS Online o si la fuente de datos de red es un servicio en una versión de Portal for ArcGIS que no admite la acumulación. | String |
Salida derivada
Nombre | Explicación | Tipo de datos |
out_network_analysis_layer | La capa de análisis de red recién creada. | Capa de Network Analyst |
Muestra de código
Ejecutar la herramienta utilizando solo los parámetros requeridos.
network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeServiceAreaAnalysisLayer(network, "FireStationCoverage")
Ejecutar la herramienta utilizando todos los parámetros.
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"])
En el siguiente script independiente de Python se muestra cómo se puede utilizar la herramienta MakeServiceAreaAnalysisLayer para generar áreas de servicio a 1, 2 y 3 minutos alrededor de estaciones de bomberos.
# 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))
En este ejemplo se muestra cómo se crean áreas de servicio alrededor de instalaciones para múltiples horas del día, así como el modo de migrar campos desde las entidades de entrada hasta las de salida e incorporar polígonos de salida a una clase de entidad existente.
# 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))
Entornos
Información de licenciamiento
- Basic: Sí
- Standard: Sí
- Advanced: Sí