Analyse-Layer für nächstgelegene Einrichtung erstellen (Network Analyst)

Zusammenfassung

Erstellt einen Netzwerkanalyse-Layer für die nächstgelegene Einrichtung und legt seine Analyse-Eigenschaften fest. Ein Netzwerkanalyse-Layer für die nächstgelegenen Einrichtung ist hilfreich, um die nächste Einrichtung oder die Einrichtungen zu einem Ereignis auf der Grundlage des angegebenen Reisemodus zu bestimmen. 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 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 AllSource 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.

Parameter

BeschriftungErläuterungDatentyp
Netzwerkdatenquelle

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
Reisemodus
(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
Reiserichtung
(optional)

Gibt die Fahrtrichtung zwischen Einrichtungen und Ereignissen an.

Die Fahrtrichtung kann sich darauf auswirken, welche Einrichtungen gefunden werden, wenn das Netzwerk Einbahnstraßen oder von der Fahrtrichtung abhängige Impedanzen enthält. So kann es zum Beispiel 10 Minuten dauern, um von einem bestimmten Ereignis zu einer bestimmten Einrichtung zu fahren, während die Fahrt in die Gegenrichtung (von der Einrichtung zum Ereignis) aufgrund von Einbahnstraßen oder anderen Verkehrsbedingungen 15 Minuten dauert.

  • Hin zu EinrichtungenDie Fahrtrichtung erfolgt von den Ereignissen zu den Einrichtungen. Einzelhandelsgeschäfte verwenden im Allgemeinen diese Einstellung, da es hier darauf ankommt, wie lange die Käufer (Ereignisse) brauchen, um den Laden zu erreichen. Dies ist die Standardeinstellung.
  • Weg von EinrichtungenDie Fahrtrichtung erfolgt von den Einrichtungen zu den Ereignissen. Feuerwehren verwenden im Allgemeinen diese Einstellung, da es hier darauf ankommt, wie lange es dauert, von der Feuerwache (Einrichtung) zum Einsatzort (Ereignis) zu fahren.
String
Grenzwert
(optional)

Der Impedanzwert, bei dem die Suche nach Einrichtungen für ein angegebenes Ereignis in den Einheiten des Impedanzattributs beendet werden soll, das vom Wert Reisemodus verwendet wird. Dieser Grenzwert kann pro Ereignis überschrieben werden, indem einzelne Grenzwerte im Bedarfspunkt-Sublayer angegeben werden, wenn für den Parameter Reiserichtung die Einstellung Hin zu Einrichtungen festgelegt ist, oder er kann pro Einrichtung überschrieben werden, indem einzelne Grenzwerte im Einrichtungs-Sublayer angegeben werden, wenn für den Parameter Reiserichtung die Einstellung Weg von Einrichtungen angegeben ist. Für die Analyse wird standardmäßig kein Grenzwert verwendet.

Double
Anzahl der zu suchenden Einrichtungen
(optional)

Die Anzahl der nächstgelegenen Einrichtungen, die pro Ereignis gesucht werden sollen. Der Standardwert kann überschrieben werden, indem ein einzelner Wert für die Eigenschaft TargetFacilityCount im Bedarfspunkt-Sublayer angegeben wird. Die standardmäßige Anzahl an Einrichtungen, die gesucht werden sollen, lautet Eins.

Long
Zeitpunkt
(optional)

Die Uhrzeit und das Datum für den Beginn oder das Ende der Route. Die Interpretation dieses Wertes hängt davon ab, ob Verwendung des Zeitpunktes auf Startzeit oder Endzeit festgelegt ist.

Wenn Sie ein verkehrsbasiertes Impedanzattribut ausgewählt haben, wird die Lösung auf Grundlage des dynamischen Verkehrsaufkommens zu der hier angegebenen Uhrzeit generiert. Sie können ein Datum und eine Uhrzeit als 5/14/2012 10:30 AM angeben.

Konfigurieren Sie Ihre Analyse so, dass anstelle eines bestimmten, statischen Datums eines der folgenden speziellen Daten verwendet wird, um einen Wochentag oder das aktuelle Datum zu modellieren:

  • Heute: 30.12.1899
  • Sonntag: 31.12.1899
  • Montag: 1.1.1900
  • Dienstag: 2.1.1900
  • Mittwoch: 3.1.1900
  • Donnerstag: 4.1.1900
  • Freitag: 5.1.1900
  • Samstag: 06.01.1900

Weitere Informationen zur Verwendung und Interpretation von Daten und Zeiten in einer Netzwerkanalyse

Date
Zeitzone
(optional)

Die Zeitzone des Parameters Zeitpunkt.

  • Lokale Zeit an PositionenDer Parameter Zeitpunkt bezieht sich auf die Zeitzone, in der sich die Einrichtungen oder Ereignisse befinden. Dies ist die Standardeinstellung.
    • Wenn für Verwendung der Uhrzeit die Option Startzeit festgelegt wurde und für Reiserichtung die Option Weg von Einrichtungen, ist dies die Zeitzone der Einrichtungen.
    • Wenn für Verwendung der Uhrzeit die Option Startzeit festgelegt wurde und für Reiserichtung die Option Hin zu Einrichtungen, ist dies die Zeitzone der Ereignisse.
    • Wenn für Verwendung der Uhrzeit die Option Endzeit festgelegt wurde und für Reiserichtung die Option Weg von Einrichtungen, ist dies die Zeitzone der Ereignisse.
    • Wenn für Verwendung der Uhrzeit die Option Endzeit festgelegt wurde und für Reiserichtung die Option Hin zu Einrichtungen, ist dies die Zeitzone der Einrichtungen.
  • UTCDer Parameter Zeitpunkt bezieht sich auf die koordinierte Weltzeit (UTC). Wählen Sie diese Option aus, wenn Sie nach den nächstgelegenen Einrichtungen oder Ereignissen für eine bestimmte Zeit (z. B. jetzt) suchen möchten, sich jedoch nicht sicher sind, in welcher Zeitzone sich die Einrichtungen oder Ereignisse befinden.
String
Verwendung des Zeitpunkts
(optional)

Gibt an, ob der Wert des Parameters Zeitpunkt die Ankunfts- oder Abfahrtzeit für die Route oder die Routen darstellt.

  • StartzeitDer Wert des Parameters Zeitpunkt wird als Abfahrtzeit von der Einrichtung oder dem Ereignis interpretiert. Dies ist die Standardeinstellung.Wenn diese Einstellung ausgewählt wird, gibt Zeitpunkt an, dass der Solver die beste Route für eine bestimmte Abfahrtzeit bestimmen soll.
  • EndzeitDer Wert des Parameters Zeitpunkt wird als Ankunftszeit an der Einrichtung oder beim Ereignis interpretiert.Diese Option empfiehlt sich, wenn Sie für einen Ort die Abfahrtszeit wissen möchten, um zur im Parameter Zeitpunkt festgelegten Uhrzeit am Ziel einzutreffen.
String
Linien-Shape
(optional)

Gibt den Shape-Typ an, der für die Routen-Features verwendet wird, die von der Analyse ausgegeben werden.

Unabhängig vom angegebenen Ausgabe-Shape-Typ wird die optimale Route 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.

  • Entlang des NetzwerksDie Ausgabe-Routen haben die exakte Form der zugrunde liegenden Netzwerkquellen. Die Ausgabe umfasst Routenmesswerte für die lineare Referenzierung. Die Messwerte nehmen ab dem ersten Halt zu und zeichnen die kumulierte Impedanz auf, um eine bestimmte Position zu erreichen.
  • Keine LinienFür die Ausgaberouten wird kein Shape erstellt.
  • Gerade LinienDas Ausgabe-Routen-Shape ist eine einzelne gerade Linie zwischen den Stopps.
String
Akkumulationsattribute
(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, der auf einer Portal for ArcGIS-Version beruht, in der eine Akkumulation nicht unterstützt wird.

String
Wegbeschreibung beim Berechnen erstellen
(optional)

Gibt an, ob Wegbeschreibungen erstellt werden.

  • Aktiviert: Detaillierte Wegbeschreibungen werden beim Berechnen erstellt.
  • Deaktiviert: Detaillierte Wegbeschreibungen werden beim Berechnen nicht erstellt. Dies ist die Standardeinstellung.

Der Zeitaufwand für Analysen, bei denen das Erstellen detaillierter Wegbeschreibungen nicht erforderlich ist, kann reduziert werden, wenn diese Option deaktiviert bleibt.

Boolean
Ungültige Positionen beim Berechnen ignorieren
(optional)

Gibt an, ob ungültige Eingabepositionen ignoriert werden. In der Regel sind Standorte ungültig, wenn sie nicht im Netzwerk verortet werden können. Werden ungültige Standorte ignoriert, überspringt sie der Solver und führt die Analyse mit den verbleibenden Standorten durch.

  • Aktiviert: Ungültige Eingabepositionen werden ignoriert, sodass nur gültige Standorte verwendet werden. Dies ist die Standardeinstellung.
  • Deaktiviert: Alle Eingabepositionen werden verwendet. Bei ungültigen Eingabepositionen schlägt die Analyse fehl.
Boolean

Abgeleitete Ausgabe

BeschriftungErläuterungDatentyp
Network Analyst-Layer

Der neu erstellte Netzwerkanalyse-Layer.

Network Analyst Layer

arcpy.management.MakeClosestFacilityAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {travel_direction}, {cutoff}, {number_of_facilities_to_find}, {time_of_day}, {time_zone}, {time_of_day_usage}, {line_shape}, {accumulate_attributes}, {generate_directions_on_solve}, {ignore_invalid_locations})
NameErläuterungDatentyp
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
travel_direction
(optional)

Gibt die Fahrtrichtung zwischen Einrichtungen und Ereignissen an.

  • TO_FACILITIESDie Fahrtrichtung erfolgt von den Ereignissen zu den Einrichtungen. Einzelhandelsgeschäfte verwenden im Allgemeinen diese Einstellung, da es hier darauf ankommt, wie lange die Käufer (Ereignisse) brauchen, um den Laden zu erreichen. Dies ist die Standardeinstellung.
  • FROM_FACILITIESDie Fahrtrichtung erfolgt von den Einrichtungen zu den Ereignissen. Feuerwehren verwenden im Allgemeinen diese Einstellung, da es hier darauf ankommt, wie lange es dauert, von der Feuerwache (Einrichtung) zum Einsatzort (Ereignis) zu fahren.

Die Fahrtrichtung kann sich darauf auswirken, welche Einrichtungen gefunden werden, wenn das Netzwerk Einbahnstraßen oder von der Fahrtrichtung abhängige Impedanzen enthält. So kann es zum Beispiel 10 Minuten dauern, um von einem bestimmten Ereignis zu einer bestimmten Einrichtung zu fahren, während die Fahrt in die Gegenrichtung (von der Einrichtung zum Ereignis) aufgrund von Einbahnstraßen oder anderen Verkehrsbedingungen 15 Minuten dauert.

String
cutoff
(optional)

Der Impedanzwert, bei dem die Suche nach Einrichtungen für ein angegebenes Ereignis in den Einheiten des Impedanzattributs beendet werden soll, das vom ausgewählten travel_mode verwendet wird. Bei travel_direction = 'TO_FACILITIES' kann dieser Grenzwert pro Ereignis überschrieben werden, indem einzelne Grenzwerte im Bedarfspunkt-Sublayer angegeben werden. Bei travel_direction = 'FROM_FACILITIES' kann er pro Einrichtung überschrieben werden, indem einzelne Grenzwerte im Einrichtungs-Sublayer angegeben werden. Für die Analyse wird standardmäßig kein Grenzwert verwendet.

Double
number_of_facilities_to_find
(optional)

Die Anzahl der nächstgelegenen Einrichtungen, die pro Ereignis gesucht werden sollen. Der Standardwert kann überschrieben werden, indem ein einzelner Wert für die Eigenschaft TargetFacilityCount im Bedarfspunkt-Sublayer angegeben wird. Die standardmäßige Anzahl an Einrichtungen, die gesucht werden sollen, lautet Eins.

Long
time_of_day
(optional)

Die Uhrzeit und das Datum für den Beginn oder das Ende der Route. Die Interpretation dieses Wertes hängt davon ab, ob time_of_day_usage auf die Startzeit oder die Endzeit festgelegt ist.

Wenn Sie ein verkehrsbasiertes Impedanzattribut ausgewählt haben, wird die Lösung auf Grundlage des dynamischen Verkehrsaufkommens zu der hier angegebenen Uhrzeit generiert. Sie können ein Datum und eine Uhrzeit als 5/14/2012 10:30 AM angeben.

Konfigurieren Sie Ihre Analyse so, dass anstelle eines bestimmten, statischen Datums eines der folgenden speziellen Daten verwendet wird, um einen Wochentag oder das aktuelle Datum zu modellieren:

  • Heute: 30.12.1899
  • Sonntag: 31.12.1899
  • Montag: 1.1.1900
  • Dienstag: 2.1.1900
  • Mittwoch: 3.1.1900
  • Donnerstag: 4.1.1900
  • Freitag: 5.1.1900
  • Samstag: 06.01.1900

Weitere Informationen zur Verwendung und Interpretation von Daten und Zeiten in einer Netzwerkanalyse

Date
time_zone
(optional)

Gibt die Zeitzone des Parameters time_of_day an.

  • LOCAL_TIME_AT_LOCATIONSDer Parameter time_of_day bezieht sich auf die Zeitzone, in der sich die Einrichtungen oder Ereignisse befinden. Dies ist die Standardeinstellung.
    • Wenn für time_of_day_usage die Option START_TIME festgelegt wurde und für travel_direction die Option FROM_FACILITIES, ist dies die Zeitzone der Einrichtungen.
    • Wenn für time_of_day_usage die Option START_TIME festgelegt wurde und für travel_direction die Option TO_FACILITIES, ist dies die Zeitzone der Ereignisse.
    • Wenn für time_of_day_usage die Option END_TIME festgelegt wurde und für travel_direction die Option FROM_FACILITIES, ist dies die Zeitzone der Ereignisse.
    • Wenn für time_of_day_usage die Option END_TIME festgelegt wurde und für travel_direction die Option TO_FACILITIES, ist dies die Zeitzone der Einrichtungen.
  • UTCDer Parameter time_of_day bezieht sich auf die koordinierte Weltzeit (UTC). Wählen Sie diese Option aus, wenn Sie nach den nächstgelegenen Einrichtungen oder Ereignissen für eine bestimmte Zeit (z. B. jetzt) suchen möchten, sich jedoch nicht sicher sind, in welcher Zeitzone sich die Einrichtungen oder Ereignisse befinden.
String
time_of_day_usage
(optional)

Gibt an, ob der Wert des Parameters time_of_day die Ankunfts- oder Abfahrtzeit für die Route oder die Routen darstellt.

  • START_TIMEDer Wert des Parameters time_of_day wird als Abfahrtzeit von der Einrichtung oder dem Ereignis interpretiert. Dies ist die Standardeinstellung.Wenn diese Einstellung ausgewählt wird, gibt der Parameter time_of_day an, dass der Solver die beste Route für eine bestimmte Abfahrtzeit bestimmt.
  • END_TIMEDer Wert des Parameters time_of_day wird als Ankunftszeit an der Einrichtung oder beim Ereignis interpretiert.Diese Option empfiehlt sich, wenn Sie für einen Ort die Abfahrtszeit wissen möchten, um zur im Parameter time_of_day festgelegten Uhrzeit am Ziel einzutreffen.
String
line_shape
(optional)

Gibt den Shape-Typ an, der für die Routen-Features verwendet wird, die von der Analyse ausgegeben werden.

Unabhängig vom angegebenen Ausgabe-Shape-Typ wird die optimale Route 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.

  • ALONG_NETWORKDie Ausgabe-Routen haben die exakte Form der zugrunde liegenden Netzwerkquellen. Die Ausgabe umfasst Routenmesswerte für die lineare Referenzierung. Die Messwerte nehmen ab dem ersten Halt zu und zeichnen die kumulierte Impedanz auf, um eine bestimmte Position zu erreichen.
  • NO_LINESFür die Ausgaberouten wird kein Shape erstellt.
  • STRAIGHT_LINESDas Ausgabe-Routen-Shape ist eine einzelne gerade Linie zwischen den Stopps.
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, der auf einer Portal for ArcGIS-Version beruht, in der eine Akkumulation nicht unterstützt wird.

String
generate_directions_on_solve
(optional)

Gibt an, ob beim Ausführen der Analyse Wegbeschreibungen erstellt werden.

  • DIRECTIONSDetaillierte Wegbeschreibungen werden beim Berechnen erstellt.
  • NO_DIRECTIONSDetaillierte Wegbeschreibungen werden beim Berechnen nicht erstellt. Dies ist die Standardeinstellung.

Der Zeitaufwand für Analysen, bei denen das Erstellen detaillierter Wegbeschreibungen nicht erforderlich ist, kann reduziert werden, wenn Sie die Standardoption NO_DIRECTIONS verwenden.

Boolean
ignore_invalid_locations
(optional)

Gibt an, ob ungültige Eingabepositionen ignoriert werden. In der Regel sind Standorte ungültig, wenn sie nicht im Netzwerk verortet werden können. Werden ungültige Standorte ignoriert, überspringt sie der Solver und führt die Analyse mit den verbleibenden Standorten durch.

  • SKIPUngültige Eingabepositionen werden ignoriert, sodass nur gültige Standorte verwendet werden. Dies ist die Standardeinstellung.
  • HALTAlle Eingabepositionen werden verwendet. Bei ungültigen Eingabepositionen schlägt die Analyse fehl.
Boolean

Abgeleitete Ausgabe

NameErläuterungDatentyp
out_network_analysis_layer

Der neu erstellte Netzwerkanalyse-Layer.

Network Analyst Layer

Codebeispiel

MakeClosestFacilityAnalysisLayer – Beispiel 1 (Python-Fenster)

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

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeClosestFacilityAnalysisLayer(network, "ClosestFireStations")
MakeClosestFacilityAnalysisLayer – Beispiel 2 (Python-Fenster)

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

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeClosestFacilityAnalysisLayer(network, "ClosestHospitals",
                                "Driving Time", "TO_FACILITIES", 5, 3,
                                "1/1/1900 9:00 AM", "UTC", "START_TIME",
                                "ALONG_NETWORK", ["Meters", "TravelTime"])
MakeClosestFacilityAnalysisLayer – Beispiel 3 (eigenständiges Python-Skript)

Mit dem folgenden eigenständigen Python-Skript wird veranschaulicht, wie die Funktion MakeClosestFacilityAnalysisLayer verwendet werden kann, um von den Ladenstandorten aus das nächst gelegene Lager zu ermitteln.

# Name: MakeClosestFacilityAnalysisLayer_Workflow.py
# Description: Find the closest warehouse from the store locations and save the
#              results to a layer file on disk.
# 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 = "ClosestWarehouse"
    travel_mode = "Driving Time"
    facilities = os.path.join(input_gdb, "Analysis", "Warehouses")
    incidents = os.path.join(input_gdb, "Analysis", "Stores")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new closest facility analysis layer. 
    result_object = arcpy.na.MakeClosestFacilityAnalysisLayer(network,
                                    layer_name, travel_mode, "TO_FACILITIES",
                                    number_of_facilities_to_find=1)

    #Get the layer object from the result object. The closest facility layer can
    #now be referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the closest facility layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]
    incidents_layer_name = sublayer_names["Incidents"]

    #Load the warehouses as Facilities using the default field mappings and
    #search tolerance
    arcpy.na.AddLocations(layer_object, facilities_layer_name,
                            facilities, "", "")

    #Load the stores as Incidents. Map the Name property from the NOM field
    #using field mappings
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    incidents_layer_name)
    field_mappings["Name"].mappedFieldName = "NOM"
    arcpy.na.AddLocations(layer_object, incidents_layer_name, incidents,
                          field_mappings, "")

    #Solve the closest facility layer
    arcpy.na.Solve(layer_object)

    #Save the solved closest facility 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))