Start-Ziel-Kostenmatrix-Analyse-Layer erstellen (Network Analyst)

Zusammenfassung

Erstellt einen Netzwerkanalyse-Layer für Start-Ziel-Kostenmatrix und legt seine Analyse-Eigenschaften fest. Mit dem Netzwerkanalyse-Layer für die Start-Ziel-Kostenmatrix können Sie eine Kostenübersicht von einer Gruppe von Startstandorten zu einer Gruppe von Zielstandorten erstellen. Der Layer kann mit einem lokalen Netzwerk-Dataset oder mit einem online bzw. in einem Portal gehosteten Service erstellt werden.

Verwendung

  • Nachdem Sie den Analyse-Layer mit diesem Werkzeug erstellt haben, können Sie ihm Netzwerkanalyse-Objekte mithilfe des Werkzeugs Standorte hinzufügen hinzufügen, die Analyse mit dem Werkzeug Berechnen berechnen und die Ergebnisse mit dem Werkzeug In Layer-Datei speichern auf der Festplatte speichern.

  • Bei Verwendung dieses Werkzeugs in Geoverarbeitungsmodellen muss der Ausgabe-Netzwerkanalyse-Layer in einen Modellparameter geändert werden, wenn das Modell als Werkzeug ausgeführt wird. Andernfalls wird der Ausgabe-Layer dem Inhalt der Karte nicht hinzugefügt.

  • In ArcGIS Pro werden die Daten von Netzwerkanalyse-Layern in File-Geodatabase-Feature-Classes auf der Festplatte gespeichert. Bei der Erstellung eines Netzwerk-Analyse-Layers in einem Projekt werden die Daten des Layers in einem neuen Feature-Dataset in der Umgebung Aktueller Workspace erstellt. Bei der Erstellung eines Netzwerkanalyse-Layers in einem Python-Skript müssen Sie zunächst mit arcpy.env.workspace = "<path to file gdb>" explizit eine File-Geodatabase, in der die Layer-Daten gespeichert werden sollen, als Workspace-Umgebung festlegen. Bei der Erstellung des Layers wird dieser File-Geodatabase ein neues Feature-Dataset mit den entsprechenden Sublayer-Feature-Classes hinzugefügt.

Syntax

arcpy.na.MakeODCostMatrixAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {cutoff}, {number_of_destinations_to_find}, {time_of_day}, {time_zone}, {line_shape}, {accumulate_attributes})
ParameterErklärungDatentyp
network_data_source

Das Netzwerk-Dataset oder der Service, für das bzw. den die Netzwerkanalyse ausgeführt wird. Verwenden Sie die Portal-URL für einen Service.

Network Dataset Layer;String
layer_name
(optional)

Der Name des zu erstellenden Netzwerkanalyse-Layers.

String
travel_mode
(optional)

Der Name des Reisemodus, der in der Analyse verwendet werden soll. Der Reisemodus stellt eine Sammlung von Netzwerkeinstellungen (z. B. Reisebeschränkungen und Wendenregeln) dar, mit denen festgelegt wird, wie ein Fußgänger, Auto, Lkw oder anderes Transportmittel sich durch das Netzwerk bewegt. Reisemodi werden für die Netzwerkdatenquelle definiert.

Ein arcpy.na.TravelMode-Objekt und eine Zeichenfolge mit der gültigen JSON-Repräsentation eines Reisemodus können ebenfalls als Eingabe für den Parameter verwendet werden.

String
cutoff
(optional)

Der Impedanzwert, an dem die Suche nach Zielen für einen angegebenen Startpunkt beendet wird. Dieser Wert wird in den Einheiten des Impedanzattributs angegeben, das vom ausgewählten Reisemodus verwendet wird. Es werden keine Ziele gefunden, die über diesem Grenzwert liegen. Dieser Grenzwert kann pro Startpunkt überschrieben werden, indem einzelne Grenzwerte im Startpunkt-Sublayer festgelegt werden. Für die Analyse wird standardmäßig kein Grenzwert verwendet.

Double
number_of_destinations_to_find
(optional)

Die Anzahl von Zielen, die pro Startpunkt gesucht werden sollen. Der Standard kann überschrieben werden, indem ein einzelner Wert für die Eigenschaft TargetDestinationCount im Startpunkte-Sublayer angegeben wird. Standardmäßig werden keine Grenzwerte verwendet, sodass alle Ziele gefunden werden.

Long
time_of_day
(optional)

Gibt die Abfahrtszeit vom Startpunkt an.

Wenn Sie ein verkehrsbasiertes Impedanzattribut ausgewählt haben, wird die Lösung auf Grundlage des dynamischen Verkehrsaufkommens zu dem hier angegebenen Zeitpunkt generiert. Sie können ein Datum und eine Uhrzeit im Format 14.5.2012 10:30 angeben.

Statt ein bestimmtes Datum zu verwenden, kann ein Wochentag mithilfe der folgenden Datumsangaben angegeben werden:

  • Heute: 30.12.1899
  • Sonntag: 31.12.1899
  • Montag: 1.1.1900
  • Dienstag: 02.01.1900
  • Mittwoch: 03.01.1900
  • Donnerstag: 04.01.1900
  • Freitag: 05.01.1900
  • Samstag: 06.01.1900

Date
time_zone
(optional)

