Crear capa de la matriz de coste OD (Network Analyst)

Resumen

Crea una capa de análisis de red de matriz de coste origen-destino (OD) y establece sus propiedades de análisis. Una capa de análisis de matriz de coste OD es útil para representar una matriz de costes que oscilan desde un conjunto de ubicaciones de origen hasta un conjunto de ubicaciones de destino.

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.

Parámetros

EtiquetaExplicaciónTipo de datos
Red de análisis de entrada

El dataset de red en el que se realizará el análisis de matriz de coste OD.

Network Dataset Layer
Nombre de Capa de salida

Nombre de la capa de análisis de red de matriz de coste OD que se creará.

String
Atributo de impedancia

El atributo de coste que se usará como impedancia en el análisis.

String
Límite predeterminado
(Opcional)

Valor de impedancia predeterminado en el cual detener la búsqueda de destinos para un origen determinado. Si la impedancia acumulada supera el valor límite, el trazado poligonal se detiene. El valor predeterminado se puede invalidar especificando el valor límite en los orígenes.

Double
Número predeterminado de destinos para buscar
(Opcional)

Cantidad predeterminada de destinos a encontrar para cada origen. Se puede invalidar el valor predeterminado especificando un valor para la propiedad TargetDestinationCount en los orígenes.

Long
Acumuladores
(Opcional)

Lista de los atributos de coste que se acumularán durante el análisis. Estos atributos de acumulación solo se utilizan como referencia; el solucionador solo utiliza los atributos de coste especificados por el parámetro Atributo de impedancia para calcular la ruta.

Para cada atributo de coste acumulado, se agrega una propiedad Total_ [Impedancia] a las rutas generadas por el solucionador.

String
Política de cambio de sentido
(Opcional)

Especifica la política de cambio de sentido que se usará en los cruces. Permitir cambios de sentido implica que el solucionador puede dar la vuelta en un cruce y regresar por la misma calle. Debido a que los cruces representan intersecciones de calles y callejones sin salida, distintos vehículos pueden dar la vuelta en algunos cruces, pero no en otros; depende de si el cruce representa una intersección o un callejón sin salida. Para dar cabida a esta situación, el parámetro de la política de cambios de sentido se especifica implícitamente por la cantidad de ejes que se conectan en el cruce, lo que se conoce como valencia de cruce. Los valores aceptables para este parámetro se enumeran a continuación; cada uno seguido de una descripción de su significado en términos de valencia de cruce.

  • ALLOW_UTURNSSe permiten los cambios de sentido en los cruces con cualquier cantidad de bordes adyacentes. Este es el valor predeterminado.
  • NO_UTURNSLos cambios de sentido están prohibidos en todos los cruces, independientemente de la valencia de cruce. No obstante, los cambios de sentido siguen estando permitidos en las ubicaciones de red, aunque se elija esta configuración; pero también puede establecer la propiedad CurbApproach de cada ubicación de red individual para prohibir los cambios de sentido.
  • ALLOW_DEAD_ENDS_ONLYLos cambios de sentido están prohibidos en todos los cruces, excepto los que tienen solo un borde adyacente (una calle sin salida).
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLYLos cambios de sentido están prohibidos en los cruces donde se encuentran dos bordes adyacentes, pero están permitidos en las intersecciones (cruces con tres o más bordes adyacentes) o calles sin salida (cruces con exactamente un borde adyacente). A menudo, las redes tienen cruces extraños en medio de segmentos de carretera. Esta opción evita que los vehículos hagan cambios de sentido en estas ubicaciones.

Si necesita una política de cambios de sentido definida de forma más precisa, plantéese agregar un evaluador de retraso de giro global a un atributo de coste de red, o bien ajuste su configuración si existe, y preste especial atención a la configuración de los giros inversos. También puede definir la propiedad CurbApproach de sus ubicaciones de red.

String
Restricciones
(Opcional)

Lista de atributos de restricción que se aplicarán durante el análisis.

