Générer une couche d’analyse de matrice de coût Origine-Destination (Network Analyst)

Synthèse

Crée une couche d’analyse de réseau de matrice de coût origine-destination (OD) et définit ses propriétés d’analyse. Une couche d'analyse de matrice de coût origine-destination sert à représenter une matrice de coûts partant de localisations d'origine vers un ensemble de localisations de destination. La couche peut être créée à l'aide d'un jeu de données réseau local ou d'un service hébergé en ligne ou sur un portail.

Utilisation

  • Après avoir créé la couche d’analyse avec cet outil, vous pouvez ajouter des objets d’analyse de réseau à l’aide de l’outil Ajouter des localisations, résoudre l’analyse à l’aide de l’outil Calculer et enregistrer les résultats sur le disque à l’aide de l’outil Enregistrer dans un fichier de couche.

  • Lorsque vous utilisez cet outil dans des modèles de géotraitement, si le modèle est exécuté en tant qu’outil, la couche d’analyse de réseau en sortie doit être convertie en paramètre de modèle. Dans le cas contraire, la couche en sortie n’est pas ajoutée au contenu de la carte.

  • Dans ArcGIS AllSource, les données des couches d’analyse de réseau sont stockées sur disque dans des classes d’entités de géodatabase fichier. Lorsque vous créez une couche d’analyse de réseau dans un projet, les données de cette couche sont créées dans un nouveau jeu de classes d’entités dans l’environnement Espace de travail courant. Lorsque vous créez une couche d’analyse de réseau dans un script Python, vous devez commencer par définir de façon explicite l’environnement de l’espace de travail sur une géodatabase fichier dans laquelle vous voulez stocker les données de la couche à l’aide de arcpy.env.workspace = "<path to file gdb>". Lorsque la couche est créée, un nouveau jeu de données d'entité contenant les classes d'entités de sous-couche appropriées est ajouté à cette géodatabase fichier.

Paramètres

ÉtiquetteExplicationType de données
Source de données réseau

Jeu de données réseau ou service sur lequel l'analyse du réseau est effectuée. Utilisez l'URL du portail pour un service.

Network Dataset Layer;String
Nom de la couche
(Facultatif)

Nom de la couche d’analyse de réseau à créer.

String
Mode de déplacement
(Facultatif)

Nom du mode de déplacement à utiliser dans l’analyse. Le mode de déplacement représente une collection de paramètres réseau, tels que des restrictions de circulation et des règles de demi-tour, qui détermine la façon dont un piéton, une voiture, un camion ou un autre mode de transport se déplace sur le réseau. Les modes de déplacement sont définis dans votre source de données de réseau.

Vous pouvez aussi utiliser un objet arcpy.na.TravelMode et une chaîne contenant la représentation JSON valide d’un mode de déplacement en entrée du paramètre.

String
Limite
(Facultatif)

Valeur d'impédance à laquelle la recherche de destinations est arrêtée pour une origine donnée. Cette valeur est exprimée en unités de l’attribut d’impédance utilisé par le mode de déplacement choisi. Aucune destination au-delà de cette limite ne sera trouvée. Vous pouvez remplacer cette valeur limite origine par origine en spécifiant des valeurs limites individuelles dans la sous-couche des origines. Par défaut, aucune limite n'est utilisée pour l'analyse.

Double
Nombre de destinations à rechercher
(Facultatif)

Nombre de destinations à trouver par origine. Vous pouvez remplacer la valeur par défaut en spécifiant une valeur individuelle pour la propriété TargetDestinationCount dans la sous-couche des origines. Par défaut, aucune limite n'est utilisée et toutes les destinations sont trouvées.

Long
Heure du jour
(Facultatif)

Heure de départ des origines.

Si vous choisissez un attribut d’impédance basé sur la circulation, l’analyse est effectuée selon des conditions de circulation dynamiques correspondant à l’heure du jour spécifiée ici. Une date et une heure peuvent être spécifiées sous la forme 5/14/2012 10:30 AM.

Configurez votre analyse pour utiliser une des dates spéciales suivantes pour modéliser un jour de la semaine ou la date actuelle au lieu d’une date statique spécifique :

  • Aujourd’hui - 12/30/1899
  • Dimanche - 12/31/1899
  • Lundi - 1/1/1900
  • Mardi - 1/2/1900
  • Mercredi - 1/3/1900
  • Jeudi - 1/4/1900
  • Vendredi - 1/5/1900
  • Samedi - 1/6/1900

