Workflow: Creating annotation with an advanced callout and multiple text elements
The advanced callout functionality allows you to modify the background symbol, shape, margins, splits, and leader line of the callout. The multiple text element functionality allows you to have multiple and individual text elements, including a vertical Morse code element, whose placement and style can be edited. Several steps are involved in creating advanced callout annotation with multiple text elements: setting up cartographic feature classes, creating annotation feature classes, setting up calculated field specifications, and creating and editing advanced annotation.
Setting up cartographic feature classes
The cartographic feature class is where the initial text string is calculated to create annotation. This is typically done in a field such as "Label_Txt". The text string produced by the XML script contains all the formatting and identification tags and is lengthy, meaning the field must be set to a high value to avoid any database conflicts.
Since the annotation is generated based on the text string field, it requires that the length of the field containing the label be long enough to accommodate the labels generated by the XML scripts.
- Start ArcCatalog.
- Navigate to the geodatabase that contains the cartographic feature class you want to use for generating annotation.
-
Right-click the cartographic feature class and click Properties.
The Feature Class Properties dialog box appears.
- In the Field Name column, select Label_Txt or a similar field.
- Verify that the Length property under Field Properties is set to a value greater than 2,000.
- If the value is less than 2,000, add a field by clicking in the blank row in the Field Name column and type a name.
- Click in the Data Type column next to the new field's name and choose Text.
- To create an alias for this field, click the field next to Alias and type the alias for this field.
- To allow null values to be stored in this field, click the field next to Allow NULL values, click the drop-down arrow, then choose Yes.
- Set the Length property to 2000.
- Click Finish.
If the cartographic feature class is already created, you can set the field length when creating or editing a calculated field rule or in SQL Server Management Studio if you are using a SQL-based database.
Creating an annotation feature class
An annotation feature class that uses the advanced callout/multiple text element functionality is not much different than any other annotation feature class within the database. However, annotation feature classes that have the advanced callout/multiple text element functionality need to be created with a few additional parameters that need to be set to ensure that the annotation is created correctly.
For additional information, see Creating Aeronautical annotation feature classes.
In addition to creating feature-linked annotation, annotation feature classes with advanced callouts require defining properties for the background, shadow, arrowhead, margin, callout, and placement options.
- Klicken Sie im Kataloginhaltsverzeichnis mit der rechten Maustaste auf das Feature-Dataset, in dem Sie die neue Annotation-Feature-Class erstellen möchten.
- Zeigen Sie auf Neu > Feature-Class.
- Geben Sie unter Name den Namen ein.
- Klicken Sie auf den Dropdown-Pfeil Typ und anschließend auf Annotation-Features.
- Aktivieren Sie das Kontrollkästchen, um die Annotation mit einer Feature-Class zu verknüpfen.
-
Klicken Sie auf den Dropdown-Pfeil und anschließend auf die Feature-Class, mit der Sie die neue Annotation-Feature-Class verknüpfen möchten. Die Feature-Class muss sich in demselben Feature-Dataset befinden wie die Annotation-Feature-Class, die Sie gerade erstellen. Eine spätere Änderung dieser Eigenschaft ist nicht möglich.
- Klicken Sie auf Weiter.
- Navigieren Sie im Koordinatensystemfenster zu einem Koordinatensystem und klicken Sie darauf. Sie können auch auf Importieren oder Neu klicken, um ein Koordinatensystem anzugeben.
- Klicken Sie auf Weiter.
- The x/y domain is calculated based on the coordinate system you specified in step 8. You can type a different x/y domain if you want, but the default should be sufficient.
- Klicken Sie auf Weiter.
- Geben Sie einen Bezugsmaßstab ein.
- Click the Map Units drop-down arrow and choose the units in which you want your annotation stored. The units should match the units you specified for your coordinate system in step 8.
-
Under Editing Behavior, uncheck the Create annotation when new features are added and Update annotation when feature's shape is modified check boxes.
For a description of each of these three options, see annotation feature class editing properties.
-
Click the Label Engine drop-down arrow and choose ESRI Maplex Label Engine.
- Klicken Sie auf Weiter.
- Geben Sie die Felder der verbundenen Feature-Class an, die Text für die erste Annotation-Klasse enthalten. Sie können ein "Beschriftungsfeld" auswählen oder auf Ausdruck klicken, um mehr als ein Feld anzugeben.
- Click Leader in the Text Symbol area.
-
In the Properties area of the Editor dialog box that appears, click the Type drop-down box and choose Advanced Callout.
-
Click OK.
Tipp:
You do not need to set up any annotation properties at this point, because all of them are overridden by the XML script.
Hinweis:If you add any additional annotation classes, ensure that you set the Type drop-down option to Advanced Callout.
- Klicken Sie auf Weiter.
-
If your geodatabase is a file or ArcSDE geodatabase licensed for ArcGIS Server Enterprise, the Configuration Keyword area appears. Set up a configuration keyword if necessary.
- Klicken Sie auf Weiter.
- Click the TextString field.
-
Click the text box to the right of the Length field property and set it to 2000 or higher.
- To add the first field to the feature class, click the first blank row in the Field Name column and type MapId_Txt.
- Click in the Data Type column next to the new field's name and choose Text.
- To create an alias for this field, click the text box next to Alias and type the alias.
- Change the Length field property to 255.
- To add the second field to the feature class, click the next blank row in the Field Name column and type IsVisible.
- Click in the Data Type column next to the new field's name and choose Short Integer.
- Type 1 for the Default Value.
- To associate a domain with this field, click the field next to Domain and choose Code_Yes_No.
- To add the third field to the feature class, click the next blank row in the Field Name column and type AnnoSizeChange.
- Click in the Data Type column next to the new field's name and choose Double.
-
Type 0 for the Default Value.
Tipp:
Click Import if you want to import field definitions from another feature class or table.
- Click Finish.
Wenn Sie auf "Importieren" klicken, können Sie ein Koordinatensystem aus einer vorhandenen Feature-Class oder einem Feature-Dataset importieren.
Wenn Sie auf "Neu" klicken, können Sie ein neues Koordinatensystem erstellen.
Nach dem Auswählen eines Koordinatensystems können Sie auf Ändern klicken, um es zu bearbeiten.
Setting up the calculated field specification
You must have previously set up visual specifications and specified the location of the visual specifications table in the database you are using. Visual specifications are used to calculate the individual values for each record in the database according to the XML script. The XML script must be configured for each individual annotation feature class to be able to create annotation.
Calculated fields allow you to determine the appearance of labels and annotation or basic data type values based on attributes you select. The fields are grouped based on the specification you choose.
- Start ArcMap.Tipp:
If the ArcMap - Getting Started dialog box appears, you can open a new or existing map document. You can also check the Do not show this dialog box in the future check box and click Open.
- On the main menu, click Customize > Production > Production Properties.
The Production Properties dialog box appears.
- If necessary, click Data Management.
- Click the cell next to Set Tool Options.
- Click the drop-down arrow that appears.
- Click the ellipsis (...) next to Visual Specifications.
- Make sure that you check the Display Calculated Representation and Calculated Fields tabs check box.
- Click OK twice to close the dialog boxes.
-
Right-click the cartographic feature class for which you want to define the calculated fields and click Properties.
The Layer Properties dialog box appears.
- Click the Calculated Fields tab.
- Click the Specification drop-down arrow and choose the specification for which you want to create the field rule.
-
Add a new calculated field rule by right-clicking anywhere in the white space where the rules are displayed and clicking New Rule.
A new row appears in the rule table.
Tipp:You can also click Options, then New Rule.
- Double-click the Rule Description space for the new rule and type a description.
-
Click the ellipsis (...) in the Field Name cell.
The Field Properties dialog box appears.
-
Choose the appropriate field from the Name drop-down list and ensure that its length is at least 2000.
Hinweis:
If the length is less than 2,000, you can add a field with length greater than 2000 in ArcCatalog.
- Click OK.
- Click the SQL Statement drop-down arrow and choose Edit SQL Statement.
-
Type the SQL statement for the features you want to include with the rule.
For additional information about defining a SQL statement, see Defining SQL statements for visual specifications.
- Click OK.
-
Click the Expression drop-down arrow and choose Edit Expression.
The Expression Parser dialog box appears.
-
Type, or copy and paste, the custom XML script into the Expression text box.
Tipp:
You can import an XML in VB Script File if you have one already by clicking Load.
- If necessary, configure the XML script you want to use to refine the feature selection for the rule.
- Verify your script by clicking Verify.
- Click OK.
-
Check the Update Feature Class(es) check box to calculate the field in the cartographic feature class.
Hinweis:
You can also calculate the field through the Calculate Visual Specification tool to be able to create annotation.
- Click Apply.
- Click OK.
Creating advanced annotation
To generate annotation using the Create Feature-Linked Annotation tool, you must have the annotation feature class, as well as the linked source feature class, loaded into the Table Of Contents window. The data frame also needs to be associated with an instance from the product library for which annotation has to be created.
- Ensure that the correct product library and production database are set in the Data Management pane on the Production Properties dialog box.
- Make sure that the Instances Maintained property is set correctly under Set Tool Options on the Data Management pane of the Production Properties dialog box.
- Verify that each annotation feature layer you are creating annotation for has its own matching source feature layer in the document.
- On the main menu, click Customize > Extensions and make sure that the Maplex check box is checked.
-
On the main menu, click View > Data Frame Properties.
- Click the General tab.
- Verify that the data frame's reference scale matches that of the given chart.
- Verify that the data frame's rotation matches that of the given chart.
- Verify that the Label Engine is set to ESRI Maplex Label Engine.
- Click the Coordinate System tab.
- Verify that the data frame's projection matches that of the given chart.
- Click OK.
- On the main menu, click Customize > Toolbars > Labeling.
- On the Labeling toolbar, click Labeling > Options.
- Click the Maplex tab.
- Make sure the Enable connection of line segments into continuous features check box is unchecked.
- Click OK.
-
Click the Placement Quality drop-down arrow on the Labeling toolbar and choose an option.
Best is the recommended setting. If Best is selected, Maplex considers more trial positions for the label.
- On the main menu, click Customize > Toolbars > Aeronautical Data Management.
- Click the Feature Display Settings button on the Aeronautical Data Management toolbar.
- On the main menu, click Customize > Toolbars > Aeronautical Annotation.
-
Click the Create Feature-Linked Annotation button on the Aeronautical Annotation toolbar.
The Create Feature-Linked Annotation dialog box appears.
-
Check the check boxes next to the instances you want to process.
The list displayed is built from the Instances Maintained set on theProduction Properties dialog box.
-
Check the check boxes next to the annotation classes in the Annotation Class(es) to Process list.
Tipp:
You can use the Select All, Clear All, and individual check boxes to choose the annotation classes.
-
Click OK.
For each feature class that is linked to the annotation feature classes, the tool determines which features do not have annotation in the selected chart. It then creates annotation for those features. It also gives the annotation a MAPID, ensures word spacing is set to 100, changes the color of the background symbol, and resizes arrowheads and accent bar gaps so they are correct for the map scale.
The Create Feature-Linked Annotation Results dialog box appears and shows the results of the annotation that has been generated, updated, or deleted.
-
Click Close once you are finished viewing the results.
The Create Feature-Linked Annotation dialog box appears.
- Click Close.
Editing advanced annotation
Editing advanced annotation has all the customization ability that the XML provides but allows you to customize individual pieces of annotation and override the settings in the XML.
Advanced callout annotation can be edited and customized in an edit session by editing parameters on the Editor dialog box. You can set a variety of parameters and placement options for the appearance of an advanced callout annotation.
- On the main menu, click Customize > Toolbars > Aeronautical Editing.
- Click the Production Start Editing button on the Aeronautical Editing toolbar.
Hinweis:
The Manage Features and Create Attributes, Update Attributes, or Metadata Attributes windows automatically appear when you start an edit session using the Production Start Editing tool.
Tipp:If the Create Attributes, Update Attributes, or Metadata Attributes window does not appear when you start an edit session, click the Link Feature Manager To Attributes Window button on the Manage Features window.
- Click the Edit Annotation button on the Aeronautical Annotation toolbar.
- Click an advanced annotation feature to select it.
-
Right-click the annotation piece and click Properties.
Tipp:
You can also click the Attributes button on the Editor toolbar.
- Click the Leader button.
-
Check the Use Custom check box.
Hinweis:
The Use Custom check box is very important. The attributes you set in the shortcut menu will not be applied to that piece of annotation unless this check box is checked.
-
Modify the Background, Shadow, Callout, Arrowhead, and Margins parameters in the Editor dialog box to customize the annotation as necessary.
Tipp:
You can view a list of the advanced callout/multiple text element annotation parameters.
-
Click the Placement Options button.
The Text Placement Properties dialog box appears.
- Check the Use Custom check box.
-
Modify the placement properties of the Top, Middle, Bottom, Left, and Right text elements as necessary.
Hinweis:
Only options that are available are active.
-
Click OK.
The Editor dialog box appears.
-
Click OK on the Editor dialog box.
The Attributes dialog box appears.
- Click Apply on the Attributes dialog box.
- Click OK to close the Attributes dialog box.
If using a versioned environment, make sure you are in the correct database.
Creating a label expression (LXP)
A label expression is used to adjust the formatting of your annotation. This uses ArcGIS formatting tags to control how the annotation displays the font, size, color, orientation, or line weight. If you intend to use annotation abbreviation options, see the example LXP below.
The label expression below can be used to abbreviate advanced/callout annotation.
Function FindLabel ( [IAPNAVAID_LBL], [LABELSTATUS_CODE] ) ValueArray = Split([IAPNAVAID_LBL], "||") LABELSTATUS_CODE_arr =Split( [LABELSTATUS_CODE] ,"<>") OBJECTID= ValueArray(0) OBJECTID_arr= Split(OBJECTID ,"<>") PRIMARYNAVAID_CODE=ValueArray(2) if IsNull(PRIMARYNAVAID_CODE) or PRIMARYNAVAID_CODE ="" Then PRIMARYNAVAID_CODE_arr= Split(" " ,"<>") else PRIMARYNAVAID_CODE_arr= Split(PRIMARYNAVAID_CODE ,"<>") end if SystemSubtype= ValueArray(3) SystemSubtype_arr= Split(SystemSubtype,"<>") Ident_Txt= ValueArray(4) Ident_Txt_arr=Split(Ident_Txt ,"<>") Frequency_Val= ValueArray(5) Frequency_Val_arr= Split( Frequency_Val,"<>") Channel_Txt= ValueArray(6) Channel_Txt_arr= Split( Channel_Txt,"<>") Voice_Code= ValueArray(7) Voice_Code_arr= Split(Voice_Code,"<>") ComponentSubtype= ValueArray(8) ComponentSubtype_arr=Split( ComponentSubtype,"<>") Name_Txt= ValueArray(9) Name_Txt_arr= Split(Name_Txt ,"<>") LAT_TXT= ValueArray(10) LAT_TXT_arr= Split(LAT_TXT ,"<>") LONG_TXT= ValueArray(11) LONG_TXT_arr= Split(LONG_TXT ,"<>") ROLEFIX_CODE= ValueArray(12) ROLEFIX_CODE_arr= Split(ROLEFIX_CODE ,"<>") FindLabel = "<MultipleTextElement>" & TextBackground (PRIMARYNAVAID_CODE_arr) & TextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr, LAT_TXT_arr, LONG_TXT_arr, ROLEFIX_CODE_arr, LABELSTATUS_CODE_arr) & "</MultipleTextElement>" End Function Function TextBackground (PRIMARYNAVAID_CODE_arr) TextBackground ="<TextBackground Units = 'Points'>" & Background (PRIMARYNAVAID_CODE_arr) & Callout & Shadow & Margins & Placement & "</TextBackground>" End Function Function Background (PRIMARYNAVAID_CODE_arr) If PRIMARYNAVAID_CODE_arr(0) = "1" Then Width = "0.7" Else Width ="0.2" End If Background = "<BackgroundRoundness='0'><Symbol><Outline Width='" & Width & "'><CLR Red='0' Green='0' Blue ='0'></CLR></Outline></Symbol></Background>" End Function Function Callout Callout = "<Callout Tolerance='10.0'Snap='True' Truncated='100'><Symbol><Outline Width='0.2'><CLR Red='0' Green='0' Blue ='0'></CLR></Outline><Fill><CLR Red='0' Green='0' Blue ='0'></CLR></Fill><Arrowhead Size='0'><CLR Red='0' Green='0' Blue ='87'></CLR></Arrowhead></Symbol></Callout>" End Function Function Shadow Shadow = "<Shadow HorizontalOffset ='0' VerticalOffset ='0'><Symbol><Outline Width='0.2'><CLR Red='0' Green='0' Blue ='0'></CLR></Outline><Fill><CLR Red='0' Green='0' Blue ='0'></CLR></Fill></Symbol></Shadow>" End Function Function Margins Margins = "<Margins Top='2.0' Bottom='2.0' Left='2.0' Right='2.0'></Margins>" End Function FunctionPlacement Placement = "<ElementPlacement><Top Style='Box' SplitOffset='0' HAlign='Center' VAlign='Center'></Top><Middle Style='Outside' SplitOffset='0' HAlign='Center' VAlign='Baseline'></Middle><Left Style='TopCorner' SplitOffset='2.0' HAlign='Center' VAlign='Baseline'></Left><Right Style='Center' SplitOffset='0' HAlign='Center' VAlign='Baseline'></Right><Bottom Style='Box' SplitOffset='0' HAlign='Center' VAlign='Baseline'></Bottom></ElementPlacement>" End Function Function TextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr, LAT_TXT_arr, LONG_TXT_arr, ROLEFIX_CODE_arr, LABELSTATUS_CODE_arr) TextElement = TopTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr, ROLEFIX_CODE_arr, LABELSTATUS_CODE_arr) _ & MiddleTextElement (OBJECTID_arr,SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr, LAT_TXT_arr, LONG_TXT_arr, LABELSTATUS_CODE_arr)_ & BottomTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr) _ & RightTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr) _ & LeftTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr) End Function Function TopTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr, ROLEFIX_CODE_arr, LABELSTATUS_CODE_arr) SFONT = "<fnt name='Tw Cen MT' size='7'>" EFONT = "</fnt>" strRole = ROLEFIX_CODE_arr(0) If LABELSTATUS_CODE_arr(0) = "Abbreviate IAF" Then TopTextElement = "" Else TopTextElement = "<TopTextElement>" & SFONT & strRole & vbnewline & EFONT & "</TopTextElement>" End If End Function Function MiddleTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr, LAT_TXT_arr, LONG_TXT_arr, LABELSTATUS_CODE_arr) SFONT = "<fnt name='Tw Cen MT' size='7'>" EFONT = "</fnt>" strFreqUnd = 0 select case SystemSubtype_arr(0) case 1 'Marker case 2 'LocatorMarker = Marker + NDB case 3 'NDB strName = Name_Txt_arr(0) strIdent = Ident_Txt_arr(0) strFreq = Frequency_Val_arr(0) if Voice_Code_arr(0) = 0 then strFreqUnd = 1 end if case 4 'NDBDME = NDB + DME i = 0 do while i <ubound(ComponentSubtype_arr) + 1 if ComponentSubtype_arr(i) = 2 then strIdent = Ident_Txt_arr(i) strName = Name_Txt_arr(i) strChan= "Chan " & Channel_Txt_arr(i) end if if ComponentSubtype_arr(i) = 1 then strFreq = Frequency_Val_arr(i) end if if Voice_Code_arr(i) = 0 then strFreqUnd = 1 end if i = i + 1 loop case 5 'DME strName = Name_Txt_arr(0) strIdent = Ident_Txt_arr(0) strFreq = "" strChan = "Chan " & Channel_Txt_arr(0) case 6 'VORDME = VOR + DME i = 0 do while i < ubound(ComponentSubtype_arr) + 1 if ComponentSubtype_arr(i) = 2 then strIdent = Ident_txt_arr(i) strName = Name_Txt_arr(i) strChan = "Chan " & Channel_txt_arr(i) end if if ComponentSubtype_arr(i) = 3 then strFreq = Frequency_Val_arr(i) end if if Voice_Code_arr(i) = 0 then strFreqUnd = 1 end if i = i + 1 loop case 7 'VOR strIdent = Ident_Txt_arr(0) strName = Name_Txt_arr(0) strFreq = Frequency_Val_arr(0) strChan = "" case 8 'VORTAC = VOR + TACAN do while i < ubound(ComponentSubtype_arr) + 1 if ComponentSubtype_arr(i) = 3 then strIdent = Ident_Txt_arr(i) strName = Name_Txt_arr(i) strFreq = Frequency_Val_arr(i) end if if Voice_Code_arr(i) = 0 then strFreqUnd = 1 end if if ComponentSubtype_arr(i) = 4 then strChan = "Chan " & Channel_Txt_arr(i) end if i = i + 1 loop case 9 'TACAN strIdent = Ident_Txt_arr(0) strName = Name_Txt_arr(0) strFreq = "" strChan = "Chan " & Channel_Txt_arr(0) case 10 'MLSElevation case 11 'MLS do while i < ubound(ComponentSubtype_arr) + 1 if ComponentSubtype_arr(i) = 2 then strIdent = Ident_Txt_arr(i) strName = Name_Txt_arr(i) strChan = "Chan " & Channel_Txt_arr(i) end if if ComponentSubtype_arr(i) = 6 then strFreq = Frequency_Val_arr(i) end if if Voice_Code_arr(i) = 0 then strFreqUnd = 1 end if i = i + 1 loop case 12 'MLSAzimuth case 13 'LocalizerApproachSystem strIdent = Ident_Txt_arr(0) strName = "LOCALIZER" do while i < ubound(ComponentSubtype_arr) + 1 if ComponentSubtype_arr(i) = 7 then strFreq = Frequency_Val_arr(i) end if if Voice_Code_arr(i) = 0 then strFreqUnd = 1 end if if ComponentSubtype_arr(i) = 2 then strChan = "Chan " & Channel_Txt_arr(i) end if i = i + 1 loop case 14 'ILS strName = "LOCALIZER" do while i < ubound(ComponentSubtype_arr) + 1 if ComponentSubtype_arr(i) = 7 then strIdent = Ident_Txt_arr(i) strFreq = Frequency_Val_arr(i) end if if Voice_Code_arr(i) = 0 then strFreqUnd = 1 end if if ComponentSubtype_arr(i) = 2 then strChan = "Chan " & Channel_Txt_arr(i) end if i = i + 1 loop 'case 15 'GlidePath end select if strFreqUnd = 1 then strFreq = "<und>" & strFreq & "</und>" end if 'logic to determine whether to keep the name??? if strName = "" then outStr = strIdent & VerticalMorseCode & strIdent & "</fnt></VMC>" outStr = outStr & vbcrlf & strFreq elseif strChan = "" or LABELSTATUS_CODE_arr(0) = "Abbreviate Channel" then outStr = strName outStr = outStr & vbcrlf & strFreq & " " & strIdent outStr = outStr & VerticalMorseCode & strIdent & "</fnt></VMC>" else outStr = strName outStr = outStr & vbcrlf & strFreq & " " & strIdent outStr = outStr & VerticalMorseCode & strIdent & "</fnt></VMC>" outStr = outStr & vbcrlf & strChan end if 'determine hemisphere if LAT_TXT_arr(0) < 0 then latHemi = "S" else latHemi = "N" end if if LONG_TXT_arr(0) < 0 then longHemi = "W" else longHemi = "E" end if 'make decimal degree values positive decLat = abs(LAT_TXT_arr(0)) decLong = abs(LONG_TXT_arr(0)) 'get degree information from decimal degree value dmsLatDeg = int(decLat) dmsLongDeg = int(decLong) 'get decimal value decLatMin = decLat - dmsLatDeg decLongMin = decLong - dmsLongDeg 'turn decimal value into minutes dmsLatMin = round(decLatMin * 60, 2) dmsLongMin = round(decLongMin * 60, 2) if dmsLatDeg < 10 AND NOT dmsLatMin < 10 then strLat = latHemi & "0" & dmsLatDeg & chr(176) & dmsLatMin & "'" else if NOT dmsLatDeg < 10 AND dmsLatMin < 10 then strLat = latHemi & dmsLatDeg & chr(176) & "0" & dmsLatMin & "'" else if dmsLatDeg < 10 AND dmsLatMin < 10 then strLat = latHemi & "0" & dmsLatDeg & chr(176) & "0" & dmsLatMin & "'" else strLat = latHemi & dmsLatDeg & chr(176) & dmsLatMin & "'" end if if dmsLongDeg < 10 AND NOT dmslongMin < 10 then strLong = longHemi & "0" & dmsLongDeg & chr(176) & dmsLongMin & "'" elseif NOT dmsLongDeg < 10 AND dmsLongMin < 10 then strLong = longHemi & dmsLongDeg & chr(176) & "0" & dmsLongMin & "'" elseif dmsLongDeg < 10 AND dmsLongMin < 10 then strLong = longHemi & "0" & dmsLongDeg & chr(176) & "0" & dmsLongMin & "'" else strLong = longHemi & dmsLongDeg & chr(176) & dmsLongMin & "'" end if strDesig = strLat & vbnewline & strLong If LABELSTATUS_CODE_arr(0) = "Abbreviate Channel" Then MiddleTextElement = "<MiddleTextElement>" & SFONT & outStr & vbnewline & strDesig & vbnewline & EFONT & "</MiddleTextElement>" 'MiddleTextElement = "<MiddleTextElement>" & SFONT & strName & vbcrlf & strFreq & " " & strIdent & VerticalMorseCode & strIdent & vbnewline & strDesig & 'vbnewline & EFONT & "</MiddleTextElement>" Elseif LABELSTATUS_CODE_arr(0) = "Abbreviate Coordinates" Then MiddleTextElement = "<MiddleTextElement>" & SFONT & outStr & EFONT & "</MiddleTextElement>" Else MiddleTextElement = "<MiddleTextElement>" & SFONT & outStr & vbnewline & strDesig & vbnewline & EFONT & "</MiddleTextElement>" End If 'MiddleTextElement = "<MultipleTextElement>" & TextBackground & MiddleText & "</MultipleTextElement>" End Function Function BottomTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr) BottomTextElement = "" End Function Function LeftTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr) LeftTextElement = "" End Function Function RightTextElement (OBJECTID_arr, SystemSubtype_arr, Ident_Txt_arr, Frequency_Val_arr, Channel_Txt_arr, Voice_Code_arr, ComponentSubtype_arr, Name_Txt_arr) RightTextElement = "" End Function Function VerticalMorseCode VerticalMorseCode = "<VMC><fnt name='PLTS Aeronautical VMC' size ='6'>" End Function
This workflow guided you through creating advanced callout annotation with multiple text elements by setting up cartographic feature classes, creating annotation feature classes, setting up calculated field specifications, and creating and editing advanced annotation. You should now have advanced annotation in your chart.