String
Utilizar jerarquía en el análisis
(Opcional)
  • Activado: el atributo de jerarquía se usará para el análisis. Utilizar una jerarquía hace que el solucionador prefiera bordes de orden superior en lugar de bordes de orden inferior. Las soluciones jerárquicas son más rápidas y se pueden utilizar para simular la preferencia de un conductor que opta por viajar por autopistas en lugar de por carreteras locales cuando sea posible, aunque signifique un viaje más largo. Esta opción está activa solo si el dataset de red de entrada tiene atributos de jerarquía.
  • Desactivado: el atributo de jerarquía no se usará para el análisis. Si no se utiliza la jerarquía, el resultado es una ruta exacta para el dataset de red.

El parámetro está inactivo si no se define ningún atributo de jerarquía en el dataset de red utilizado para realizar el análisis.

Boolean
Configuración de clasificación de jerarquía
(Opcional)

Heredado:

Antes de la versión 10, este parámetro le permitía cambiar los rangos de jerarquía para el análisis de los rangos de jerarquía predeterminados establecidos en el dataset de red. En la versión 10, este parámetro ya no es compatible. Para cambiar los rangos de jerarquía del análisis, actualice los rangos de jerarquía predeterminados en el dataset de red.

Network Analyst Hierarchy Settings
Forma de ruta de salida
(Opcional)
  • NO_LINESNo se generará ninguna forma para las rutas de salida. lo que es útil si tiene un gran número de orígenes y destinos y está interesado solo en la tabla de matriz de coste OD y no en las formas de las líneas de salida.
  • STRAIGHT_LINESLa forma de la ruta de salida será una línea recta simple entre cada par origen-destino.

Independientemente del tipo de forma de salida que especificado, la mejor ruta siempre se determina por la impedancia de la red y no por la distancia euclidiana. Esto significa que solo las formas de la ruta son diferentes, no los elementos transitables subyacentes de la red.

String
Hora de inicio
(Opcional)

Indica la hora de salida de los orígenes.

Si eligió un atributo de impedancia con base en el tráfico, la solución se generará dadas las condiciones de tráfico dinámicas a la hora del día que se especifica a continuación. Una fecha y hora se puede especificar como 14/5/2012 10:30 a.m.

Instead of using a particular date, a day of the week can be specified using the following dates.

  • Today—12/30/1899
  • Sunday—12/31/1899
  • Monday—1/1/1900
  • Tuesday—1/2/1900
  • Wednesday—1/3/1900
  • Thursday—1/4/1900
  • Friday—1/5/1900
  • Saturday—1/6/1900
For example, to specify that travel should begin at 5:00 PM on Tuesday, specify the parameter value as 1/2/1900 5:00 PM.

Date

Salida derivada

EtiquetaExplicaciónTipo de datos
Capa de Network Analyst

La capa de análisis de red recién creada.

Capa de Network Analyst

arcpy.management.MakeODCostMatrixLayer(in_network_dataset, out_network_analysis_layer, impedance_attribute, {default_cutoff}, {default_number_destinations_to_find}, {accumulate_attribute_name}, {UTurn_policy}, {restriction_attribute_name}, {hierarchy}, {hierarchy_settings}, {output_path_shape}, {time_of_day})
NombreExplicaciónTipo de datos
in_network_dataset

El dataset de red en el que se realizará el análisis de matriz de coste OD.

Network Dataset Layer
out_network_analysis_layer

Nombre de la capa de análisis de red de matriz de coste OD que se creará.

String
impedance_attribute

El atributo de coste que se usará como impedancia en el análisis.

String
default_cutoff
(Opcional)

Valor de impedancia predeterminado en el cual detener la búsqueda de destinos para un origen determinado. Si la impedancia acumulada supera el valor límite, el trazado poligonal se detiene. El valor predeterminado se puede invalidar especificando el valor límite en los orígenes.

Double
default_number_destinations_to_find
(Opcional)

Cantidad predeterminada de destinos a encontrar para cada origen. Se puede invalidar el valor predeterminado especificando un valor para la propiedad TargetDestinationCount en los orígenes.