En savoir plus sur l’utilisation des dates et des heures et sur leur interprétation dans une analyse de réseau

Date
Fuseau horaire
(Facultatif)

Fuseau horaire du paramètre Time of Day (Heure du jour).

  • Heure locale des emplacementsLe paramètre Heure du jour se rapporte au fuseau horaire dans lequel se trouvent les origines. Il s’agit de l’option par défaut.
  • UTCLe paramètre Time of Day (Heure du jour) est exprimé en UTC (Temps Universel Coordonné). Choisissez cette option si vous voulez calculer la matrice de coût OD à une heure donnée (maintenant, par exemple), sans toutefois connaître avec certitude le fuseau horaire dans lequel se trouveront les origines.
String
Forme linéaire
(Facultatif)

Indique la forme de la ligne en sortie.

Quel que soit le type de forme en sortie spécifié, le meilleur itinéraire est toujours déterminé par l’impédance du réseau, jamais par la distance euclidienne. Cela signifie que seules les formes d'itinéraire sont différentes, pas le parcours du réseau sous-jacent.

  • Aucune ligneAucune forme n'est générée pour la paire d'itinéraires origine-destination en sortie. Cela est utile en présence d’un grand nombre d’origines et de destinations, si vous vous intéressez uniquement aux coûts d’impédance dans la table de la matrice de coût OD et que vous ne souhaitez pas visualiser la matrice de coût OD sur une carte.
  • Lignes droitesLa forme d'itinéraire en sortie est une ligne droite unique entre chacune des paires origine-destination. Il s’agit de l’option par défaut.
String
Attributs d'accumulation
(Facultatif)

Liste des attributs de coût à cumuler lors de l’analyse. Ces attributs accumulés servent uniquement de référence. Le solveur n’utilise que l’attribut de coût utilisé par le mode de déplacement désigné pour la réalisation de l’analyse.

Pour chaque attribut de coût accumulé, une propriété Total_[Impédance] est renseignée dans les entités en sortie de l’analyse du réseau.

Ce paramètre n’est pas disponible si la source de données réseau est un service ArcGIS Online ou si la source de données réseau est un service hébergé sur une version de Portal for ArcGIS qui ne prend pas en charge l’accumulation.

String
Ignorer les localisations non valides lors de l’analyse
(Facultatif)

Détermine si les emplacements en entrée non valides sont ignorés. En règle générale, les emplacements ne sont pas valides si ils ne peuvent pas être localisés sur le réseau. Lorsque les emplacements non valides sont ignorés, le solveur les ignore et tente de réaliser l’analyse avec les emplacements restants.

  • Activé : les emplacements en entrée non valides sont ignorés et seuls les emplacements valides sont utilisés. Il s’agit de l’option par défaut.
  • Activé : tous les emplacements en entrée sont utilisés. Les localisations non valides provoquent l’échec de l’analyse.
Boolean

Sortie obtenue

ÉtiquetteExplicationType de données
Couche Network Analyst

La couche d’analyse de réseau nouvellement créée.

Network Analyst Layer

arcpy.management.MakeODCostMatrixAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {cutoff}, {number_of_destinations_to_find}, {time_of_day}, {time_zone}, {line_shape}, {accumulate_attributes}, {ignore_invalid_locations})
NomExplicationType de données
network_data_source

Jeu de données réseau ou service sur lequel l'analyse du réseau est effectuée. Utilisez l'URL du portail pour un service.

Network Dataset Layer;String
layer_name
(Facultatif)

Nom de la couche d’analyse de réseau à créer.

String
travel_mode
(Facultatif)

Nom du mode de déplacement à utiliser dans l’analyse. Le mode de déplacement représente une collection de paramètres réseau, tels que des restrictions de circulation et des règles de demi-tour, qui détermine la façon dont un piéton, une voiture, un camion ou un autre mode de transport se déplace sur le réseau. Les modes de déplacement sont définis dans votre source de données de réseau.

Vous pouvez aussi utiliser un objet arcpy.na.TravelMode et une chaîne contenant la représentation JSON valide d’un mode de déplacement en entrée du paramètre.

String
cutoff
(Facultatif)

