Let's start with the result:
One of the major questions of a location is: What/Whome can I reach in minutes? Therefore ArcGIS offers the Network Analyst with its tool "Service Areas". We can analyse the area reachable by car (other modes are possible) in a given time period. By using several input points we can also analyze patterns in a whole area.
Using a normal network would not alter the service areas during the day but by using the ArcGIS Online network dataset based on HERE data we can also use the traffi patterns for a day of the week and a given time. Traffi patterns can be analyswed in a 15min period. Analyzing the service areas during a day provides a valuable insight into the traffic situation of a region: big differences indicate first of all higher traffic volume on streets. The total area also indicates the quality of the network: large areas indicate a better accessibility using the car (maybe caused by a dense network of high-speed streets).
Automated Analysis
As I love geoprocessing, I was interested in the automation of the analysis and the visualisation as an animation. The process is therfore a two-stepped one.
First I created a simple point feature class called "StartPoints" which holds the locations of the "facilities" and added them to the Service Area Analysis Layer:
<SPAN class="comment token">#create Analysis 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">#add locations from a point feature class</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><SPAN class="punctuation token">,</SPAN> "Name Description <SPAN class="comment token">#;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>
Now we need to alter the times automatically to refelct the times of day. The start time is '05.01.1900 00:00:00' which is a Friday and the time is midnight.
We can access the properties quite easily. As I am working with a 3D scene this is my only map object in my ArcGIS Pro project:
<SPAN class="comment token">#get the project</SPAN>
doc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>mp<SPAN class="punctuation token">.</SPAN>ArcGISProject<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'current'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#get the map</SPAN>
map <SPAN class="operator token">=</SPAN> doc<SPAN class="punctuation token">.</SPAN>listMaps<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token">#get the service area layer</SPAN>
sa_layer <SPAN class="operator token">=</SPAN> map<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"BeatCity Service Layer"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token">#Get the solver properties object from the service area layer</SPAN>
solver_props <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>na<SPAN class="punctuation token">.</SPAN>GetSolverProperties<SPAN class="punctuation token">(</SPAN>sa_layer<SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
As we now have access to the properties we can easily iterate and solve the service layer. The result will be exported as a 3D feature class:
<SPAN class="keyword token">import</SPAN> os
<SPAN class="keyword token">for</SPAN> hour <SPAN class="keyword token">in</SPAN> range<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">24</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#create the datetime object</SPAN>
date <SPAN class="operator token">=</SPAN> datetime<SPAN class="punctuation token">.</SPAN>datetime<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1900</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">01</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">05</SPAN> <SPAN class="punctuation token">,</SPAN> hour<SPAN class="punctuation token">,</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#we will use the string-version later on </SPAN>
datestring <SPAN class="operator token">=</SPAN> date<SPAN class="punctuation token">.</SPAN>strftime<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"%d.%m.%Y %H:%M"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#set the time of the day and the date:</SPAN>
solver_props<SPAN class="punctuation token">.</SPAN>timeOfDay<SPAN class="operator token">=</SPAN>date
<SPAN class="comment token">#solve the network layer</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>na<SPAN class="punctuation token">.</SPAN>Solve<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"BeatCity Service Layer"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"SKIP"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"TERMINATE"</SPAN><SPAN class="punctuation token">,</SPAN> None<SPAN class="punctuation token">,</SPAN> None<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"copying hour"</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>hour<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#as we would like to visualize this in 3D</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>ddd<SPAN class="punctuation token">.</SPAN>FeatureTo3DByAttribute<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">"BeatCity Service Layer\Polygons"</SPAN><SPAN class="punctuation token">,</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">+</SPAN> os<SPAN class="punctuation token">.</SPAN>sep <SPAN class="operator token">+</SPAN> <SPAN class="string token">"Friday_"</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>hour<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"ToBreak"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"ToBreak"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#and add a field with the date for later usage if wanted:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddField_management<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">+</SPAN> os<SPAN class="punctuation token">.</SPAN>sep <SPAN class="operator token">+</SPAN> <SPAN class="string token">"Friday_"</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>hour<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"datetime"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"Date"</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">""</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">""</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">8</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"datetime"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"NULLABLE"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"REQUIRED"</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>management<SPAN class="punctuation token">.</SPAN>CalculateField<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">+</SPAN> os<SPAN class="punctuation token">.</SPAN>sep <SPAN class="operator token">+</SPAN> <SPAN class="string token">"Friday_"</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>hour<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"datetime"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'"'</SPAN> <SPAN class="operator token">+</SPAN> datestring <SPAN class="operator token">+</SPAN> <SPAN class="string token">'"'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"PYTHON_9.3"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Warning: Solving the layer consumes credits!
The results are stored in seperate feature classes which is not optimal yet this is my solution at the very moment. For
Visualization and Export
As we have seperate layers now I am applying the same style to all of them and triggering the visibility of each layer and exporting the layout which needs to be created prior the export!
My Layout looks something like this:

I added a text symbol with a default Text "Friday" in the layout to export the timestamp in the png result as well. Furthermore I added a marker symbol with the cities name to the layout and tilted the view a bit to increase the depth effect for the extruded layer. But first we need to disable all layers for our automated export with a quite unsophisticated approach:
<SPAN class="comment token">#deselcting all layers:</SPAN>
<SPAN class="keyword token">for</SPAN> layer <SPAN class="keyword token">in</SPAN> map_obj<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> layer <SPAN class="punctuation token">.</SPAN>name<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="string token">"F"</SPAN><SPAN class="punctuation token">:</SPAN>
layer <SPAN class="punctuation token">.</SPAN>visible <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">False</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Now we can iterate through the layers, apply the unique value renderer, alter the symbols to get polygons without borders, set the extrusion, alter the text element to get the right timestamp and export the layout as png:
<SPAN class="keyword token">for</SPAN> hour <SPAN class="keyword token">in</SPAN> range<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">24</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
poly_layer <SPAN class="operator token">=</SPAN> map_obj<SPAN class="punctuation token">.</SPAN>listLayers<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Friday_"</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>hour<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
poly_layer<SPAN class="punctuation token">.</SPAN>visible <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">True</SPAN>
symbology <SPAN class="operator token">=</SPAN> poly_layer<SPAN class="punctuation token">.</SPAN>symbology
symbology<SPAN class="punctuation token">.</SPAN>updateRenderer<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'UniqueValueRenderer'</SPAN><SPAN class="punctuation token">)</SPAN>
symbology<SPAN class="punctuation token">.</SPAN>renderer<SPAN class="punctuation token">.</SPAN>fields <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'ToBreak'</SPAN><SPAN class="punctuation token">]</SPAN>
symbology<SPAN class="punctuation token">.</SPAN>renderer<SPAN class="punctuation token">.</SPAN>colorRamp <SPAN class="operator token">=</SPAN> doc<SPAN class="punctuation token">.</SPAN>listColorRamps<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Green-Blue (6 Classes)'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token">#alter all symbols:</SPAN>
<SPAN class="keyword token">for</SPAN> sym <SPAN class="keyword token">in</SPAN> symbology<SPAN class="punctuation token">.</SPAN>renderer<SPAN class="punctuation token">.</SPAN>groups<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>items<SPAN class="punctuation token">:</SPAN>
sym<SPAN class="punctuation token">.</SPAN>symbol<SPAN class="punctuation token">.</SPAN>outlineColor <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'RGB'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="number token">255</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">255</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">255</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">}</SPAN>
sym<SPAN class="punctuation token">.</SPAN>symbol<SPAN class="punctuation token">.</SPAN>size <SPAN class="operator token">=</SPAN> <SPAN class="number token">0.0</SPAN>
poly_layer<SPAN class="punctuation token">.</SPAN>symbology <SPAN class="operator token">=</SPAN> symbology
<SPAN class="comment token">#extrude:</SPAN>
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>
<SPAN class="comment token">#export:</SPAN>
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>
<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>
<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>
<SPAN class="keyword token">if</SPAN> elm<SPAN class="punctuation token">.</SPAN>text<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="string token">"2"</SPAN><SPAN class="punctuation token">:</SPAN>
elm<SPAN class="punctuation token">.</SPAN>text <SPAN class="operator token">=</SPAN> datestring
lyt<SPAN class="punctuation token">.</SPAN>exportToPNG<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">+</SPAN> os<SPAN class="punctuation token">.</SPAN>sep <SPAN class="operator token">+</SPAN> <SPAN class="string token">"friday_seattle_final"</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">".png"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">300</SPAN><SPAN class="punctuation token">)</SPAN>
poly_layer<SPAN class="punctuation token">.</SPAN>visible <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">False</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>Unfortunately the whole rendering and exporting process takes about 2.5minutes per scene on my Lenovo X270 with no dedicated GPU.
The result is a bunch of pngs that can be converted intzo a gif using several gif-creation sites on the web or the open source image editor GIMP.
The result looks like this:
You can also append all polygon features from the result, add the datetime attribute, fill the used time, time-enable the feature class, and use the animation options in ArcGIS Pro to export the whole animation as a GIF:
The result looks quite similar to the file-wise export. Yet you don't have all the possibilities of the layout view. But still the result is quite good (added 5, 10, 15, 20 mil buffers):