Die Zeitzone des Parameters Zeitpunkt.

  • LOCAL_TIME_AT_LOCATIONSDer Parameter Zeitpunkt bezieht sich auf die Zeitzone, in der sich die Startpunkte befinden. Dies ist die Standardeinstellung.
  • UTCDer Parameter Zeitpunkt bezieht sich auf die koordinierte Weltzeit (UTC). Wählen Sie diese Option aus, wenn Sie die Start-Ziel-Kostenmatrix für eine bestimmte Zeit (z. B. jetzt) erstellen möchten, sich jedoch nicht sicher sind, in welcher Zeitzone sich die Startpunkte befinden.
String
line_shape
(optional)
  • NO_LINESFür das Ausgabe-Start-Ziel-Routen-Paar wird kein Shape erstellt. Dies ist nützlich, wenn Sie über zahlreiche Startpunkte und Ziele verfügen und nur an den Impedanzkosten in der Start-Ziel-Kostenmatrixtabelle, nicht aber an der Visualisierung der Start-Ziel-Kostenmatrix in einer Karte interessiert sind.
  • STRAIGHT_LINESDas Ausgaberouten-Shape ist eine einzelne gerade Linie zwischen jedem einzelnen Start-Ziel-Paar. Dies ist die Standardeinstellung.

Gleichgültig, welcher Ausgabe-Shape-Typ gewählt wird, die optimale Route wird immer durch die Netzwerkimpedanz und nie durch die Euklidische Entfernung bestimmt. Dies bedeutet, dass sich nur die Routen-Shapes und nicht der zugrunde liegende Durchlauf des Netzwerks unterscheiden.

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

Eine Liste mit Kostenattributen, die während der Analyse akkumuliert werden sollen. Diese akkumulierten Attribute dienen nur Referenzzwecken. Vom Solver wird bei der Berechnung der Analyse nur das Kostenattribut verwendet, das im festgelegten Reisemodus angegeben ist.

Für jedes akkumulierte Kostenattribut wird den Netzwerkanalyse-Ausgabe-Features eine Total_[Impedance]-Eigenschaft hinzugefügt.

Dieser Parameter ist nicht verfügbar, wenn es sich bei der Netzwerkdatenquelle um einen ArcGIS Online-Service handelt bzw. um einen Service handelt, der auf einer Portal for ArcGIS-Version beruht, in der eine Akkumulation nicht unterstützt wird.

String

Abgeleitete Ausgabe

NameErklärungDatentyp
out_network_analysis_layer

Der neu erstellte Netzwerkanalyse-Layer.

Network Analyst-Layer

Codebeispiel

MakeODCostMatrixAnalysisLayer – Beispiel 1 (Python-Fenster)

Ausführen des Werkzeugs, wenn nur die erforderlichen Parameter verwendet werden.

network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeODCostMatrixAnalysisLayer(network, "DrivetimeCosts")
MakeODCostMatrixAnalysisLayer – Beispiel 2 (Python-Fenster)

Führen Sie das Werkzeug unter Verwendung aller Parameter aus.

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", "TravelTime"])
MakeODCostMatrixAnalysisLayer – Beispiel 3 (Workflow)

Im folgenden eigenständigen Python-Skript wird veranschaulicht, wie das Werkzeug MakeODCostMatrixAnalysisLayer verwendet werden kann, um eine Start-Ziel-Kostenmatrix für die Warenlieferung von den Lagern an die Geschäfte zu erstellen, die innerhalb einer Fahrzeit von 10 Minuten erreichbar sind.

# 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))
MakeODCostMatrixAnalysisLayer – Beispiel 4 (Workflow)

Mit dem folgenden eigenständigen Python-Skript wird veranschaulicht, wie auf Sublayer zugegriffen, Eingabe- und Ausgabe-Layer verbunden und Feldwerte aus Eingabe-Startpunkten und -Zielen auf den Ausgabe-Linien-Layer übertragen werden.

Ältere Versionen:

Mit der Funktion GetNASublayer kann nach den Sublayern eines Netzwerkanalyse-Layers gesucht werden. Sie wurde in ArcGIS Pro 2.7 eingeführt. In älteren Softwareversionen bestand die beste Möglichkeit, ein Sublayer-Objekt eines Netzwerkanalyse-Layers abzurufen, in der Verwendung der listLayers-Methode des Layer-Objekts der Netzwerkanalyse mit dem Namen des Sublayers als Platzhalter.

# 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 datetime
import os
import arcpy

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
    arcpy.env.workspace = os.path.join(output_dir, "Output.gdb")
    arcpy.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
    origins_sublayer = arcpy.na.GetNASublayer(layer_object, "Origins")
    destinations_sublayer = arcpy.na.GetNASublayer(layer_object, "Destinations")
    lines_sublayer = arcpy.na.GetNASublayer(layer_object, "ODLines")

    # 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))
MakeODCostMatrixAnalysisLayer – Beispiel 5 (eigenständiges Skript)

Mit dem folgenden eigenständigen Python-Skript wird veranschaulicht, wie eine geänderte Version eines Reisemodus aus dem Netzwerk-Dataset erstellt wird und wie dieser Reisemodus beim Erstellen eines neuen Layers mit Start-Ziel-Kostenmatrix verwendet wird.

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)

Lizenzinformationen

  • Basic: Ja
  • Standard: Ja
  • Advanced: Ja