Long
accumulate_attribute_name
[accumulate_attribute_name,...]
(Opcional)

Lista de los atributos de coste que se acumularán durante el análisis. Estos atributos de acumulación solo se utilizan como referencia; el solucionador solo utiliza los atributos de coste especificados por el parámetro Atributo de impedancia para calcular la ruta.

Para cada atributo de coste acumulado, se agrega una propiedad Total_ [Impedancia] a las rutas generadas por el solucionador.

String
UTurn_policy
(Opcional)

Especifica la política de cambio de sentido que se usará en los cruces. Permitir cambios de sentido implica que el solucionador puede dar la vuelta en un cruce y regresar por la misma calle. Debido a que los cruces representan intersecciones de calles y callejones sin salida, distintos vehículos pueden dar la vuelta en algunos cruces, pero no en otros; depende de si el cruce representa una intersección o un callejón sin salida. Para dar cabida a esta situación, el parámetro de la política de cambios de sentido se especifica implícitamente por la cantidad de ejes que se conectan en el cruce, lo que se conoce como valencia de cruce. Los valores aceptables para este parámetro se enumeran a continuación; cada uno seguido de una descripción de su significado en términos de valencia de cruce.

  • ALLOW_UTURNSSe permiten los cambios de sentido en los cruces con cualquier cantidad de bordes adyacentes. Este es el valor predeterminado.
  • NO_UTURNSLos cambios de sentido están prohibidos en todos los cruces, independientemente de la valencia de cruce. No obstante, los cambios de sentido siguen estando permitidos en las ubicaciones de red, aunque se elija esta configuración; pero también puede establecer la propiedad CurbApproach de cada ubicación de red individual para prohibir los cambios de sentido.
  • ALLOW_DEAD_ENDS_ONLYLos cambios de sentido están prohibidos en todos los cruces, excepto los que tienen solo un borde adyacente (una calle sin salida).
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLYLos cambios de sentido están prohibidos en los cruces donde se encuentran dos bordes adyacentes, pero están permitidos en las intersecciones (cruces con tres o más bordes adyacentes) o calles sin salida (cruces con exactamente un borde adyacente). A menudo, las redes tienen cruces extraños en medio de segmentos de carretera. Esta opción evita que los vehículos hagan cambios de sentido en estas ubicaciones.

Si necesita una política de cambios de sentido definida de forma más precisa, plantéese agregar un evaluador de retraso de giro global a un atributo de coste de red, o bien ajuste su configuración si existe, y preste especial atención a la configuración de los giros inversos. También puede definir la propiedad CurbApproach de sus ubicaciones de red.

String
restriction_attribute_name
[restriction_attribute_name,...]
(Opcional)

Lista de atributos de restricción que se aplicarán durante el análisis.

String
hierarchy
(Opcional)
  • USE_HIERARCHYEl atributo de jerarquía se usará para el análisis. Utilizar una jerarquía hace que el solucionador prefiera bordes de orden superior en lugar de bordes de orden inferior. Las soluciones jerárquicas son más rápidas y se pueden utilizar para simular la preferencia de un conductor que opta por viajar por autopistas en lugar de por carreteras locales cuando sea posible, aunque signifique un viaje más largo. Esta opción es válida solo si el dataset de red de entrada tiene atributos de jerarquía.
  • NO_HIERARCHYEl atributo de jerarquía no se usará para el análisis. Si no se utiliza la jerarquía, el resultado es una ruta exacta para el dataset de red.

El parámetro no se utiliza si no se definen atributos de jerarquía en el dataset de red utilizado para realizar el análisis.

Boolean
hierarchy_settings
(Opcional)

Heredado:

Antes de la versión 10, este parámetro le permitía cambiar los rangos de jerarquía para el análisis de los rangos de jerarquía predeterminados establecidos en el dataset de red. En la versión 10, este parámetro ya no es compatible y se debe especificar como una cadena de caracteres vacía. Para cambiar los rangos de jerarquía del análisis, actualice los rangos de jerarquía predeterminados en el dataset de red.

