-
Notifications
You must be signed in to change notification settings - Fork 0
v10 Visualization Library
This visualization library serves to capture layer configurations related to visibility range, transparency, effects, aggregation, pop-ups, field display names, and labeling. It is not exhaustive, but instead serves to capture the finer differences in visual language between layers. This is NOT a symbology hosting library with files (yet). If a particular visualization feature is missing, such as aggregation, it is assumed to be off / disabled and not relevant to the respective layer.
This resource begins with SARCOP v10 and is a living document. Configurations captured here exist at the v10 Master IFS level, and allows for mid-incident / incident-specific changes to a view layer to be reverted back to the Master IFS post-incident.
POC for this library is Orlando Viera, NAPSG, [email protected].
Pages nested in this Visualizations Library Wiki refer to this layer as the "Master" or as "v10". This layer, along with all other v10 assets, lives in the SARGeo ArcGIS Online Organization
In v10, the Waypoints - Clusters View is deprecated in favor of using aggregation directly in the Waypoints layer. See the Waypoints section for aggregation configuration.
Symbology not captured here (yet).
Titles for ALL pop-ups will contain the layer name and relevant field in the singular, i.e., Incident Area: {event_name}, Logistics Point: {feature_category}, etc.
Every pop-up has a text box titled Summary with the 4-7 most critical items listed as field call-backs. (!) NOTE: to match the title string field for the Fields Lists that follow, "Summary" is font size 21px and set by editing the source code.
- Open the Text content box
- Highlight "Summary" and set a font size; pick any
- Open the source code and change the font size you selected to 21px
- Click "Source" again to return to the text box
All pop-ups generally follow the same rich text styling. Refer to each layer's text box screenshot and source code for proper configuration.
For Waypoints, here's the source code for pop-ups from v9 (field names may differ):
<p>
<span style="font-size:21px;">Summary</span><br>
<br>
<span><strong>{start_time}</strong></span><strong> </strong><span>at <strong>{MGRS} </strong></span><br>
<br>
By <span><strong>{team_user}</strong> from <strong>Squad</strong> <strong>{squad_id} ({team_name})</strong></span><br>
<br>
Comments: <span><strong>{general_comments} </strong></span><br>
<br>
Follow-Up Status: <span><strong>{followup_status}</strong></span>
</p>
The Waypoints layer pop-up contains 4 different Fields lists and are categorized; reference each respective Field list's title.
(!) NOTE: some field display names have been modified for a better user experience. As of 03/04/2025, reference the pop-up screenshots here and the field display name configuration in SARCOP v9 Sandbox Internal Map and the v10 Master for the latest reference.
Examples include changing OBJECTID to ObjectID, DeleteThis to Send to Recycle Bin?, CreationDate to Time Uploaded to SARCOP, and many others.
Disabled
Logistics Points are symbolize by Feature Category. The existing Logistics Points vectors are small, and you may need to bump the px up to 24px to achieve proper visualization.
Symbology not listed here (yet).
Transparency for Tracklogs is set to 25%. The purpose of this is to not block basemap street labels and other centerline data, as Tracklogs by nature follow paths of ingress / egress and established roads can get congested with Tracklog line data. In highly congested incidents, such as the Lahaina Fire, it may be necessary to increase transparency so as not to occlude areas with congested point data.
<p>
<span style="font-size:21px;">Summary</span><br>
<br>
<span><strong>{mission_type}</strong></span> by <span><strong>{team_user}</strong></span> from <strong>Squad </strong><span><strong>{team_squad}</strong></span><strong> (</strong><span><strong>{team_name}</strong></span><strong>)</strong><br>
<br>
Started on <span><strong>{start_time}</strong></span><br>
Ended on <span><strong>{end_time}</strong></span><br>
<br>
Distance covered: <span><strong>{expression/expression0}</strong></span><strong> </strong><br>
<br>
Comments: <span><strong>{team_comments}</strong></span><strong> </strong>
</p>
An expression is used in the Summary text box to convert the shape length field into miles:
Var distance = Length($feature, 'miles')
return round(distance,2) + " miles"
Select the second line style option:
(!) Pop-Ups are disabled in the Internal Map to avoid UX confusion in the Tactical and Strategic Dashboards.
<p>
<span style="font-size:21px;">Summary</span><br>
<br>
Incident type: <span><strong>{event_type}</strong></span> started on <span><strong>{start_date}</strong></span><br>
<br>
Status: <span><strong>{Status}</strong></span><br>
<br>
Comments: <span><strong>{comments}</strong></span>
</p>
(!) Pop-Ups are disabled in the Internal Map to avoid UX confusion in the Tactical and Strategic Dashboards.
<p>
<span style="font-size:21px;">Summary</span><br>
<br>
Branch: <span><strong>{branch}</strong></span><strong> </strong><br>
<br>
Status: <span><strong>{Status} </strong></span><br>
<br>
<span>Incident: <strong>{event_name} </strong></span>
</p>
Divisions are symbolized by the status attribute.
Fill
Outline
The Division layer makes use of a transparency-by-attribute Arcade script. The purpose of the script is to adjust fill transparency for Complete Divisions at 80000:1, 40000:1, and fully transparent at 20000:1, which is also the same scale that Search Segments become visible.
var scale = $view.scale;
var transparency = When(
scale >= 80000, 70, // 70% transparency at or more zoomed out than 1:80,000
scale >= 40000, 85, // 85% transparency between 1:40,000 and 1:80,000
100 // 100% transparency (fully invisible) at more zoomed in than 1:40,000
);
return transparency;
It is critical to adjust the sliders to the following values:
The transparency-by-attribute script and sliders are subject to change after v10 launch.
(!) Pop-Ups are disabled in the Internal Map to avoid UX confusion in the Tactical and Strategic Dashboards.
<p>
<span style="font-size:21px;">Summary</span><br>
<br>
Division: <span><strong>{division}</strong></span><strong> </strong><br>
<br>
Status: <span><strong>{Status}</strong></span><strong> </strong><br>
<br>
Resources Assigned: <span><strong>{resources_assigned}</strong></span><strong> </strong><br>
<br>
Branch / Incident: <span><strong>{branch}</strong></span><strong> / </strong><span><strong>{event_name}</strong></span><strong> </strong>
</p>
Not captured here (yet).
Search Segments use several Arcade scripts to intersect a variety of information
Estimated Buildings
var itemID = 'bb69f10baf334d4c935a0fb23d758f38'
var prtl = Portal("https://www.arcgis.com")
var buildings = FeatureSetByPortalItem(prtl,itemID, 0)
var countBuildings = Count(Intersects(buildings,$feature))
return countBuildings
Total Waypoints in Segment
// Write a script that returns a value that will be used to draw features.
// get the count for all buildings in an assignment area
var ItemID = '5f67f852d0f043799d7509efdaa16ad2'
var prtl = Portal("https://www.arcgis.com")
var waypoints = FeatureSetByPortalItem(prtl,itemID, 1)
var countWaypoints = Count(Intersects(waypoints,$feature))
return countWaypoints
Area (Acres)
var SegArea = AreaGeodetic($feature, 'acres')
var roundedSegArea = Round(SegArea,2)
return roundedSegArea
Building Density per Acre
// Write a script to return a value to show in the pop-up.
// For example, get the average of 4 fields:
// Average($feature.SalesQ1, $feature.SalesQ2, $feature.SalesQ3, $feature.SalesQ4)
var itemID = '8e5577dfa01142d0a9aa455bb7ed9bf8'
var prtl = Portal("https://www.arcgis.com")
var buildings = FeatureSetByPortalItem(prtl,itemID, 0)
var CountBuildings = Count(Intersects(buildings,$feature))
var SegmentArea = AreaGeodetic($feature, 'acres')
var BuildingDensity = Round(CountBuildings/SegmentArea)
return BuildingDensity
Estimated Population
// get the layer with population values (Census blocks)
var portal = Portal('https://arcgis.com')
var blocks = FeatureSetByPortalItem(
portal,
'b3642e91b49548f5af772394b0537681',
0,
['P0010001']
)
// intersect feature with census blocks
var xs = Intersects(
$feature,
blocks
)
// create array of intersected blocks
var c_array = []
for (var c in xs){
Push(c_array, c['P0010001'])
}
// remove duplicates
var unique_blocks = Distinct(c_array)
// concatenate array, return string
return Concatenate(sum(unique_blocks))
<p>
<span style="font-size:21px;">Summary</span><br>
<br>
Status: <span><strong>{completion_status}</strong></span><br>
<br>
Mission Type: <span><strong>{mission_type}</strong></span><br>
<br>
Team: <span><strong>{team_name}</strong></span><br>
<br>
Comments: <span><strong>{team_comments}</strong></span><br>
<br>
Work Area Description: <span><strong>{work_area}</strong></span><strong> </strong>
</p>
A refresh interval keeps your maps in sync with the latest data while the map is open. It is important to note that a map zoom or pan, usually sends a request to the feature layer and may update the map. But if refresh is turned off - the only way to see new data is to refresh the browser. So even a low frequency refresh (10 minutes) is better than no refresh. See this documentation for more details https://doc.arcgis.com/en/arcgis-online/create-maps/set-refresh-interval-mv.htm
Since the purpose of the Dashboards is to have "real-time" information, we should set layers to the most frequent setting we can, without sacrificing data store performance.
For now, let's default to the following.
- Waypoints = 1 minute
- Tracklogs = 1 minute
- All others = 5 minutes
Since the purpose of the Field Maps is to have "real-time" information, we should set layers to the most frequent setting we can, without sacrificing data store performance.
For now, let's default to the following.
- Waypoints = 1 minute
- Tracklogs = 1 minute
- All others = 5 minutes
For most other web maps, there will be plenty of panning and zooming so we can default to 5 minute refresh for all layers.