<\/HEAD>
Lassen Sie uns mit dem Ergebnis beginnen:<\/P>
Eine der wichtigsten Fragen an einen Standort ist: Wen oder was kann ich in Minuten erreichen? Daher bietet ArcGIS den Network Analyst mit seinem Werkzeug "Service Areas"<\/A>. Wir können das Gebiet analysieren, das mit dem Auto (andere Verkehrsmittel sind möglich) in einem bestimmten Zeitraum erreichbar ist. Durch die Verwendung mehrerer Eingabepunkte können wir auch Muster in einem gesamten Gebiet analysieren.<\/X><\/P>Die Verwendung eines normalen Netzwerks würde die Servicebereiche im Tagesverlauf nicht verändern, aber durch die Nutzung des ArcGIS Online-Netzwerkdatensatzes basierend auf HERE-Daten können wir auch die Verkehrsprofile für einen Wochentag und eine bestimmte Uhrzeit verwenden. Verkehrsprofile können in 15-Minuten-Intervallen analysiert werden. Die Analyse der Servicebereiche im Tagesverlauf liefert wertvolle Einblicke in die Verkehrssituation einer Region: Große Unterschiede deuten in erster Linie auf ein höheres Verkehrsaufkommen auf den Straßen hin. Die Gesamtfläche zeigt auch die Qualität des Netzwerks an: Große Flächen deuten auf eine bessere Erreichbarkeit mit dem Auto hin (möglicherweise verursacht durch ein dichtes Netz von Schnellstraßen).<\/P>
Automatisierte Analyse<\/H3>Da ich Geoverarbeitung liebe, interessierte mich die Automatisierung der Analyse und die Visualisierung als Animation. Der Prozess ist daher zweistufig.<\/P>Zuerst habe ich eine einfache Punkt-Feature-Class namens "StartPoints" erstellt, die die Standorte der "facilities" enthält, und diese zur Service Area Analysis Layer hinzugefügt:<\/P><SPAN class="comment token">#Erstelle Analyse-Layer<\/SPAN>
arcpy<SPAN class="punctuation token">.<\/SPAN>na<SPAN class="punctuation token">.<\/SPAN>MakeServiceAreaAnalysisLayer<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token"><SPAN>"<\/SPAN><A class="jive-link-external-small" href="https:\/\/community.esri.com\/external-link.jspa?url=https%3A%2F%2Fwww.arcgis.com%2F" target="_blank">https:\/\/www.arcgis.com\/<\/A><SPAN>"<\/SPAN><\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"BeatCity Service Layer"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"Driving Time"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"FROM_FACILITIES"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"5;10;15;20;25;30"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"05.01.1900 00:01:00"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"LOCAL_TIME_AT_LOCATIONS"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"POLYGONS"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"STANDARD"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"DISSOLVE"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"RINGS"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> <SPAN class="string token">"100 Meters"<\/SPAN><SPAN class="punctuation token">, <\/SPAN> None<SPAN class="punctuation token">, <\/SPAN> None<SPAN class="punctuation token">)<\/SPAN>
<SPAN class="comment token">#Füge Standorte aus einer Punkt-Feature-Class hinzu<\/Span>
arcpy<SPAN class="punctuation token">.<\/span>na<Span class=\"punctuation token\">.<\span>AddLocations<Span class=\"punctuation token\">(<\span><Span class=\"string token\">\"BeatCity Service Layer\"<\span><Span class=\"punctuation token\">,<\span> <Span class=\"string token\">\"Facilities\"<\span><Span class=\"punctuation token\">,<\span> <Span class=\"string token\">\"StartPoints\"<\span>, \"Name Description #;CurbApproach # 0;Attr_Minutes # 0;Attr_TravelTime # 0;Attr_Miles # 0;Attr_Kilometers # 0;Attr_TimeAt1KPH # 0;Attr_WalkTime # 0;Attr_TruckMinutes # 0;Attr_TruckTravelTime # 0;Breaks_Minutes # #;Breaks_TravelTime # #;Breaks_Miles # #;Breaks_Kilometers # #;Breaks_TimeAt1KPH # #;Breaks_WalkTime # #;Breaks_TruckMinutes # #;Breaks_TruckTravelTime # #\", \"5000 Meters\", None, None, \"MATCH_TO_CLOSEST\", \"APPEND\", \"SNAP\", \"5 Meters\", \"EXCLUDE\", None)<\/span><Span class=\"line-numbers-rows\"><Span><\\/Span><Span><\\/Span><Span><\\/Span><Span><\\/Span></Span>Jetzt müssen wir die Zeiten automatisch anpassen, um die Tageszeiten widerzuspiegeln. Die Startzeit ist '05.01.1900 00:00:00', was ein Freitag ist und die Zeit Mitternacht.<\/P>Wir können auf die Eigenschaften recht einfach zugreifen. Da ich mit einer 3D-Szene arbeite, ist dies mein einziges Kartenobjekt in meinem ArcGIS Pro-Projekt:<\/P><Span class=\"comment token\">#Projekt holen<\\/span>
doc = arcpy.mp.ArcGISProject('current')
<span class=\"comment token\">#Karte holen<\\/span>
map = doc.listMaps()[0]
<span class=\"comment token\">#Servicebereich-Layer holen<\\/span>
sa_layer = map.listLayers("BeatCity Service Layer")[0]
<span class=\"comment token\">#Solver-Eigenschaften vom Servicebereich-Layer holen<\\/span>
solver_props = arcpy.na.GetSolverProperties(sa_layer)Da wir nun Zugriff auf die Eigenschaften haben, können wir einfach iterieren und den Service-Layer lösen. Das Ergebnis wird als 3D-Feature-Class exportiert:<\/P>import os
for hour in range(0, 24):
<span class=\"comment token\">#Erstelle das datetime-Objekt<\\/span>
date = datetime.datetime(1900, 01, 05, hour, 0, 0)
<span class=\"comment token\">#Wir verwenden später die String-Version<\\/span>
datestring = date.strftime("%d.%m.%Y %H:%M")
<span class=\"comment token\">#Setze Tageszeit und Datum:<\\/span>
solver_props.timeOfDay = date
<span class=\"comment token\">#Löse den Netzwerk-Layer<\\/span>
arcpy.na.Solve("BeatCity Service Layer", "SKIP", "TERMINATE", None, None)
arcpy.AddMessage("kopiere Stunde " + str(hour))
<span class=\"comment token\">#Da wir dies in 3D visualisieren möchten<\\/span>
arcpy.ddd.FeatureTo3DByAttribute(r"BeatCity Service Layer\\Polygons") , arcpy.env.workspace + os.sep + "Friday_" + str(hour), "ToBreak", "ToBreak")
#und ein Feld mit dem Datum für spätere Verwendung hinzufügen, falls gewünscht:
arcpy.AddField_management(arcpy.env.workspace + os.sep + "Friday_" + str(hour), "datetime", "Date", "", "", 8, "datetime", "NULLABLE", "REQUIRED")
arcpy.management.CalculateField(arcpy.env.workspace + os.sep + "Friday_" + str(hour), "datetime", '"' + datestring + '"', "PYTHON_9.3")
Warnung: Lösung der Ebene verbraucht credits!
Die Ergebnisse werden in separaten Feature-Classes gespeichert, was noch nicht optimal ist, aber dies ist momentan meine Lösung.
Visualisierung und Export
Da wir jetzt separate Layer haben, wende ich denselben Stil auf alle an und steuere die Sichtbarkeit jedes Layers und exportiere das Layout, das vor dem Export erstellt werden muss!
Mein Layout sieht ungefähr so aus:
Ich habe ein Textsymbol mit dem Standardtext "Friday" im Layout hinzugefügt, um den Zeitstempel auch im PNG-Ergebnis zu exportieren. Außerdem habe ich ein Markersymbol mit dem Städtenamen zum Layout hinzugefügt und die Ansicht etwas geneigt, um den Tiefeneffekt für die extrudierte Ebene zu verstärken. Aber zuerst müssen wir alle Layer für unseren automatisierten Export mit einem ziemlich einfachen Ansatz deaktivieren:
#Alle Layer abwählen:
for layer in map_obj.listLayers():
if layer.name[0] == "F":
layer.visible = False
Jetzt können wir durch die Layer iterieren, den Unique Value Renderer anwenden, die Symbole ändern, um Polygone ohne Ränder zu erhalten, die Extrusion einstellen, das Textelement ändern, um den richtigen Zeitstempel zu erhalten und das Layout als PNG exportieren:
for hour in range(0, 24):
poly_layer = map_obj.listLayers("Friday_" + str(hour))[0]
poly_layer.visible = True
symbology = poly_layer.symbology
symbology.updateRenderer('UniqueValueRenderer')
symbology.renderer.fields = ['ToBreak']
symbology.renderer.colorRamp = doc.listColorRamps('Green-Blue (6 Classes)')[0]
#Alle Symbole ändern:
for sym in symbology.renderer.groups[0].items:
sym.symbol.outlineColor = {'RGB': [255, 255, 255, 0]}
sym.symbol.size <SPAN class="operator token">=<\/SPAN> <SPAN class="number token">0.0<\/SPAN>\n poly_layer<SPAN class="punctuation token">.<\/SPAN>symbology <SPAN class="operator token">=<\/SPAN> symbology\n <SPAN class="comment token">#extrude:<\/SPAN>\n poly_layer<SPAN class="punctuation token">.<\/SPAN>extrusion<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'BASE_HEIGHT'<\/SPAN><SPAN class="punctuation token">,<\/SPAN> <SPAN class="string token">"3000-100*[ToBreak]"<\/SPAN><SPAN class="punctuation token">)<\/SPAN>\n <SPAN class="comment token">#export:<\/SPAN>\n datestring <SPAN class="operator token">=<\/SPAN> <SPAN class="string token">"2017\/12\/08 "<\/SPAN> <SPAN class="operator token">+<\/SPAN> str<SPAN class="punctuation token">(<\/SPAN>hour<SPAN class="punctuation token">)<\/SPAN> <SPAN class="operator token">+<\/SPAN> <SPAN class="string token">":00"<\/SPAN>\n <SPAN class="keyword token">for<\/SPAN> lyt <SPAN class="keyword token">in<\/SPAN> doc<SPAN class="punctuation token">.<\/SPAN>listLayouts<SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">:<\/SPAN>\n <SPAN class="keyword token">for<\/SPAN> elm <SPAN class="keyword token">in<\/SPAN> lyt<SPAN class="punctuation token">.<\/SPAN>listElements<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">"TEXT_ELEMENT"<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">:<\/SPAN>\n <SPAN class="keyword token">if<\/SPAN> elm<SPAN class="punctuation token">.<\/Span>text<Span class="punctuation token">[<Span class="number token">0</Span><Span class="punctuation token">]<Span operator-token ">==</Span> <Span string-token ">"2"</Span><Span punctuation-token ":</Span>\n elm<Span punctuation-token ".</Span>text <Span operator-token ">=</Span> datestring\n lyt<Span punctuation-token ".</Span>exportToPNG<Span punctuation-token "("><Span keyword-token ">arcpy</Span><Span punctuation-token ".</Span>env<Span punctuation-token ".</Span>workspace <Span operator-token ">+</Span> os<Span punctuation-token ".</span>sep <span operator-token ">+</span> <span string-token ">friday_seattle_final"</span> <span operator-token ">+</span> str<span punctuation-token "("><span keyword-token ">hour</span><span punctuation-token ")"><span operator-token ">+</span> <span string-token ">.png"</span><span punctuation-token ")"><br>     poly_layer<span punctuation-token ".</span>visible <span operator-token ">=</span> <span boolean-token >False</span><<EMOJI_0>><span class="line-numbers-rows"><span><EMOJI_1><</span><span><EMOJI_2><</span><span><EMOJI_3><</span><span><EMOJI_4><</span><span><EMOJI_5><</span><span><EMOJI_6><</span><span><EMOJI_7><</span><span><EMOJI_8><</span><span><EMOJI_9><</span><span><EMOJI_10><</span><span><EMOJI_11><</span><span><EMOJI_12><</span><span><EMOJI_13><</span><span><EMOJI_14><</span><span><EMOJI_15><</span><span><EMOJI_16><</span><span><EMOJI_17><</span><span><EMOJI_18><</span><span><EMOJI_19><</span><span><EMOJI_20><</span><span><EMOJI_21><</span><span><EMOJI_22><</spa n></ span>Leider dauert der gesamte Rendering- und Exportvorgang auf meinem Lenovo X270 ohne dedizierte GPU etwa 2,5 Minuten pro Szene.<\/P>Das Ergebnis sind eine Reihe von PNGs, die mit verschiedenen GIF-Erstellungsseiten im Web oder dem Open-Source-Bildeditor <\/> <A href=\"https:\/\/www.gimp.org\/tutorials\/Simple_Animations\/\