Valeur d'impédance à laquelle la recherche de destinations est arrêtée pour une origine donnée. Cette valeur est exprimée en unités de l’attribut d’impédance utilisé par le mode de déplacement choisi. Aucune destination au-delà de cette limite ne sera trouvée. Vous pouvez remplacer cette valeur limite origine par origine en spécifiant des valeurs limites individuelles dans la sous-couche des origines. Par défaut, aucune limite n'est utilisée pour l'analyse.

Double
number_of_destinations_to_find
(Facultatif)

Nombre de destinations à trouver par origine. Vous pouvez remplacer la valeur par défaut en spécifiant une valeur individuelle pour la propriété TargetDestinationCount dans la sous-couche des origines. Par défaut, aucune limite n'est utilisée et toutes les destinations sont trouvées.

Long
time_of_day
(Facultatif)

Heure de départ des origines.

Si vous choisissez un attribut d’impédance basé sur la circulation, l’analyse est effectuée selon des conditions de circulation dynamiques correspondant à l’heure du jour spécifiée ici. Une date et une heure peuvent être spécifiées sous la forme 5/14/2012 10:30 AM.

Configurez votre analyse pour utiliser une des dates spéciales suivantes pour modéliser un jour de la semaine ou la date actuelle au lieu d’une date statique spécifique :

  • Aujourd’hui - 12/30/1899
  • Dimanche - 12/31/1899
  • Lundi - 1/1/1900
  • Mardi - 1/2/1900
  • Mercredi - 1/3/1900
  • Jeudi - 1/4/1900
  • Vendredi - 1/5/1900
  • Samedi - 1/6/1900

En savoir plus sur l’utilisation des dates et des heures et sur leur interprétation dans une analyse de réseau

Date
time_zone
(Facultatif)

Fuseau horaire du paramètre Time of Day (Heure du jour).

  • LOCAL_TIME_AT_LOCATIONSLe paramètre Heure du jour se rapporte au fuseau horaire dans lequel se trouvent les origines. Il s’agit de l’option par défaut.
  • UTCLe paramètre Time of Day (Heure du jour) est exprimé en UTC (Temps Universel Coordonné). Choisissez cette option si vous voulez calculer la matrice de coût OD à une heure donnée (maintenant, par exemple), sans toutefois connaître avec certitude le fuseau horaire dans lequel se trouveront les origines.
String
line_shape
(Facultatif)

Indique la forme de la ligne en sortie.

  • NO_LINESAucune forme n'est générée pour la paire d'itinéraires origine-destination en sortie. Cela est utile en présence d’un grand nombre d’origines et de destinations, si vous vous intéressez uniquement aux coûts d’impédance dans la table de la matrice de coût OD et que vous ne souhaitez pas visualiser la matrice de coût OD sur une carte.
  • STRAIGHT_LINESLa forme d'itinéraire en sortie est une ligne droite unique entre chacune des paires origine-destination. Il s’agit de l’option par défaut.

Quel que soit le type de forme en sortie spécifié, le meilleur itinéraire est toujours déterminé par l’impédance du réseau, jamais par la distance euclidienne. Cela signifie que seules les formes d'itinéraire sont différentes, pas le parcours du réseau sous-jacent.

String
accumulate_attributes
[accumulate_attributes,...]
(Facultatif)

Liste des attributs de coût à cumuler lors de l’analyse. Ces attributs accumulés servent uniquement de référence. Le solveur n’utilise que l’attribut de coût utilisé par le mode de déplacement désigné pour la réalisation de l’analyse.

Pour chaque attribut de coût accumulé, une propriété Total_[Impédance] est renseignée dans les entités en sortie de l’analyse du réseau.

Ce paramètre n’est pas disponible si la source de données réseau est un service ArcGIS Online ou si la source de données réseau est un service hébergé sur une version de Portal for ArcGIS qui ne prend pas en charge l’accumulation.

String
ignore_invalid_locations
(Facultatif)

Détermine si les emplacements en entrée non valides sont ignorés. En règle générale, les emplacements ne sont pas valides si ils ne peuvent pas être localisés sur le réseau. Lorsque les emplacements non valides sont ignorés, le solveur les ignore et tente de réaliser l’analyse avec les emplacements restants.

  • SKIPLes emplacements en entrée non valides sont ignorés et seuls les emplacements valides sont utilisés. Il s’agit de l’option par défaut.
  • HALTTous les emplacements en entrée sont utilisés. Les localisations non valides provoquent l’échec de l’analyse.
Boolean

Sortie obtenue