Network Analyst Hierarchy Settings
output_path_shape
(Opcional)
  • NO_LINESNo se generará ninguna forma para las rutas de salida. lo que es útil si tiene un gran número de orígenes y destinos y está interesado solo en la tabla de matriz de coste OD y no en las formas de las líneas de salida.
  • STRAIGHT_LINESLa forma de la ruta de salida será una línea recta simple entre cada par origen-destino.

Independientemente del tipo de forma de salida que especificado, la mejor ruta siempre se determina por la impedancia de la red y no por la distancia euclidiana. Esto significa que solo las formas de la ruta son diferentes, no los elementos transitables subyacentes de la red.

String
time_of_day
(Opcional)

Indica la hora de salida de los orígenes.

Si eligió un atributo de impedancia con base en el tráfico, la solución se generará dadas las condiciones de tráfico dinámicas a la hora del día que se especifica a continuación. Una fecha y hora se puede especificar como 14/5/2012 10:30 a.m.

Instead of using a particular date, a day of the week can be specified using the following dates.

  • Today—12/30/1899
  • Sunday—12/31/1899
  • Monday—1/1/1900
  • Tuesday—1/2/1900
  • Wednesday—1/3/1900
  • Thursday—1/4/1900
  • Friday—1/5/1900
  • Saturday—1/6/1900
For example, to specify that travel should begin at 5:00 PM on Tuesday, specify the parameter value as 1/2/1900 5:00 PM.

Date

Salida derivada

NombreExplicaciónTipo de datos
output_layer

La capa de análisis de red recién creada.

Capa de Network Analyst

Muestra de código

Ejemplo 1 de MakeODCostMatrixLayer (ventana de Python)

Ejecute la herramienta utilizando solo los parámetros requeridos.

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeODCostMatrixLayer(network, "DrivetimeCosts", "DriveTime")
Ejemplo 2 de MakeODCostMatrixLayer (ventana de Python)

Ejecutar la herramienta utilizando todos los parámetros.

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeODCostMatrixLayer(network, "DrivetimeCosts", "DriveTime", 10, 20,
                                ["Meters", "DriveTime"], "NO_UTURNS",
                                ["Oneway"], "USE_HIERARCHY", "", "NO_LINES")
Ejemplo 3 de MakeODCostMatrixLayer (flujo de trabajo)

En la siguiente secuencia independiente de comandos de Python se muestra cómo se puede utilizar la herramienta MakeODCostMatrixLayer para crear una matriz de coste origen-destino para la entrega de productos desde el almacén hasta todas las tiendas dentro de un tiempo de viaje de 10 minutos.

# Name: MakeODCostMatrixLayer_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:
    #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"
    impedance = "DriveTime"
    search_tolerance = "1000 Meters"
    accumulate_attributes = ["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. Apart from finding the drive time to the stores, we also
    #want to find the total distance, so we will accumulate the "Meters"
    #impedance attribute.
    result_object = arcpy.na.MakeODCostMatrixLayer(network, layer_name,
                                                impedance, 10, "",
                                                accumulate_attributes)

    #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))
Ejemplo 4 de MakeODCostMatrixLayer (flujo de trabajo)

El siguiente script de Phython independiente muestra cómo se accede a subcapas, se unen capas de entrada y salida y se transfieren valores de campo desde los orígenes y destinos de entrada a la capa de líneas de salida.

# Name: MakeODCostMatrixLayer_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:
    #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"
    #Optimize based on travel time
    impedance = "TravelTime"
    #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.MakeODCostMatrixLayer(network, layer_name,
                    impedance,
                    default_number_destinations_to_find=num_hospitals_to_find,
                    accumulate_attribute_name=accumulate_attributes,
                    output_path_shape=out_lines, time_of_day=start_time)

    #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, "",
                            exclude_restricted_elements = "EXCLUDE")

    #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, "",
                            exclude_restricted_elements = "EXCLUDE")

    #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, TravelTime cost, and other
    #accumulated costs) from the output Lines to a copy of the input census
    #tracts feature class using the Tract_ID field
    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))