Zusammenfassung
Erstellt einen Netzwerkanalyse-Layer für das Vehicle Routing Problem und legt seine Analyseeigenschaften fest. Ein Analyse-Layer für das Vehicle Routing Problem (VRP) ist für die Optimierung verschiedener Routen bei einer Fahrzeugflotte hilfreich. 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.
Syntax
arcpy.na.MakeVehicleRoutingProblemAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {time_units}, {distance_units}, {default_date}, {time_zone_for_time_fields}, {line_shape}, {time_window_factor}, {excess_transit_factor}, {generate_directions_on_solve}, {spatial_clustering})
Parameter | Erklärung | Datentyp |
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 VRP-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 |
time_units (optional) | Gibt die Zeiteinheiten an, die von den Zeitdatenfeldern in den Sublayern und Tabellen des Analyse-Layers verwendet werden (Netzwerkanalyseklassen). Dieser Wert muss nicht mit den Einheiten des Zeitkostenattributs übereinstimmen. Weitere Informationen zu Kostenattributen
| String |
distance_units (optional) | Gibt die Entfernungseinheiten an, die von den Entfernungsfeldern in den Sublayern und Tabellen des Analyse-Layers verwendet werden (Netzwerkanalyseklassen). Dieser Wert muss nicht mit den Einheiten des optionalen Entfernungskostenattributs übereinstimmen. Weitere Informationen zu Kostenattributen
| String |
default_date (optional) | Das implizite Datum für Zeitfeldwerte, für die kein Datum für die Uhrzeit angegeben wurde. Wenn ein Zeitfeld für ein Auftragsobjekt, z. B. TimeWindowStart, einen reinen Uhrzeitwert enthält, wird als Datum das Standarddatum verwendet. Das Standarddatum wirkt sich nicht auf Zeitfeldwerte aus, für die bereits ein Datum festgelegt ist. | Date |
time_zone_for_time_fields (optional) | Gibt die Zeitzone an, die für die Datums-/Zeit-Eingabefelder verwendet wird, die vom Werkzeug unterstützt werden.
Es ist hilfreich, die Werte für Datum/Uhrzeit in UTC anzugeben, wenn Sie die Zeitzone nicht kennen, in der sich die Aufträge oder Depots befinden, oder wenn Sie über Aufträge und Depots in mehreren Zeitzonen verfügen und alle Werte für Datum/Uhrzeit gleichzeitig gestartet werden sollen. Die UTC-Option kann nur angewendet werden, wenn Ihr Netzwerk-Dataset ein Zeitzonenattribut definiert. Anderenfalls werden alle Werte für Datum/Zeit immer entsprechend der Zeitzone für die Position behandelt. | String |
line_shape (optional) | Gibt den Shape-Typ für die Routen-Features an, die von der Analyse ausgegeben werden.
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 |
time_window_factor (optional) | Gibt an, wie wichtig die Einhaltung von Zeitfenstern ist, ohne Beschränkungsverletzungen zu verursachen. Eine Zeitfensterverletzung tritt auf, wenn eine Route nach dem Schließen eines Zeitfensters einen Auftrag, ein Depot oder eine Unterbrechung erreicht. Als Verletzung ist das Intervall zwischen dem Ende des Zeitfensters und der Ankunftszeit einer Route definiert.
| String |
excess_transit_factor (optional) | Gibt an, wie wichtig die Reduzierung von Fahrzeitüberschreitungen ist. Die Fahrzeitüberschreitung entspricht der Zeit, um die die direkte Fahrzeit zwischen den Auftragspaaren überschritten wird. Die Fahrzeitüberschreitung ergibt sich aus Unterbrechungen oder Fahrten zu anderen Aufträgen oder Depots, die zwischen den Auftragspaaren stattgefunden haben. Dieser Parameter ist nur relevant, wenn Sie Auftragspaare verwenden. Weitere Informationen zu Auftragspaaren
| String |
generate_directions_on_solve (optional) | Gibt an, ob Wegbeschreibungen erstellt werden.
| Boolean |
spatial_clustering (optional) | Gibt an, ob räumliches Clustering verwendet wird.
| Boolean |
Abgeleitete Ausgabe
Name | Erklärung | Datentyp |
out_network_analysis_layer | Der neue Netzwerkanalyse-Layer. | Network Analyst-Layer |
Codebeispiel
Ausführen des Werkzeugs, wenn nur die erforderlichen Parameter verwendet werden.
import arcpy
arcpy.env.workspace = "C:/Data/SanFrancisco.gdb"
arcpy.na.MakeVehicleRoutingProblemLayer("Transportation/Streets_ND")
Führen Sie das Werkzeug unter Verwendung aller Parameter aus.
import arcpy
arcpy.env.workspace = "C:/Data/SanFrancisco.gdb"
arcpy.na.MakeVehicleRoutingProblemAnalysisLayer('Streets_ND', 'FridayRoutes',
'Driving Time', 'Minutes',
'Miles', '1/2/2020',
'LOCAL_TIME_AT_LOCATIONS',
'TRUE_LINES_WITHOUT_MEASURES',
'High', 'Medium', 'DIRECTIONS')
Mit dem folgenden eigenständigen Python-Skript wird veranschaulicht, wie das Werkzeug MakeVehicleRoutingProblemAnalysisLayer verwendet werden kann, um eine Reihe von Aufträgen mit einer Fahrzeugflotte durchzuführen.
# Name: MakeVRPAnalysisLayer_Ex3_Workflow.py
# Description: Find the best routes for a fleet of vehicles, which is operated
# by a distribution company, to deliver goods from a main
# distribution center to a set of grocery stores.
# Requirements: Network Analyst Extension
# Import system modules
import arcpy
import os
try:
# Check out the 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 = r"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 local variables
input_gdb = "C:/Data/SanFrancisco.gdb"
network = os.path.join(input_gdb, "Transportation", "Streets_ND")
layer_name = "StoreDeliveryRoute"
travel_mode = "Driving Time"
time_units = "Minutes"
distance_units = "Miles"
in_orders = os.path.join(input_gdb, "Analysis", "Stores")
in_depots = os.path.join(input_gdb, "Analysis", "DistributionCenter")
in_routes = os.path.join(input_gdb, "Analysis", "Routes")
output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")
# Create a new Vehicle Routing Problem (VRP) layer. Since the time-based
# attributes such as ServiceTime on orders and CostPerUnitTime on routes is
# recorded in minutes, we use minutes for time_units parameter. As we are
# using cost per unit distance in routes, we have to specify a distance
# attribute. The values for CosterPerUnitDistance are in miles, so we
# specify miles for distance units parameter
result_object = arcpy.na.MakeVehicleRoutingProblemAnalysisLayer(
network, layer_name, travel_mode, time_units, distance_units,
line_shape="STRAIGHT_LINES")
# Get the layer object form the result object. The route layer can now be
# referenced using the layer object.
layer_object = result_object.getOutput(0)
# Get the names of all the sublayers within the VRP layer.
sub_layer_names = arcpy.na.GetNAClassNames(layer_object)
# Store the layer names that we will use later
orders_layer_name = sub_layer_names["Orders"]
depots_layer_name = sub_layer_names["Depots"]
routes_layer_name = sub_layer_names["Routes"]
# Load the store locations as orders. Using field mappings we map the
# TimeWindowStart1, TimeWindowEnd1, and DeliveryQuantities properties
# for Orders from the fields of store features and assign a value of
# 0 to MaxViolationTime1 property. The Name and ServiceTime properties
# have the correct mapped field names when using the candidate fields
# from store locations feature class.
candidate_fields = arcpy.ListFields(in_orders)
order_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, orders_layer_name, False, candidate_fields)
order_field_mappings["TimeWindowStart"].mappedFieldName = "TimeStart1"
order_field_mappings["TimeWindowEnd"].mappedFieldName = "TimeEnd1"
order_field_mappings["DeliveryQuantity_1"].mappedFieldName = "Demand"
order_field_mappings["MaxViolationTime"].defaultValue = 0
arcpy.na.AddLocations(layer_object, orders_layer_name, in_orders, order_field_mappings, "")
# Load the depots from the distribution center features. Using field mappings
# we map the Name properties for Depots from the fields of distribution
# center features and assign a value of 8 AM for TimeWindowStart1 and a
# value of 5 PM for TimeWindowEnd1 properties
depot_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, depots_layer_name)
depot_field_mappings["Name"].mappedFieldName = "Name"
depot_field_mappings["TimeWindowStart"].defaultValue = "8 AM"
depot_field_mappings["TimeWindowEnd"].defaultValue = "5 PM"
arcpy.na.AddLocations(layer_object, depots_layer_name, in_depots, depot_field_mappings, "")
# Load the routes from a table containing information about routes. In this
# case, since the fields on the routes table and property names for Routes
# are the same, we will just use the default field mappings
routes_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, routes_layer_name)
routes_field_mappings["Name"].mappedFieldName = "Name"
routes_field_mappings["StartDepotName"].mappedFieldName = "StartDepotName"
routes_field_mappings["EndDepotName"].mappedFieldName = "EndDepotName"
routes_field_mappings["StartDepotServiceTime"].mappedFieldName = "StartDepotServiceTime"
routes_field_mappings["Capacity_1"].mappedFieldName = "Capacities"
routes_field_mappings["CostPerUnitTime"].mappedFieldName = "CostPerUnitTime"
routes_field_mappings["CostPerUnitDistance"].mappedFieldName = "CostPerUnitDistance"
routes_field_mappings["MaxOrderCount"].mappedFieldName = "MaxOrderCount"
routes_field_mappings["MaxTotalTime"].mappedFieldName = "MaxTotalTime"
routes_field_mappings["MaxTotalTravelTime"].mappedFieldName = "MaxTotalTravelTime"
routes_field_mappings["MaxTotalDistance"].mappedFieldName = "MaxTotalDistance"
arcpy.na.AddLocations(layer_object, routes_layer_name, in_routes, routes_field_mappings, "")
# Solve the VRP layer
arcpy.na.Solve(layer_object)
# Save the solved VRP layer as a layer file on disk with relative paths
arcpy.management.SaveToLayerFile(layer_object, output_layer_file, "RELATIVE")
print("Script Completed Successfully")
except Exception as e:
# If an error occurred, print line number and error message
import traceback
import sys
tb = sys.exc_info()[2]
print("An error occurred on line %i" % tb.tb_lineno)
print(str(e))
Umgebungen
Lizenzinformationen
- Basic: Ja
- Standard: Ja
- Advanced: Ja