NomExplicationType de données
out_network_analysis_layer

La couche d’analyse de réseau nouvellement créée.

Network Analyst Layer

Exemple de code

Exemple 1 d’utilisation de l’outil Générer une couche d’analyse de matrice de coût OD (fenêtre Python)

Exécute l’outil uniquement avec les paramètres requis.

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeODCostMatrixAnalysisLayer(network, "DrivetimeCosts")
Exemple 2 d'utilisation de l'outil Générer une couche d'analyse de matrice de coût OD (fenêtre Python)

Exécutez l’outil avec tous les paramètres.

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeODCostMatrixAnalysisLayer(network, "DrivetimeCosts", 
                                "Driving Time", 10, 20, "1/1/1900 9:00 AM",
                                "UTC", "NO_LINES", ["Meters", "DriveTime"])
Exemple 3 d’utilisation de l’outil Générer une couche d’analyse de matrice de coût OD (processus)

Le script Python autonome suivant montre comment l’utilisation de la fonction MakeODCostMatrixAnalysisLayer permet de créer une matrice de coût origine-destination pour la livraison de marchandises entre les entrepôts et tous les points de vente dans un temps de trajet de 10 minutes.

# Name: MakeODCostMatrixAnalysisLayer_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:
    #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/Paris.gdb"
    network = os.path.join(input_gdb, "Transportation", "ParisMultimodal_ND")
    layer_name = "WarehouseToStoreDrivetimeMatrix"
    travel_mode = "Driving Time"
    search_tolerance = "1000 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.
    result_object = arcpy.na.MakeODCostMatrixAnalysisLayer(network, layer_name,
                                                travel_mode, 10)

    #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))
Exemple 4 d'utilisation de l'outil Générer une couche d'analyse de matrice de coût OD (workflow)

Le script Python autonome suivant montre comment accéder aux sous-couches, joindre des couches en entrée et en sortie, et transférer les valeurs de champs à partir des origines et destinations en entrée vers la couche Lines en sortie.

Héritage :

La fonction GetNASublayer peut être utilisée pour extraire les sous-couches d’une couche d’analyse de réseau. Elle a été introduite dans ArcGIS Pro 2.7. Dans les versions précédentes, la meilleure manière d’extraire un objet de sous-couche d’une couche d’analyse de réseau consistait à utiliser la méthode listLayers de l’objet Layer d’analyse de réseau en utilisant le nom de la sous-couche en tant que caractère générique.

# Name: MakeODCostMatrixAnalysisLayer_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:
    #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 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"
    #User settings for driving
    travel_mode = "Driving Time"
    #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.MakeODCostMatrixAnalysisLayer(network, layer_name,
                    travel_mode,
                    number_of_destinations_to_find=num_hospitals_to_find,
                    time_of_day=start_time, line_shape=out_lines, 
                    accumulate_attributes=accumulate_attributes)

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

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

    #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, impedance attribute, and other
    #accumulated costs) from the output Lines to a copy of the input census
    #tracts feature class using the Tract_ID field
    # Determine the impedance attribute
    solver_props = arcpy.na.GetSolverProperties(layer_object)
    impedance = solver_props.impedance
    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))
Exemple 5 d'utilisation de l’outil MakeODCostMatrixAnalysisLayer (script autonome)

Le script Python autonome ci-dessous illustre la création d’une version modifiée d’un mode de déplacement à partir du jeu de données réseau et l'utilisation de ce mode de déplacement lors de la création d’une nouvelle couche de matrice de coût OD.

import json

network = r"C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
# Get all travel modes from the network dataset
travel_modes = arcpy.na.GetTravelModes(network)
# Get the Driving Distance travel mode
dd_travel_mode = travel_modes["Driving Distance"]
# Make a json representation of the travel mode
travel_mode_json = json.loads(str(dd_travel_mode))
# Modify the userHierarchy property to turn hierarchy off, and update the name
travel_mode_json["useHierarchy"] = False
travel_mode_json["name"] = "Driving Distance without Hierarchy"
# Create a new travel mode object from the modified json
new_travel_mode_object = arcpy.na.TravelMode(json.dumps(travel_mode_json))
# Use the new travel mode object to MakeODCostMatrixAnalysisLayer
# We could also pass in the json directly without first converting it to an object
arcpy.na.MakeODCostMatrixAnalysisLayer(network, "OD Without Hierarchy", new_travel_mode_object)