Select to view content in your preferred language

Resources for ArcGIS Pro Labeling and Annotation Technical Workshops at UC 2025

278
0
06-12-2025 12:31 PM

Resources for ArcGIS Pro Labeling and Annotation Technical Workshops at UC 2025

We are offering two technical workshops at the 2025 User Conference about labeling and annotation in ArcGIS Pro. 
This technical workshop will be offered twice during the 2025 UC:
Tuesday, July 15th, 2025: 1:00 - 2:00pm, Ballroom 6 DE
Thursday, July 17th, 2025: 8:30 - 9:30am, room 8
 
This technical workshop will be offered twice during the 2025 UC:
Tuesday, July 15th, 2025: 4:00 - 5:00pm, room 31 B
Thursday, July 17th, 2025: 1:00 - 2:00pm, room 1 B
 
Below you will find some materials presented at these technical workshops.
 

Point Label Rotation demo

Format numbers with 1 decimal place

JesseWickizer_0-1752269724468.png

The labels used an Arcade expression to format numbers to display only 1 decimal place and add units.

Text($feature.PctChange2022_2023, "#.#") + "%"

 

Move a point symbol to the end of the arrowhead symbol

JesseWickizer_1-1752269847488.png

The labels are placed on top of an invisible point that has been offset the proper distance and direction to match the end of the arrows of different lengths. The X and Y offsets formulas for these point symbols are here:

Offset X

//Minimum and maximum point symbol sizes used in the proportional symbols
var minOffset = 10;
var maxOffset = 50;

//Minimum and maximum data values corresponding to the min and max proportional symbol sizes
var dataMin = 10000;
var dataMax = 22800000;
var total = $feature.Total_2023;
If (total > dataMax) {
  total = dataMax;
}
If (total < dataMin) {
  total = dataMin;
}

//Calculate the offset amount (in points) for this feature
var percentOfRange = (total - dataMin)/(dataMax - dataMin);
var desiredOffset = minOffset + (percentOfRange * (maxOffset - minOffset)) + 9;

//Calculate the geographic angle from the percent change value exaggerated 3.5x to match the guage chart arrow.
var exaggeratedChange = $feature.PctChange2022_2023 * 3.5;
If (exaggeratedChange < 0) {
  exaggeratedChange = 360 + exaggeratedChange;
}

//Trigonometry to calculate amount of x offset based on angle and distance
var angle = exaggeratedChange;
If (exaggeratedChange >= 270) {
  angle = angle - 270;
} Else If (exaggeratedChange >= 180) {
  angle = angle - 270;
} Else If (exaggeratedChange >= 90) {
  angle = angle - 90;
} Else {
  angle = 90 - angle;
}
var radians = angle * Pi/180;
var xOffset = Round(Cos(radians) * desiredOffset, 0);
if (exaggeratedChange >= 180) {
  xOffset = xOffset * -1;
}
return xOffset;

Offset Y

//Minimum and maximum point symbol sizes used in the proportional symbols
var minOffset = 10;
var maxOffset = 50;

//Minimum and maximum data values corresponding to the min and max proportional symbol sizes
var dataMin = 10000;
var dataMax = 22800000;
var total = $feature.Total_2023;
If (total > dataMax) {
  total = dataMax;
}
If (total < dataMin) {
  total = dataMin;
}

//Calculate the offset amount (in points) for this feature
var percentOfRange = (total - dataMin)/(dataMax - dataMin);
var desiredOffset = minOffset + (percentOfRange * (maxOffset - minOffset)) + 9;

//Calculate the geographic angle from the percent change value exaggerated 3.5x to match the guage chart arrow.
var exaggeratedChange = $feature.PctChange2022_2023 * 3.5;
If (exaggeratedChange < 0) {
  exaggeratedChange = 360 + exaggeratedChange;
}

//Trigonometry to calculate amount of y offset based on angle and distance
var angle = exaggeratedChange;
If (exaggeratedChange >= 270) {
  angle = angle - 270;
} Else If (exaggeratedChange >= 180) {
  angle = angle - 270;
} Else If (exaggeratedChange >= 90) {
  angle = angle - 90;
} Else {
  angle = 90 - angle;
}
var radians = angle * Pi/180;
var yOffset = Round(Sin(radians) * desiredOffset, 0);
if (exaggeratedChange >= 90 && exaggeratedChange < 180) {
  yOffset = yOffset * -1;
}
return yOffset;

 

 

Advanced Label Expressions Demo

Bright Angel Trail map

Map label with name and detailsMap label with name and details 

Attribute tableAttribute table

This Arcade expression removes the extraneous distance to trailhead info from the name attribute, and combines it with the details attribute field. Then it uses text formatting tags to style the details differently from the point of interest name.

var label = Trim(Mid($feature.Name, Find("/", $feature.Name) + 1));

if (!IsEmpty($feature.Details)) {
  label += TextFormatting.NewLine;
  label += "<FNT size='11'><ITA>";
  label += "<CLR red='80' green='80' blue='80'>";
  label += $feature.Details;
  label += "</CLR></ITA></FNT>";
}

return label;

Grand Canyon Amenities map

JesseWickizer_1-1752271060858.png

These labels use an Arcade expression to combine a list of amenities with each point of interest name. The delimited list of amenities stored with each feature is converted to a list of characters, then each character is styled with the correct symbol font to display the appropriate symbol. 

function getCharacterInfo(poiType) {
  var symbolDict = {
    "Airport": ["ESRI NPS 9.1","&amp;"],
    "Amphitheater": ["ESRI NPS 9.1",")"],
    "Bus Stop / Shuttle Stop": ["ESRI NPS 9.1","5"],
    "Campground": ["ESRI NPS 9.1",";"],
    "First Aid Station": ["ESRI NPS 9.1","J"],
    "Food Service": ["ESRI NPS 9.1","P"],
    "Information": ["ESRI NPS 9.1","e"],
    "Lodging": ["ESRI NPS 9.1","k"],
    "Museum": ["ESRI NPS 5.1","r"],
    "Parking Lot": ["ESRI NPS 9.1","w"],
    "Picnic Area": ["ESRI NPS 9.1","£"],
    "Potable Water": ["ESRI NPS 9.1","G"],
    "Ranger Station": ["ESRI NPS 9.1","¬"],
    "Restroom": ["ESRI NPS 9.1","ñ"],
    "Showers": ["ESRI NPS 9.1","Ç"],
    "Trailhead": ["ESRI NPS 9.1","Ü"],
    "Viewpoint": ["ESRI NPS 7.1","´"]
  }
  return symbolDict[poiType];
}

function getSymbol(poiType) {
  var font = "ESRI NPS 9.1";
  var size = 18;
  var charInfo = getCharacterInfo(poiType);
  var character = charInfo[1];
  font = charInfo[0];
  
  var thinSpace = " ";
  return "<FNT name='" + font + "'" +
  " size='" + size + "'>" + 
  character + "</FNT>" + thinSpace;
}

var symbols = "<LIN leading='-5' leading_type='extra'>";
var amenitiesArr = Split($feature.Amenities, "|");
for (var index in amenitiesArr) {
  symbols = symbols + getSymbol(amenitiesArr[index]);
}
symbols = symbols + "</LIN>";

if (IsEmpty(Trim($feature.Name))) {
  return symbols;
} else {
  return $feature.Name + TextFormatting.NewLine + symbols;
}

 

Version history
Last update:
‎07-11-2025 03:14 PM
Updated by:
Contributors