{"id":2642312,"date":"2025-01-14T12:44:28","date_gmt":"2025-01-14T20:44:28","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2642312"},"modified":"2025-09-25T10:26:16","modified_gmt":"2025-09-25T17:26:16","slug":"attribute-rules-generate-symbol-rotation","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation","title":{"rendered":"Template Attribute Rules &#8211; Generate Symbol Rotation"},"author":365172,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23851],"tags":[42181,302212,86442,25381,777832],"industry":[],"product":[36561],"class_list":["post-2642312","blog","type-blog","status-publish","format-standard","hentry","category-data-management","tag-arcgis-pro","tag-attribute-rules","tag-data-management","tag-geodatabase","tag-template-attribute-rules","product-arcgis-pro"],"acf":{"authors":[{"ID":365172,"user_firstname":"Mihail","user_lastname":"Kaburis","nickname":"Mihail Kaburis","user_nicename":"mkaburis","display_name":"Mihail Kaburis","user_email":"mkaburis@esri.com","user_url":"","user_registered":"2024-11-20 00:37:26","user_description":"","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/uc_2024_profile_stamford-468x465.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"The Generate Symbol Rotation template attribute rules ensure that your symbology is properly aligned with their respective features.","flexible_content":[{"acf_fc_layout":"content","content":"<p><span data-contrast=\"auto\">In ArcGIS Pro 3.4 we have introduced three new templates that allow you to generate attribute rules tailored for specific workflows. We curated a selection of commonly used attribute rules and created a familiar geoprocessing tool experience that guides you through their creation. Attribute rule templates not only speed up the generation of these rules but also makes them more accessible for users who may not have prior knowledge of Arcade scripting.<\/span><\/p>\n<p><span data-contrast=\"auto\">The Generate Symbol Rotation template attribute rule tool allows us to rotate a point feature symbol that intersects with line features. This blog describes a workflow for creating and utilizing a Generate Symbol Rotation template attribute rule\u00a0to steer some vehicles in the right direction in the suburbs of Boston, Massachusetts. Imagine placing down some fire hydrant point features on a map and seeing the following behavior:<\/span><\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2644062,"id":2644062,"title":"GenerateSymbolRotation_AR","filename":"GenerateSymbolRotation_AR.gif","filesize":2155898,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR.gif","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/generatesymbolrotation_ar","alt":"","author":"365172","description":"","caption":"","name":"generatesymbolrotation_ar","status":"inherit","uploaded_to":2642312,"date":"2025-01-04 01:39:35","modified":"2025-01-04 01:39:35","menu_order":0,"mime_type":"image\/gif","type":"image","subtype":"gif","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1918,"height":978,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR-213x200.gif","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR.gif","medium-width":464,"medium-height":237,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR.gif","medium_large-width":768,"medium_large-height":392,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR.gif","large-width":1918,"large-height":978,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR-1536x783.gif","1536x1536-width":1536,"1536x1536-height":783,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR.gif","2048x2048-width":1918,"2048x2048-height":978,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR-826x421.gif","card_image-width":826,"card_image-height":421,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AR.gif","wide_image-width":1918,"wide_image-height":978}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p><span data-contrast=\"auto\">In the GIS world, symbols help us tell a story about the data we\u2019re displaying on our maps. For example, colors can represent different road types (e.g., highways, county roads, local roads, etc.). Symbols can also represent various objects or points of interest such as vehicles and gas stations. A static symbol isn\u2019t always enough to convey the story we want to tell. The orientation of symbols can provide us with critical context about the direction that objects\u00a0in the real world are facing. In the case of vehicles, we not only want to know <\/span><i><span data-contrast=\"auto\">where <\/span><\/i><span data-contrast=\"auto\">the vehicles are, but also the <\/span><i><span data-contrast=\"auto\">direction <\/span><\/i><span data-contrast=\"auto\">that they\u2019re traveling in.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:0,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:278}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Manually calculating the directionality for each point feature that intersects a line is a time-consuming process and is prone to errors.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Thankfully, the Generate Symbol Rotation template attribute rule can automatically determine the directionality of point symbols for us based on how those points intersect with line features. After creating the template attribute rule, using it is as easy as configuring some symbology properties related to rotation, enabling snapping, and creating some point features on a map! <\/span><\/p>\n<p><span data-ccp-props=\"{}\">Here\u2019s a brief overview video of the Generate Symbol Rotation Attribute Rule tool:<\/span><\/p>\n"},{"acf_fc_layout":"kaltura","video_id":"1_nxr7wbvz","time":false,"start":0,"stop":""},{"acf_fc_layout":"content","content":"<h2><strong>Utilizing the Generate Symbol Rotation Tool<\/strong><\/h2>\n<h3>Review Generate Symbol Rotation Data<\/h3>\n<p><span class=\"TextRun SCXW245505625 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW245505625 BCX0\"><strong>Note:<\/strong> Attribute Rules <\/span><span class=\"NormalTextRun SCXW245505625 BCX0\">require<\/span><span class=\"NormalTextRun SCXW245505625 BCX0\"> an <\/span><span class=\"NormalTextRun SCXW245505625 BCX0\">ArcGIS Pro <\/span><span class=\"NormalTextRun SCXW245505625 BCX0\">S<\/span><span class=\"NormalTextRun SCXW245505625 BCX0\">tandard or <\/span><span class=\"NormalTextRun SCXW245505625 BCX0\">A<\/span><span class=\"NormalTextRun SCXW245505625 BCX0\">dvance<\/span><span class=\"NormalTextRun SCXW245505625 BCX0\">d<\/span><span class=\"NormalTextRun SCXW245505625 BCX0\"> license level. To learn more please refer to the <a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/get-started\/license-levels.htm\">ArcGIS Pro license levels help documentation<\/a>.<\/span><\/span><\/p>\n<ol>\n<li><span data-contrast=\"auto\">Download the <\/span><a href=\"https:\/\/arcg.is\/0DXT1W0\" target=\"_blank\" rel=\"noopener\"><span data-contrast=\"none\">TemplateARs_SymbolRotation.ppkx<\/span><\/a><span data-contrast=\"auto\"> project package file and then click on the file to open the TemplateARs_SymbolRotation project. This project contains data to step through the workflow in this blog.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">The project opens with the Vehicle Locations map active. There are two feature classes in the map: a streets layer represented by line features and a vehicles layer represented by point features. <\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ol>\n"},{"acf_fc_layout":"image","image":{"ID":2904262,"id":2904262,"title":"2025-07-22_18-01-45","filename":"2025-07-22_18-01-45-e1753221802515.png","filesize":192166,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/2025-07-22_18-01-45","alt":"","author":"365172","description":"","caption":"","name":"2025-07-22_18-01-45","status":"inherit","uploaded_to":2642312,"date":"2025-07-22 22:02:50","modified":"2025-07-22 22:02:50","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":596,"height":346,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515-450x261.png","medium-width":450,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515.png","medium_large-width":596,"medium_large-height":346,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515.png","large-width":596,"large-height":346,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515.png","1536x1536-width":596,"1536x1536-height":346,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515.png","2048x2048-width":596,"2048x2048-height":346,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515.png","card_image-width":596,"card_image-height":346,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-01-45-e1753221802515.png","wide_image-width":596,"wide_image-height":346}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The vehicle point symbols in the map above are incorrectly oriented; the symbols do not follow the direction of travel on the road. To keep things simple, we\u2019ll say that we have a one-way road that goes from left to right. This gives us a clear-cut objective:<\/p>\n<p style=\"padding-left: 40px\"><em>Vehicles should face the direction of travel<\/em>.<\/p>\n<p>Right click on our Vehicles layer in the Contents pane and on the <strong>Data Design<\/strong> context menu click <strong>Attribute Rules<\/strong> to open the Attribute Rules view.<\/p>\n<p>In the Attribute Rules view click on the bottom half of the Calculation Rule button in the ribbon. From the context menu select <strong>Templates &gt; Generate Symbol Rotation<\/strong>. The Generate Symbol Rotations Geoprocessing Tool dialog opens.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2904272,"id":2904272,"title":"2025-07-22_18-11-53","filename":"2025-07-22_18-11-53.png","filesize":18249,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/2025-07-22_18-11-53","alt":"","author":"365172","description":"","caption":"","name":"2025-07-22_18-11-53","status":"inherit","uploaded_to":2642312,"date":"2025-07-22 22:13:34","modified":"2025-07-22 22:13:34","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":438,"height":221,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","medium-width":438,"medium-height":221,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","medium_large-width":438,"medium_large-height":221,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","large-width":438,"large-height":221,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","1536x1536-width":438,"1536x1536-height":221,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","2048x2048-width":438,"2048x2048-height":221,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","card_image-width":438,"card_image-height":221,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/2025-07-22_18-11-53.png","wide_image-width":438,"wide_image-height":221}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3><strong>Tool Overview<\/strong><\/h3>\n"},{"acf_fc_layout":"image","image":{"ID":2645102,"id":2645102,"title":"GenerateSymbolRoation_GPToolDialog","filename":"GenerateSymbolRoation_GPToolDialog.png","filesize":64544,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/generatesymbolroation_gptooldialog","alt":"","author":"365172","description":"","caption":"","name":"generatesymbolroation_gptooldialog","status":"inherit","uploaded_to":2642312,"date":"2025-01-06 19:56:58","modified":"2025-01-06 19:56:58","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":500,"height":855,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog.png","medium-width":153,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog.png","medium_large-width":500,"medium_large-height":855,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog.png","large-width":500,"large-height":855,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog.png","1536x1536-width":500,"1536x1536-height":855,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog.png","2048x2048-width":500,"2048x2048-height":855,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog-272x465.png","card_image-width":272,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRoation_GPToolDialog.png","wide_image-width":500,"wide_image-height":855}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Here are the parameters for the tool and how we\u2019ll fill them out:<\/p>\n<ol>\n<li>The optional <strong>Expression<\/strong> parameter allows us to apply a where clause expression that limits the features the attribute rule will be applied to. The rule will not run unless the conditions of the where clause are satisfied.<\/li>\n<li><span class=\"TextRun SCXW249202035 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW249202035 BCX0\">The\u202f<strong>Rotation Field\u202f<\/strong><\/span><span class=\"NormalTextRun SCXW249202035 BCX0\">parameter is<\/span><span class=\"NormalTextRun SCXW249202035 BCX0\">\u00a0the field that <\/span><span class=\"NormalTextRun SCXW249202035 BCX0\">stores<\/span><span class=\"NormalTextRun SCXW249202035 BCX0\"> the <\/span><span class=\"NormalTextRun SCXW249202035 BCX0\">rotation value.\u00a0<\/span><span class=\"NormalTextRun SCXW249202035 BCX0\">We have a field conveniently named\u202f<\/span><\/span><em><span class=\"TextRun SCXW249202035 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SpellingErrorV2Themed SCXW249202035 BCX0\">RotationField<\/span><\/span><\/em><span class=\"TextRun SCXW249202035 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW249202035 BCX0\"><em>\u202f<\/em>for this.<\/span><\/span><span class=\"EOP SCXW249202035 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li>The <strong>Intersecting Line Classes<\/strong> parameter allows us to choose the line feature classes that the point feature class intersects with. Let\u2019s choose the <em>Streets<\/em> feature class. The <strong>Orientation Field<\/strong> is a numeric field used as a tiebreaker if a point intersects with multiple lines. When multiple features occupy the same feature space then the order in which the feature classes are chosen in addition to the orientation field determines which line feature is used for the intersection. By default, the orientation field is set to OBJECTID which is what we will use for our workflow.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>The <strong>Rotations Option<\/strong> parameter allows us to configure how point features should rotate when they intersect with line features. We can configure multiple rotation options based on attributes in the point class. For instance, different vehicle types could rotate differently. There are four sub-parameters for a rotation option:<\/li>\n<\/ol>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>The <strong>Point<\/strong> <strong>Class Expression<\/strong> allows us to apply a where clause expression on attributes in the point class for which the rotation option should be enforced on. By default, no expression is provided (i.e., the rotation option is applied to <em>all <\/em>points). If you have multiple rotation options configured, this parameter is helpful in specifying which features a rotation option is applicable for.<\/li>\n<li>The <strong>Rotation Style<\/strong> specifies how the direction of the rotation is measured. There are two types:\n<div class=\"image-container\"><\/div>\n<ul>\n<li><strong>Arithmetic<\/strong> \u2013 the rotation starts at zero in the east direction and is calculated counterclockwise. This is default.<\/li>\n<\/ul>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/ArithmeticRotation.jpg\" alt=\"Arithmetic Rotation\" \/><\/p>\n<ul>\n<li><strong>Geographic<\/strong> \u2013 the rotation will start at zero in the north direction and is calculated clockwise<\/li>\n<\/ul>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GeographicRotation.jpg\" alt=\"Geographic Rotation\" \/><\/li>\n<\/ul>\n<\/li>\n<li><strong>Rotate Towards<\/strong> specifies whether the feature will be oriented towards maximum or minimum <strong>Orientation Field<\/strong>. There are two options:\n<ol>\n<li><strong>Minimum<\/strong> \u2013 The feature will be oriented toward the minimum value. This is default (i.e., the larger orientation field value \u201cwins\u201d).<\/li>\n<li><strong>Maximum<\/strong> \u2013 The feature will be oriented toward the maximum value.<\/li>\n<\/ol>\n<\/li>\n<li><strong>Additional Rotation<\/strong> allows you to add to the calculated rotation value. By default, this value is set to zero.<\/li>\n<li>For our purposes, we will leave the default values in the <strong>Rotation Options<\/strong> parameter.<\/li>\n<\/ul>\n<p>Once you\u2019re finished filling out the tool parameters, click <strong>OK <\/strong>at the bottom of the dialog.<\/p>\n<p>In the Attribute Rules Data Design View, we see that a new calculation rule has been added to the grid called \u201cSymbolRotation\u201d. Let\u2019s rename it to \u201cVehicle Direction of Travel\u201d.<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2645832,"id":2645832,"title":"GenerateSymbolRotationRule","filename":"GenerateSymbolRotationRule.png","filesize":28781,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/generatesymbolrotationrule","alt":"","author":"365172","description":"","caption":"","name":"generatesymbolrotationrule","status":"inherit","uploaded_to":2642312,"date":"2025-01-07 00:53:48","modified":"2025-01-07 00:53:48","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":624,"height":110,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule-213x110.png","thumbnail-width":213,"thumbnail-height":110,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","medium-width":464,"medium-height":82,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","medium_large-width":624,"medium_large-height":110,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","large-width":624,"large-height":110,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","1536x1536-width":624,"1536x1536-height":110,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","2048x2048-width":624,"2048x2048-height":110,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","card_image-width":624,"card_image-height":110,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotationRule.png","wide_image-width":624,"wide_image-height":110}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>If you scroll down to the Expression in the Details Pane you can see the Arcade Expression that was generated. It looks like this:<\/p>\n<p>&nbsp;<\/p>\n<details>\n<summary><strong>Click here to view a Generate Symbol Rotation Template Attribute Rule Arcade Expression<\/strong><\/summary>\n<pre><code style=\"color: #24292e;background: #F5F5F5;padding: 1em\"><span style=\"color: #6a737d\">\/*\r\nwhere_clause (Text): The expression to filter with.\r\noptions (Array): The rotation options.\r\n  where_clause (Text): The SQL expression to apply rotation to.\r\n  is_geographic (Boolean): Set to true if the rotation setting is set to geographic in the layer properties.\r\n  additional_rotation (Number): Set the counter-clockwise spin angle used for the symbol in the symbology options.\r\n  rotate_towards (Text): When there are 2 intersecting lines, sort by orientation_field and use the min\/max value.\r\n  line_classes (Array): The classes to query.\r\n    class_name (Text): The name of the feature set to query.\r\n    where_clause (Text): The SQL expression to filter class_name.\r\n    orientation_field (Text): The field to orient towards.\r\n*\/<\/span>\r\n<span style=\"color: #d73a49\">var<\/span> rule_settings = {\r\n  <span style=\"color: #032f62\">'where_clause'<\/span>: <span style=\"color: #005cc5\">null<\/span>,\r\n  <span style=\"color: #032f62\">'options'<\/span>: [\r\n    {\r\n      <span style=\"color: #032f62\">'where_clause'<\/span>: <span style=\"color: #005cc5\">null<\/span>,\r\n      <span style=\"color: #032f62\">'is_geographic'<\/span>: <span style=\"color: #005cc5\">false<\/span>,\r\n      <span style=\"color: #032f62\">'additional_rotation'<\/span>: <span style=\"color: #005cc5\">0<\/span>,\r\n      <span style=\"color: #032f62\">'rotate_towards'<\/span>: <span style=\"color: #032f62\">'min'<\/span>,\r\n      <span style=\"color: #032f62\">'line_classes'<\/span>: [\r\n        {\r\n          <span style=\"color: #032f62\">'class_name'<\/span>: <span style=\"color: #032f62\">'Streets'<\/span>,\r\n          <span style=\"color: #032f62\">'where_clause'<\/span>: <span style=\"color: #005cc5\">null<\/span>,\r\n          <span style=\"color: #032f62\">'orientation_field'<\/span>: <span style=\"color: #032f62\">'OBJECTID'<\/span>,\r\n        },\r\n      ],\r\n    },\r\n  ],\r\n};\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">get_feature_set<\/span>(key) {\r\n  <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">Decode<\/span>(\r\n    key,\r\n    <span style=\"color: #032f62\">'Streets'<\/span>, <span style=\"color: #e36209\">FeatureSetByName<\/span>(<span style=\"color: #e36209\">$datastore<\/span>, <span style=\"color: #032f62\">'Streets_MA'<\/span>, [<span style=\"color: #032f62\">'OBJECTID'<\/span>], <span style=\"color: #005cc5\">true<\/span>),\r\n    <span style=\"color: #005cc5\">null<\/span>\r\n  );\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">IsEmpty2<\/span>(value) {\r\n  <span style=\"color: #d73a49\">var<\/span> type = <span style=\"color: #e36209\">TypeOf<\/span>(value);\r\n  <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">''<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #005cc5\">true<\/span>; <span style=\"color: #6a737d\">\/\/ null<\/span>\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'Boolean'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> !value;\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'String'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">IsEmpty<\/span>(value);\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (\r\n    (type == <span style=\"color: #032f62\">'Array'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'Dictionary'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'FeatureSet'<\/span>)\r\n  ) {\r\n    <span style=\"color: #d73a49\">for<\/span> (<span style=\"color: #d73a49\">var<\/span> x <span style=\"color: #d73a49\">in<\/span> value) {\r\n      <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #005cc5\">false<\/span>;\r\n    }\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #005cc5\">true<\/span>;\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'Number'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">IsNan<\/span>(value);\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'Point'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">IsNan<\/span>(value.x);\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'Multipoint'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">Count<\/span>(value.points) == <span style=\"color: #005cc5\">0<\/span>;\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'Polyline'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">Count<\/span>(value.paths) == <span style=\"color: #005cc5\">0<\/span>;\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'Polygon'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">Count<\/span>(value.rings) == <span style=\"color: #005cc5\">0<\/span>;\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (type == <span style=\"color: #032f62\">'Extent'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">IsNan<\/span>(value.xmin);\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (\r\n    (type == <span style=\"color: #032f62\">'Feature'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'DateOnly'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'Time'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'Date'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'FeatureSetCollection'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'Portal'<\/span>) ||\r\n    (type == <span style=\"color: #032f62\">'Function'<\/span>)\r\n  ) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #005cc5\">false<\/span>\r\n  }\r\n  <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #005cc5\">null<\/span>;\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">features_to_featureset<\/span>(features) {\r\n  <span style=\"color: #6a737d\">\/\/ Converts features array to feature set.<\/span>\r\n  <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">TypeOf<\/span>(features) == <span style=\"color: #032f62\">'FeatureSet'<\/span>) {\r\n    <span style=\"color: #d73a49\">return<\/span> features;\r\n  }\r\n  <span style=\"color: #d73a49\">var<\/span> rows = [];\r\n  <span style=\"color: #d73a49\">var<\/span> feat, feat_dict;\r\n  <span style=\"color: #d73a49\">for<\/span> (<span style=\"color: #d73a49\">var<\/span> i <span style=\"color: #d73a49\">in<\/span> features) {\r\n    feat = features[i];\r\n    feat_dict = {\r\n      <span style=\"color: #032f62\">'__oid__'<\/span>: i + <span style=\"color: #005cc5\">1<\/span>, <span style=\"color: #6a737d\">\/\/ Incrementing OID field.<\/span>\r\n    };\r\n    <span style=\"color: #d73a49\">for<\/span> (<span style=\"color: #d73a49\">var<\/span> j <span style=\"color: #d73a49\">in<\/span> feat) {\r\n      feat_dict[j] = feat[j];\r\n    }\r\n    <span style=\"color: #e36209\">Push<\/span>(rows, {\r\n      <span style=\"color: #032f62\">'attributes'<\/span>: feat_dict,\r\n    });\r\n  }\r\n  <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">IsEmpty<\/span>(feat)) {\r\n    <span style=\"color: #d73a49\">return<\/span>;\r\n  }\r\n\r\n  <span style=\"color: #6a737d\">\/\/ Add OID field to schema.<\/span>\r\n  <span style=\"color: #d73a49\">var<\/span> feat_schema = <span style=\"color: #e36209\">Array<\/span>(<span style=\"color: #e36209\">Schema<\/span>(feat).fields);\r\n  <span style=\"color: #e36209\">Push<\/span>(feat_schema, {\r\n    <span style=\"color: #032f62\">'name'<\/span>: <span style=\"color: #032f62\">'__oid__'<\/span>,\r\n    <span style=\"color: #032f62\">'type'<\/span>: <span style=\"color: #032f62\">'esriFieldTypeInteger'<\/span>,\r\n  });\r\n  <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">FeatureSet<\/span>({\r\n    <span style=\"color: #032f62\">'fields'<\/span>: feat_schema,\r\n    <span style=\"color: #032f62\">'features'<\/span>: rows,\r\n  });\r\n\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">count_features<\/span>(features, where_clause) {\r\n  <span style=\"color: #6a737d\">\/\/ count features that match where_clause<\/span>\r\n  <span style=\"color: #d73a49\">if<\/span> (IsEmpty2(features)) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #005cc5\">0<\/span>;\r\n  }\r\n  <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">IsEmpty<\/span>(where_clause)) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">Count<\/span>(features);\r\n  }\r\n  <span style=\"color: #d73a49\">var<\/span> fs = features_to_featureset(features);\r\n  <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">IsEmpty<\/span>(fs)) {\r\n    <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #005cc5\">0<\/span>;\r\n  }\r\n  <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">Count<\/span>(<span style=\"color: #e36209\">Filter<\/span>(fs, where_clause));\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">get_unit_code<\/span>(unit) {\r\n  <span style=\"color: #6a737d\">\/\/ Converts unit string to unit code<\/span>\r\n  <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">IsEmpty<\/span>(unit)) {\r\n    <span style=\"color: #d73a49\">return<\/span>\r\n  }\r\n\r\n  <span style=\"color: #d73a49\">var<\/span> u = <span style=\"color: #e36209\">Lower<\/span>(<span style=\"color: #e36209\">Replace<\/span>(<span style=\"color: #e36209\">Replace<\/span>(<span style=\"color: #e36209\">Replace<\/span>(unit, <span style=\"color: #032f62\">' '<\/span>, <span style=\"color: #032f62\">''<\/span>), <span style=\"color: #032f62\">'-'<\/span>, <span style=\"color: #032f62\">''<\/span>), <span style=\"color: #032f62\">'_'<\/span>, <span style=\"color: #032f62\">''<\/span>));\r\n  <span style=\"color: #6a737d\">\/\/ US \/ INT suffix differentiates the unit code. If no suffix, then it defaults to US Survey.<\/span>\r\n  <span style=\"color: #d73a49\">var<\/span> international = <span style=\"color: #005cc5\">false<\/span>;\r\n  <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">Right<\/span>(u, <span style=\"color: #005cc5\">2<\/span>) == <span style=\"color: #032f62\">'us'<\/span>) {\r\n    u = <span style=\"color: #e36209\">Left<\/span>(u, <span style=\"color: #e36209\">Count<\/span>(u) - <span style=\"color: #005cc5\">2<\/span>);\r\n  } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">Right<\/span>(u, <span style=\"color: #005cc5\">3<\/span>) == <span style=\"color: #032f62\">'int'<\/span> &amp;&amp; u != <span style=\"color: #032f62\">'point'<\/span>) {\r\n    u = <span style=\"color: #e36209\">Left<\/span>(u, <span style=\"color: #e36209\">Count<\/span>(u) - <span style=\"color: #005cc5\">3<\/span>);\r\n    international = <span style=\"color: #005cc5\">true<\/span>;\r\n  }\r\n  <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">Right<\/span>(u, <span style=\"color: #005cc5\">1<\/span>) == <span style=\"color: #032f62\">'s'<\/span> &amp;&amp; u != <span style=\"color: #032f62\">'inches'<\/span>) { <span style=\"color: #6a737d\">\/\/ plural<\/span>\r\n    u = <span style=\"color: #e36209\">Left<\/span>(u, <span style=\"color: #e36209\">Count<\/span>(u) - <span style=\"color: #005cc5\">1<\/span>);\r\n  }\r\n  <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">When<\/span>(\r\n    <span style=\"color: #6a737d\">\/\/ Metric<\/span>\r\n    u == <span style=\"color: #032f62\">'km'<\/span> || u == <span style=\"color: #032f62\">'kilometer'<\/span>, <span style=\"color: #005cc5\">9036<\/span>,\r\n    u == <span style=\"color: #032f62\">'m'<\/span> || u == <span style=\"color: #032f62\">'meter'<\/span>, <span style=\"color: #005cc5\">9001<\/span>,\r\n    u == <span style=\"color: #032f62\">'dm'<\/span> || u == <span style=\"color: #032f62\">'decimeter'<\/span>, <span style=\"color: #005cc5\">109005<\/span>,\r\n    u == <span style=\"color: #032f62\">'cm'<\/span> || u == <span style=\"color: #032f62\">'centimeter'<\/span>, <span style=\"color: #005cc5\">1033<\/span>,\r\n    u == <span style=\"color: #032f62\">'mm'<\/span> || u == <span style=\"color: #032f62\">'millimeter'<\/span>, <span style=\"color: #005cc5\">1025<\/span>,\r\n\r\n    <span style=\"color: #6a737d\">\/\/ US Survey \/ International<\/span>\r\n    u == <span style=\"color: #032f62\">'nmi'<\/span> || u == <span style=\"color: #032f62\">'nauticalmile'<\/span>, <span style=\"color: #e36209\">IIf<\/span>(international, <span style=\"color: #005cc5\">9030<\/span>, <span style=\"color: #005cc5\">109012<\/span>),\r\n    u == <span style=\"color: #032f62\">'mi'<\/span> || u == <span style=\"color: #032f62\">'mile'<\/span>, <span style=\"color: #e36209\">IIf<\/span>(international, <span style=\"color: #005cc5\">9093<\/span>, <span style=\"color: #005cc5\">9035<\/span>),\r\n    u == <span style=\"color: #032f62\">'yd'<\/span> || u == <span style=\"color: #032f62\">'yard'<\/span>, <span style=\"color: #e36209\">IIf<\/span>(international, <span style=\"color: #005cc5\">9096<\/span>, <span style=\"color: #005cc5\">109002<\/span>),\r\n    u == <span style=\"color: #032f62\">'ft'<\/span> || u == <span style=\"color: #032f62\">'foot'<\/span> || u == <span style=\"color: #032f62\">'feet'<\/span>, <span style=\"color: #e36209\">IIf<\/span>(international, <span style=\"color: #005cc5\">9002<\/span>, <span style=\"color: #005cc5\">9003<\/span>),\r\n    u == <span style=\"color: #032f62\">'in'<\/span> || u == <span style=\"color: #032f62\">'inch'<\/span> || u == <span style=\"color: #032f62\">'inches'<\/span>, <span style=\"color: #e36209\">IIf<\/span>(international, <span style=\"color: #005cc5\">109008<\/span>, <span style=\"color: #005cc5\">109009<\/span>),\r\n\r\n    <span style=\"color: #6a737d\">\/\/ Misc<\/span>\r\n    u == <span style=\"color: #032f62\">'dd'<\/span> || u == <span style=\"color: #032f62\">'deg'<\/span> || u == <span style=\"color: #032f62\">'degree'<\/span> || u == <span style=\"color: #032f62\">'decimaldegree'<\/span>, <span style=\"color: #005cc5\">9102<\/span>,\r\n    u == <span style=\"color: #032f62\">'pt'<\/span> || u == <span style=\"color: #032f62\">'point'<\/span>, <span style=\"color: #005cc5\">109016<\/span>,\r\n\r\n    <span style=\"color: #6a737d\">\/\/ Default<\/span>\r\n    <span style=\"color: #005cc5\">null<\/span>,\r\n  )\r\n\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">apply_sql_spatial_filter<\/span>(feature_set, options) {\r\n  <span style=\"color: #6a737d\">\/\/ Applies optional spatial\/attribute filters and OrderBy clause to feature_set.<\/span>\r\n  <span style=\"color: #d73a49\">var<\/span> spatialFilter = <span style=\"color: #e36209\">Decode<\/span>(\r\n    <span style=\"color: #e36209\">Lower<\/span>(<span style=\"color: #e36209\">DefaultValue<\/span>(options, <span style=\"color: #032f62\">'spatial_operator'<\/span>, <span style=\"color: #032f62\">''<\/span>)),\r\n    <span style=\"color: #032f62\">'intersects'<\/span>, <span style=\"color: #e36209\">Intersects<\/span>,\r\n    <span style=\"color: #032f62\">'contains'<\/span>, <span style=\"color: #e36209\">Contains<\/span>,\r\n    <span style=\"color: #032f62\">'crosses'<\/span>, <span style=\"color: #e36209\">Crosses<\/span>,\r\n    <span style=\"color: #032f62\">'envelopeintersects'<\/span>, <span style=\"color: #e36209\">EnvelopeIntersects<\/span>,\r\n    <span style=\"color: #032f62\">'intersects'<\/span>, <span style=\"color: #e36209\">Intersects<\/span>,\r\n    <span style=\"color: #032f62\">'overlaps'<\/span>, <span style=\"color: #e36209\">Overlaps<\/span>,\r\n    <span style=\"color: #032f62\">'touches'<\/span>, <span style=\"color: #e36209\">Touches<\/span>,\r\n    <span style=\"color: #032f62\">'within'<\/span>, <span style=\"color: #e36209\">Within<\/span>,\r\n    <span style=\"color: #005cc5\">null<\/span>\r\n  );\r\n\r\n  <span style=\"color: #d73a49\">var<\/span> geo = <span style=\"color: #e36209\">DefaultValue<\/span>(options, <span style=\"color: #032f62\">'input_geometry'<\/span>, <span style=\"color: #005cc5\">null<\/span>);\r\n  <span style=\"color: #d73a49\">if<\/span> (!<span style=\"color: #e36209\">IsEmpty<\/span>(spatialFilter) &amp;&amp; !IsEmpty2(geo)) {\r\n    <span style=\"color: #d73a49\">if<\/span> (!<span style=\"color: #e36209\">IsEmpty<\/span>(<span style=\"color: #e36209\">DefaultValue<\/span>(options, <span style=\"color: #032f62\">'search_distance'<\/span>, <span style=\"color: #005cc5\">null<\/span>))) {\r\n      geo = <span style=\"color: #e36209\">Buffer<\/span>(geo, options.search_distance, get_unit_code(options.search_units));\r\n    }\r\n    feature_set = spatialFilter(feature_set, geo);\r\n  }\r\n  <span style=\"color: #d73a49\">if<\/span> (!<span style=\"color: #e36209\">IsEmpty<\/span>(<span style=\"color: #e36209\">DefaultValue<\/span>(options, <span style=\"color: #032f62\">'where_clause'<\/span>, <span style=\"color: #005cc5\">null<\/span>))) {\r\n    feature_set = <span style=\"color: #e36209\">Filter<\/span>(feature_set, options.where_clause);\r\n  }\r\n  <span style=\"color: #d73a49\">if<\/span> (!<span style=\"color: #e36209\">IsEmpty<\/span>(<span style=\"color: #e36209\">DefaultValue<\/span>(options, <span style=\"color: #032f62\">'order_by_clause'<\/span>, <span style=\"color: #005cc5\">null<\/span>))) {\r\n    feature_set = <span style=\"color: #e36209\">OrderBy<\/span>(feature_set, options.order_by_clause);\r\n  }\r\n  <span style=\"color: #d73a49\">return<\/span> feature_set;\r\n}\r\n\r\n<span style=\"color: #d73a49\">if<\/span> (count_features([<span style=\"color: #e36209\">$feature<\/span>], <span style=\"color: #e36209\">DefaultValue<\/span>(rule_settings, <span style=\"color: #032f62\">'where_clause'<\/span>, <span style=\"color: #005cc5\">null<\/span>)) != <span style=\"color: #005cc5\">1<\/span>) {\r\n  <span style=\"color: #d73a49\">return<\/span>;\r\n}\r\n\r\n\r\n<span style=\"color: #e36209\">Expects<\/span>(<span style=\"color: #e36209\">$feature<\/span>, <span style=\"color: #032f62\">'RotationField'<\/span>);\r\n\r\n<span style=\"color: #d73a49\">if<\/span> (!<span style=\"color: #e36209\">IsEmpty<\/span>(<span style=\"color: #e36209\">$feature<\/span>.RotationField)) {\r\n  <span style=\"color: #d73a49\">return<\/span>;\r\n}\r\n\r\n<span style=\"color: #d73a49\">var<\/span> feature_geometry = <span style=\"color: #e36209\">Geometry<\/span>(<span style=\"color: #e36209\">$feature<\/span>);\r\n<span style=\"color: #d73a49\">if<\/span> (IsEmpty2(feature_geometry)) {\r\n  <span style=\"color: #d73a49\">return<\/span>;\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">extract_angles<\/span>(line_class) {\r\n  <span style=\"color: #d73a49\">var<\/span> envelope = <span style=\"color: #e36209\">Extent<\/span>(<span style=\"color: #e36209\">Buffer<\/span>(<span style=\"color: #e36209\">$feature<\/span>, <span style=\"color: #005cc5\">0.01<\/span>, <span style=\"color: #032f62\">'meter'<\/span>)); <span style=\"color: #6a737d\">\/\/ Buffer by small amount to extract segment.<\/span>\r\n  <span style=\"color: #d73a49\">var<\/span> line_fs = apply_sql_spatial_filter(\r\n    get_feature_set(line_class.class_name), {\r\n      <span style=\"color: #032f62\">'spatial_operator'<\/span>: <span style=\"color: #032f62\">'Intersects'<\/span>,\r\n      <span style=\"color: #032f62\">'input_geometry'<\/span>: <span style=\"color: #e36209\">Geometry<\/span>(<span style=\"color: #e36209\">$feature<\/span>),\r\n      <span style=\"color: #032f62\">'where_clause'<\/span>: line_class.where_clause,\r\n      <span style=\"color: #032f62\">'order_by_clause'<\/span>: <span style=\"color: #032f62\">'ObjectID ASC'<\/span>,\r\n    }\r\n  )\r\n\r\n  <span style=\"color: #d73a49\">var<\/span> found_angles = [];\r\n  <span style=\"color: #d73a49\">var<\/span> angle_value;\r\n  <span style=\"color: #d73a49\">var<\/span> null_val = <span style=\"color: #e36209\">IIf<\/span>(rule_settings.rotate_towards == <span style=\"color: #032f62\">'max'<\/span>, -<span style=\"color: #005cc5\">Infinity<\/span>, <span style=\"color: #005cc5\">Infinity<\/span>);\r\n  <span style=\"color: #d73a49\">for<\/span> (<span style=\"color: #d73a49\">var<\/span> line <span style=\"color: #d73a49\">in<\/span> line_fs) {\r\n    <span style=\"color: #d73a49\">var<\/span> segment = <span style=\"color: #e36209\">Clip<\/span>(line, envelope).paths[<span style=\"color: #005cc5\">0<\/span>];\r\n    <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">Equals<\/span>(segment[<span style=\"color: #005cc5\">0<\/span>], feature_geometry)) {\r\n      angle_value = <span style=\"color: #e36209\">Angle<\/span>(segment[<span style=\"color: #005cc5\">0<\/span>], segment[<span style=\"color: #005cc5\">1<\/span>]); <span style=\"color: #6a737d\">\/\/ start point<\/span>\r\n    } <span style=\"color: #d73a49\">else<\/span> <span style=\"color: #d73a49\">if<\/span> (<span style=\"color: #e36209\">Equals<\/span>(segment[<span style=\"color: #005cc5\">-1<\/span>], feature_geometry)) {\r\n      angle_value = <span style=\"color: #e36209\">Angle<\/span>(segment[<span style=\"color: #005cc5\">-2<\/span>], segment[<span style=\"color: #005cc5\">-1<\/span>]); <span style=\"color: #6a737d\">\/\/ end point<\/span>\r\n    } <span style=\"color: #d73a49\">else<\/span> {\r\n      angle_value = <span style=\"color: #e36209\">Angle<\/span>(segment[<span style=\"color: #005cc5\">0<\/span>], segment[<span style=\"color: #005cc5\">-1<\/span>]); <span style=\"color: #6a737d\">\/\/ midspan<\/span>\r\n    }\r\n\r\n    <span style=\"color: #d73a49\">if<\/span> (rule_settings.is_geographic) {\r\n      angle_value = (<span style=\"color: #005cc5\">450<\/span> - angle_value) % <span style=\"color: #005cc5\">360<\/span>;\r\n    }\r\n    angle_value = (angle_value + rule_settings.additional_rotation) % <span style=\"color: #005cc5\">360<\/span>;\r\n    <span style=\"color: #e36209\">Push<\/span>(found_angles, {\r\n      <span style=\"color: #032f62\">'angle'<\/span>: angle_value,\r\n      <span style=\"color: #032f62\">'orientation'<\/span>: <span style=\"color: #e36209\">DefaultValue<\/span>(line[line_class.orientation_field], null_val)\r\n    });\r\n  }\r\n  <span style=\"color: #d73a49\">return<\/span> found_angles;\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">collect_angles<\/span>() {\r\n  <span style=\"color: #d73a49\">var<\/span> all_angles = [];\r\n  <span style=\"color: #d73a49\">var<\/span> fs = features_to_featureset([<span style=\"color: #e36209\">$feature<\/span>]);\r\n\r\n  <span style=\"color: #d73a49\">for<\/span> (<span style=\"color: #d73a49\">var<\/span> i <span style=\"color: #d73a49\">in<\/span> rule_settings.options) {\r\n    <span style=\"color: #d73a49\">var<\/span> options = rule_settings.options[i];\r\n    <span style=\"color: #d73a49\">if<\/span> (count_features(fs, options.where_clause) == <span style=\"color: #005cc5\">1<\/span>) {\r\n      rule_settings.is_geographic = options.is_geographic;\r\n      rule_settings.additional_rotation = options.additional_rotation;\r\n      rule_settings.rotate_towards = options.rotate_towards;\r\n      <span style=\"color: #d73a49\">for<\/span> (<span style=\"color: #d73a49\">var<\/span> j <span style=\"color: #d73a49\">in<\/span> options.line_classes) {\r\n        all_angles = <span style=\"color: #e36209\">Splice<\/span>(all_angles, extract_angles(options.line_classes[j]));\r\n      }\r\n      <span style=\"color: #d73a49\">break<\/span>;\r\n    }\r\n  }\r\n  <span style=\"color: #d73a49\">return<\/span> all_angles\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">angle_sort<\/span>(a, b) {\r\n  <span style=\"color: #d73a49\">return<\/span> <span style=\"color: #e36209\">When<\/span>(\r\n    a.orientation &lt; b.orientation, <span style=\"color: #005cc5\">-1<\/span>,\r\n    a.orientation &gt; b.orientation, <span style=\"color: #005cc5\">1<\/span>,\r\n    <span style=\"color: #005cc5\">0<\/span> <span style=\"color: #6a737d\">\/\/ equal<\/span>\r\n  );\r\n}\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">main<\/span>() {\r\n  <span style=\"color: #d73a49\">var<\/span> angles = <span style=\"color: #e36209\">Sort<\/span>(collect_angles(), angle_sort);\r\n  <span style=\"color: #d73a49\">if<\/span> (IsEmpty2(angles)) {\r\n    <span style=\"color: #d73a49\">return<\/span>;\r\n  }\r\n  <span style=\"color: #d73a49\">return<\/span> angles[<span style=\"color: #e36209\">IIf<\/span>(rule_settings.rotate_towards == <span style=\"color: #032f62\">'min'<\/span>, <span style=\"color: #005cc5\">0<\/span>, <span style=\"color: #005cc5\">-1<\/span>)][<span style=\"color: #032f62\">'angle'<\/span>];\r\n}\r\n\r\n<span style=\"color: #d73a49\">return<\/span> main();\r\n<\/code><\/pre>\n<\/details>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"content","content":"<h3><strong>Review and Modify the Generated Rule<\/strong><\/h3>\n<p>In the Attribute Rules tab of the ribbon click the <strong>Save<\/strong> button.<\/p>\n<p>Close the Attribute Rules Data Design View and head back to the map. Go to the <strong>Edit<\/strong> tab in the ribbon. Enable snapping and click on the Create button. Place a vehicle point on top of one of the streets. Nothing seems to have happened! Or did it? Let\u2019s investigate further!<\/p>\n<p>In the Contents pane right click on the Vehicles layer and open its <strong>Attributes Table<\/strong>. Notice that the rotation field for the point features we just created are not null. They are a integer value in degrees.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2646122,"id":2646122,"title":"GenerateSymbolRotation_AttribtuesTable1","filename":"GenerateSymbolRotation_AttribtuesTable1.png","filesize":29071,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/generatesymbolrotation_attribtuestable1","alt":"","author":"365172","description":"","caption":"","name":"generatesymbolrotation_attribtuestable1","status":"inherit","uploaded_to":2642312,"date":"2025-01-07 02:12:30","modified":"2025-01-07 02:12:30","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":409,"height":325,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","medium-width":328,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","medium_large-width":409,"medium_large-height":325,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","large-width":409,"large-height":325,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","1536x1536-width":409,"1536x1536-height":325,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","2048x2048-width":409,"2048x2048-height":325,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","card_image-width":409,"card_image-height":325,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/GenerateSymbolRotation_AttribtuesTable1.png","wide_image-width":409,"wide_image-height":325}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3><strong>Configuring a Point Layer&#8217;s Symbology to Visualize its Symbol Rotation<\/strong><\/h3>\n"},{"acf_fc_layout":"image","image":{"ID":2646932,"id":2646932,"title":"RotationSymbologySetting","filename":"RotationSymbologySetting.jpg","filesize":36592,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/rotationsymbologysetting","alt":"","author":"365172","description":"","caption":"","name":"rotationsymbologysetting","status":"inherit","uploaded_to":2642312,"date":"2025-01-08 01:22:40","modified":"2025-01-08 01:22:40","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":318,"height":323,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting-213x200.jpg","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","medium-width":257,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","medium_large-width":318,"medium_large-height":323,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","large-width":318,"large-height":323,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","1536x1536-width":318,"1536x1536-height":323,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","2048x2048-width":318,"2048x2048-height":323,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","card_image-width":318,"card_image-height":323,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/RotationSymbologySetting.jpg","wide_image-width":318,"wide_image-height":323}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>To visualize the rotation values on our point layer, we need to configure its symbology:<\/p>\n<ol>\n<li>In the Contents pane right click on the Vehicles layer and select <strong>Symbology<\/strong>.<\/li>\n<li>In the Symbology Pane switch to the <strong>Vary Symbology by Attribute <\/strong><\/li>\n<li>Expand the collapsible section for<\/li>\n<li>Set the <strong>field<\/strong> parameter to<strong> RotationField<\/strong><\/li>\n<li>Leave the other settings as default. Close the pane.<\/li>\n<\/ol>\n<p>And just like that our vehicle points are rotated!<\/p>\n<p><strong>Before changing the symbology settings:<\/strong><\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2646092,"id":2646092,"title":"BeforeChangingSymbologySettings","filename":"BeforeChangingSymbologySettings.png","filesize":18501,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/beforechangingsymbologysettings","alt":"","author":"365172","description":"","caption":"","name":"beforechangingsymbologysettings","status":"inherit","uploaded_to":2642312,"date":"2025-01-07 02:09:37","modified":"2025-01-07 02:09:37","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":234,"height":141,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings-213x141.png","thumbnail-width":213,"thumbnail-height":141,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","medium-width":234,"medium-height":141,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","medium_large-width":234,"medium_large-height":141,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","large-width":234,"large-height":141,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","1536x1536-width":234,"1536x1536-height":141,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","2048x2048-width":234,"2048x2048-height":141,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","card_image-width":234,"card_image-height":141,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/BeforeChangingSymbologySettings.png","wide_image-width":234,"wide_image-height":141}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p><strong>After changing the symbology settings:<\/strong><\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2646082,"id":2646082,"title":"AfterChangingSymbologySettings","filename":"AfterChangingSymbologySettings.png","filesize":18186,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\/afterchangingsymbologysettings","alt":"","author":"365172","description":"","caption":"","name":"afterchangingsymbologysettings","status":"inherit","uploaded_to":2642312,"date":"2025-01-07 02:08:53","modified":"2025-01-07 02:08:53","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":234,"height":141,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings-213x141.png","thumbnail-width":213,"thumbnail-height":141,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","medium-width":234,"medium-height":141,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","medium_large-width":234,"medium_large-height":141,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","large-width":234,"large-height":141,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","1536x1536-width":234,"1536x1536-height":141,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","2048x2048-width":234,"2048x2048-height":141,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","card_image-width":234,"card_image-height":141,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/AfterChangingSymbologySettings.png","wide_image-width":234,"wide_image-height":141}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Generate Symbol Rotation template attribute rules are only supported on point feature classes intersecting with line feature classes. Let\u2019s think about why. Point features do not give us the context regarding their directionality. There are scenarios such as the one in our example above where the direction of point features is essential to ensuring data integrity. A logistics company, for instance, doesn\u2019t only want to know where their delivery vehicles are located; they also want to know which direction their vehicles are traveling.<br \/>\nOn the other hand, line and polygon features give us relatively static interpretations of directionality. The line features that represent the roads in our example aren\u2019t changing any time soon. They tell us exactly where the road is!<\/p>\n<h2><strong>Conclusion<\/strong><\/h2>\n<p>The Generate Symbol Rotation template rule brings one of the most used attribute rules into an easy to use, wizard-like experience. With just a few clicks you can get the correct symbology for your features. And all with no prior knowledge of Arcade needed to use it.<\/p>\n<p>We\u2019d love to hear your feedback regarding the Generate Symbol Rotation template attribute rule! We encourage you to share your thoughts about it or any other attribute rule and data management topics that come to mind on the\u00a0<strong>ArcGIS Ideas<\/strong>\u00a0page!<\/p>\n"},{"acf_fc_layout":"content","content":"<h2><strong>FAQs<\/strong><\/h2>\n<p><strong>Do I need a specific ArcGIS Pro license level to generate template attribute rules?\u00a0<\/strong><\/p>\n<p>Yes, you will need either an ArcGIS Pro Standard or Advanced license level to utilize template attribute rules.<\/p>\n<p><strong>What are the differences between generating a template attribute rule from the Attribute Rules Data Design view versus from the Geoprocessing pane?<\/strong><\/p>\n<p>If you generate a template attribute rule from the Attribute Rule Data Design view for a particular feature class, the rule is added <em>directly<\/em> to the grid in the design view. Prior to saving the rule, you may make edits to the rule via the Details pane.<\/p>\n<p>On the other hand, if you use the template attribute rule geoprocessing tool, you must <em>import<\/em> the .csv file of the attribute rule generated by the tool to the class you specified in the Input Table parameter. The .csv file containing the attribute rule is stored in the path specified in the <strong>Output Folder<\/strong> parameter.<\/p>\n<p><strong>What are the differences between Attribute Rule Templates and Ready to Use Rules?<\/strong><\/p>\n<p>Template attribute rules can be used to generate <strong>Calculation<\/strong> rules using geoprocessing tools. After generating a template attribute rule a user can modify the Arcade script associated with it and any other attribute rule properties via the Details pane.<\/p>\n<p>Ready to Use Rules require a Data Reviewer license. They can be used to generate <strong>Constraint<\/strong> and <strong>Validation <\/strong>reviewer rules from directly within the Attribute Rules Data Design view. Reviewer rules are used to detect features that do not comply with established data quality requirements defined by your organization. To learn more about reviewer rules please visit <a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/help\/data\/validating-data\/manage-reviewer-rules-in-a-geodatabase.htm\">Manage reviewer rules in a geodatabase<\/a>.<\/p>\n<p><strong>Where can I learn more about Generate Symbol Rotation template attribute rules?<\/strong><\/p>\n<p>The following online help documents are useful in more about Generate Symbol Rotation template attribute rules:<\/p>\n<ul>\n<li><a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/help\/data\/geodatabases\/overview\/template-attribute-rules.htm#ESRI_SECTION1_C30D73392D964D51A8B606128A8A6E8F\">Template attribute rules \u2013 Generate Symbol Rotation<\/a><\/li>\n<li><a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/tool-reference\/data-management\/generate-symbol-rotation-attribute-rule.htm\">Generate Symbol Rotation Attribute Rule Geoprocessing Tool<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n"}],"related_articles":[{"ID":2643142,"post_author":"365172","post_date":"2025-01-14 12:42:19","post_date_gmt":"2025-01-14 20:42:19","post_content":"","post_title":"Template Attribute Rules - Generate ID","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"attribute-rules-generate-id","to_ping":"","pinged":"","post_modified":"2025-09-25 10:12:01","post_modified_gmt":"2025-09-25 17:12:01","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2643142","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2642652,"post_author":"365172","post_date":"2025-04-07 15:35:17","post_date_gmt":"2025-04-07 22:35:17","post_content":"","post_title":"Template Attribute Rules - Generate Spatial Join","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"attribute-rules-generate-spatial-join","to_ping":"","pinged":"","post_modified":"2025-09-25 10:17:18","post_modified_gmt":"2025-09-25 17:17:18","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2642652","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/Symbol-Rotation-Card.png","wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Template Attribute Rules - Generate Symbol Rotation<\/title>\n<meta name=\"description\" content=\"Generate Symbol Rotation template attribute rules ensure that your symbology is properly aligned with their respective features.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Template Attribute Rules - Generate Symbol Rotation\" \/>\n<meta property=\"og:description\" content=\"Generate Symbol Rotation template attribute rules ensure that your symbology is properly aligned with their respective features.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-25T17:26:16+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\"},\"author\":{\"name\":\"Mihail Kaburis\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3db9f2b407fc4699dd0b4570bea12d36\"},\"headline\":\"Template Attribute Rules &#8211; Generate Symbol Rotation\",\"datePublished\":\"2025-01-14T20:44:28+00:00\",\"dateModified\":\"2025-09-25T17:26:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcGIS Pro\",\"attribute rules\",\"data management\",\"geodatabase\",\"Template Attribute Rules\"],\"articleSection\":[\"Data Management\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\",\"name\":\"Template Attribute Rules - Generate Symbol Rotation\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2025-01-14T20:44:28+00:00\",\"dateModified\":\"2025-09-25T17:26:16+00:00\",\"description\":\"Generate Symbol Rotation template attribute rules ensure that your symbology is properly aligned with their respective features.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Template Attribute Rules &#8211; Generate Symbol Rotation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3db9f2b407fc4699dd0b4570bea12d36\",\"name\":\"Mihail Kaburis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/uc_2024_profile_stamford-468x465.jpg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/uc_2024_profile_stamford-468x465.jpg\",\"caption\":\"Mihail Kaburis\"},\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/mkaburis\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Template Attribute Rules - Generate Symbol Rotation","description":"Generate Symbol Rotation template attribute rules ensure that your symbology is properly aligned with their respective features.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation","og_locale":"en_US","og_type":"article","og_title":"Template Attribute Rules - Generate Symbol Rotation","og_description":"Generate Symbol Rotation template attribute rules ensure that your symbology is properly aligned with their respective features.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2025-09-25T17:26:16+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation"},"author":{"name":"Mihail Kaburis","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3db9f2b407fc4699dd0b4570bea12d36"},"headline":"Template Attribute Rules &#8211; Generate Symbol Rotation","datePublished":"2025-01-14T20:44:28+00:00","dateModified":"2025-09-25T17:26:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation"},"wordCount":7,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcGIS Pro","attribute rules","data management","geodatabase","Template Attribute Rules"],"articleSection":["Data Management"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation","name":"Template Attribute Rules - Generate Symbol Rotation","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2025-01-14T20:44:28+00:00","dateModified":"2025-09-25T17:26:16+00:00","description":"Generate Symbol Rotation template attribute rules ensure that your symbology is properly aligned with their respective features.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/data-management\/attribute-rules-generate-symbol-rotation#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Template Attribute Rules &#8211; Generate Symbol Rotation"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3db9f2b407fc4699dd0b4570bea12d36","name":"Mihail Kaburis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/uc_2024_profile_stamford-468x465.jpg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/uc_2024_profile_stamford-468x465.jpg","caption":"Mihail Kaburis"},"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/mkaburis"}]}},"text_date":"January 14, 2025","author_name":"Mihail Kaburis","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/mkaburis","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcGIS Pro","tag_data":[{"term_id":42181,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":42181,"taxonomy":"post_tag","description":"","parent":0,"count":323,"filter":"raw"},{"term_id":302212,"name":"attribute rules","slug":"attribute-rules","term_group":0,"term_taxonomy_id":302212,"taxonomy":"post_tag","description":"","parent":0,"count":35,"filter":"raw"},{"term_id":86442,"name":"data management","slug":"data-management","term_group":0,"term_taxonomy_id":86442,"taxonomy":"post_tag","description":"","parent":0,"count":67,"filter":"raw"},{"term_id":25381,"name":"geodatabase","slug":"geodatabase","term_group":0,"term_taxonomy_id":25381,"taxonomy":"post_tag","description":"","parent":0,"count":48,"filter":"raw"},{"term_id":777832,"name":"Template Attribute Rules","slug":"template-attribute-rules","term_group":0,"term_taxonomy_id":777832,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"}],"category_data":[{"term_id":23851,"name":"Data Management","slug":"data-management","term_group":0,"term_taxonomy_id":23851,"taxonomy":"category","description":"","parent":0,"count":920,"filter":"raw"}],"product_data":[{"term_id":36561,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":36561,"taxonomy":"product","description":"","parent":0,"count":2035,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=arcgis-pro","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2642312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/365172"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2642312"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2642312\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2642312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2642312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2642312"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2642312"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2642312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}