{"id":334082,"date":"2018-10-15T08:00:53","date_gmt":"2018-10-15T15:00:53","guid":{"rendered":"http:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=334082"},"modified":"2024-11-11T12:36:40","modified_gmt":"2024-11-11T20:36:40","slug":"functions-arent-fields-use-arcade-instead","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead","title":{"rendered":"Functions aren&#8217;t fields; use Arcade instead"},"author":6561,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[777102,22941],"tags":[32521,30111,27491],"industry":[],"product":[36831,36601],"class_list":["post-334082","blog","type-blog","status-publish","format-standard","hentry","category-arcade","category-mapping","tag-arcade-expressions","tag-data-visualization","tag-jsapi4","product-js-api-arcgis","product-developers"],"acf":{"short_description":"This post describes how you can re-write renderers using Arcade expressions instead of JavaScript functions.","flexible_content":[{"acf_fc_layout":"content","content":"<p>As of <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/guide\/release-notes\/index.html\">version 4.9<\/a> of the <a href=\"https:\/\/developers.arcgis.com\/javascript\/index.html\">ArcGIS API for JavaScript<\/a> (JS API), we removed support for rendering feature layers based on the result of a JavaScript function. In lieu of JavaScript functions we added support for <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/guide\/arcade\/index.html#visualization\">Arcade expressions<\/a> in renderers. <\/p>\n<h2>Background<\/h2>\n<p>Prior to 4.9, the JS API allowed developers to pass a JavaScript function to the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-renderers-UniqueValueRenderer.html#field\">field<\/a> property of a <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-renderers-Renderer.html\">renderer<\/a> and any <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-renderers-support-AuthoringInfo.html#visualVariables\">visual variable<\/a>. This provided the developer with the flexibility to calculate new values client-side and render the layer based on those values. This was great for the following reasons:<\/p>\n<ul>\n<li>It allowed you to calculate new values based on existing field values in your layer. For example, it made sense where service fields couldn&#8217;t be modified, or you didn&#8217;t own the layer, but wanted to calculate new data values based on values already present in the layer.<\/li>\n<li>It allowed you to use values provided by end users via UI elements (e.g. input elements, select elements, HTML range sliders, etc.). One example of this is updating an above-and-below visualization based on the value of an HTML range slider moved by the user.<\/li>\n<li>It allowed you to perform calculations for data not present in your layer. For example, you can query features from other layers and perform geometry operations on them within the renderer\u2019s field function to visualize the results of any spatial operation. This workflow isn&#8217;t currently supported in Arcade, but will be soon.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/js-functions\/\">Check out the following app<\/a>, which visualizes a FeatureLayer representing political boundaries in mainland China using a function set on the field property of the layer&#8217;s renderer. This is an above-and-below visualization, which categorizes each feature based on whether the percentage of the population without education is above or below the value of the feature selected by the user.<\/p>\n"},{"acf_fc_layout":"storymap","title":"","description":"","static":false,"storymap_url":"<a href=\"https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/js-functions\/\">https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/js-functions\/<\/a>"},{"acf_fc_layout":"content","content":"<p>While powerful, <em><strong>renderers that use JavaScript functions as fields cannot be persisted and used for visualizations across the ArcGIS platform<\/strong><\/em>. There are a couple of reasons for this:<\/p>\n<ul>\n<li>Attempting to save a renderer with a JavaScript function for reuse in other web apps would introduce security vulnerabilities in the apps loading the layer. It would open the door for malicious code to be executed within the renderer function.<\/li>\n<li>The JS API is designed for consumption in web browsers. Other clients in the ArcGIS platform, such as ArcGIS Pro and the ArcGIS Runtime SDKs cannot display renderers that depend on JavaScript to return values for a data-driven visualization because JavaScript doesn&#8217;t execute in those environments.<\/li>\n<\/ul>\n<p>For these reasons, you were limited to using JavaScript functions as fields in renderers and visual variables in standalone web apps.<\/p>\n<h2>Arcade: A better approach<\/h2>\n<p>In December 2016, <a href=\"https:\/\/developers.arcgis.com\/arcade\/guide\/index.html\">Esri introduced Arcade<\/a> \u2013 an expression language for returning new data values client-side. Arcade can be used to calculate and return values for <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/guide\/arcade\/index.html#labeling\">labels<\/a>, <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/guide\/arcade\/index.html#popups\">popups<\/a>, and <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/guide\/arcade\/index.html#visualization\">renderers<\/a> based on logic defined in an expression.<\/p>\n<p>Several people have already written on various ways Arcade is and has been used for visualization in the JS API. Check out the following blogs to learn more about this.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/using-arcade-expressions-in-web-apps\/\">Using Arcade expressions in web apps&#8221;>Using Arcade expressions in web apps<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-online\/mapping\/use-arcade-expressions-to-map-your-ideas\/\">Use Arcade Expressions to Map Your Ideas<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/generate-arcade-expressions-for-data-exploration-web-apps\/\">Generate Arcade expressions for data exploration web apps<\/a><\/li>\n<\/ul>\n<p>Arcade provides many benefits that the JavaScript functions could not guarantee, including the following:<\/p>\n<ul>\n<li><strong>Security<\/strong>. It does not have the same security vulnerabilities as JavaScript because it can only be executed in intended <a href=\"https:\/\/developers.arcgis.com\/arcade\/guide\/profiles\/\">profiles<\/a> specifically designed for parsing and running Arcade syntax.<\/li>\n<li><strong>Persistence<\/strong> throughout the ArcGIS platform. This means you can author and save an Arcade expression for a layer&#8217;s renderer within a web app or ArcGIS Online, and the same syntax will be understood and executed properly in other web apps, mobile apps created with the Runtime SDKs, and ArcGIS Pro.<\/li>\n<\/ul>\n<p><strong>Because Arcade expressions allow you to create the same visualizations as those created using JavaScript functions, we are confident in removing support for JavaScript functions as fields in renderers.<\/strong><\/p>\n<h2>Migrating JavaScript functions to Arcade expressions<\/h2>\n<p>If you&#8217;ve already created renderers with JavaScript functions, then you were likely familiar with the limitations.<\/p>\n<p>So why take away this support? What about the benefits mentioned above? What if I want to create a visualization based on user input? What about access to outside features, or geometry operations?<\/p>\n<p>The short answer to these questions is that Arcade allows you to create these visualizations.<\/p>\n<p>Let&#8217;s check out the <a href=\"https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/js-functions\/\">example above<\/a> to learn how to migrate a renderer from using a JavaScript function as a field to using an Arcade expression. This example uses a JavaScript function in the field property of a <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-renderers-UniqueValueRenderer.html\">UniqueValueRenderer<\/a>.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":334822,"id":334822,"title":"js-snippet-uvr","filename":"js-snippet-uvr.png","filesize":53774,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\/js-snippet-uvr","alt":"","author":"6561","description":"","caption":"","name":"js-snippet-uvr","status":"inherit","uploaded_to":334082,"date":"2018-10-02 16:17:18","modified":"2018-10-02 16:17:18","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":703,"height":381,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","thumbnail-width":213,"thumbnail-height":115,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","medium-width":464,"medium-height":251,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","medium_large-width":703,"medium_large-height":381,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","large-width":703,"large-height":381,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","1536x1536-width":703,"1536x1536-height":381,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","2048x2048-width":703,"2048x2048-height":381,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","card_image-width":703,"card_image-height":381,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-snippet-uvr.png","wide_image-width":703,"wide_image-height":381}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p><code>valueFunction<\/code> is the name of a function that takes an <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-Graphic.html\">esri\/Graphic<\/a> instance as a parameter. This function executes for each feature at the time of rendering. For that reason, it is important to keep the code in this function light. Adding heavier code will come with a performance cost to the application.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":334872,"id":334872,"title":"valueFunction","filename":"valueFunction.png","filesize":68117,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\/valuefunction","alt":"","author":"6561","description":"","caption":"","name":"valuefunction","status":"inherit","uploaded_to":334082,"date":"2018-10-02 16:19:27","modified":"2018-10-02 16:19:27","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":824,"height":404,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","thumbnail-width":213,"thumbnail-height":104,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","medium-width":464,"medium-height":227,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","medium_large-width":768,"medium_large-height":377,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","large-width":824,"large-height":404,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","1536x1536-width":824,"1536x1536-height":404,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","2048x2048-width":824,"2048x2048-height":404,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","card_image-width":824,"card_image-height":404,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/valueFunction.png","wide_image-width":824,"wide_image-height":404}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Each time the user clicks a feature, the app updates the value of the <code>value<\/code> variable to the value of the clicked feature, causing the renderer to change.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":334892,"id":334892,"title":"js-update-value","filename":"js-update-value.png","filesize":30624,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\/js-update-value","alt":"","author":"6561","description":"","caption":"","name":"js-update-value","status":"inherit","uploaded_to":334082,"date":"2018-10-02 16:20:44","modified":"2018-10-02 16:20:44","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":484,"height":213,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","thumbnail-width":213,"thumbnail-height":94,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","medium-width":464,"medium-height":204,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","medium_large-width":484,"medium_large-height":213,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","large-width":484,"large-height":213,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","1536x1536-width":484,"1536x1536-height":213,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","2048x2048-width":484,"2048x2048-height":213,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","card_image-width":484,"card_image-height":213,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-update-value.png","wide_image-width":484,"wide_image-height":213}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>I used the 4.9 version of the JS API to create the exact same app. But this time I pass an Arcade expression to the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-renderers-UniqueValueRenderer.html#valueExpression\">valueExpression<\/a> property of the renderer.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":334972,"id":334972,"title":"arcade-uvr","filename":"arcade-uvr-1.png","filesize":37904,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\/arcade-uvr-2","alt":"","author":"6561","description":"","caption":"","name":"arcade-uvr-2","status":"inherit","uploaded_to":334082,"date":"2018-10-02 16:38:45","modified":"2018-10-02 16:38:45","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":586,"height":296,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","thumbnail-width":213,"thumbnail-height":108,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","medium-width":464,"medium-height":234,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","medium_large-width":586,"medium_large-height":296,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","large-width":586,"large-height":296,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","1536x1536-width":586,"1536x1536-height":296,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","2048x2048-width":586,"2048x2048-height":296,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","card_image-width":586,"card_image-height":296,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-uvr-1.png","wide_image-width":586,"wide_image-height":296}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The <code>createArcade<\/code> function returns an Arcade expression that determines whether the feature&#8217;s value is similar, above, or below the input value. Note how I use <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Template_literals\">template literals<\/a> to access the value of the selected feature and insert it to the Arcade expression. This same technique can be used to get user input from other DOM elements.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":335002,"id":335002,"title":"create-arcade","filename":"create-arcade.png","filesize":58286,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\/create-arcade","alt":"","author":"6561","description":"","caption":"","name":"create-arcade","status":"inherit","uploaded_to":334082,"date":"2018-10-02 16:40:14","modified":"2018-10-02 16:40:14","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":752,"height":354,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","thumbnail-width":213,"thumbnail-height":100,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","medium-width":464,"medium-height":218,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","medium_large-width":752,"medium_large-height":354,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","large-width":752,"large-height":354,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","1536x1536-width":752,"1536x1536-height":354,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","2048x2048-width":752,"2048x2048-height":354,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","card_image-width":752,"card_image-height":354,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/create-arcade.png","wide_image-width":752,"wide_image-height":354}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Since the clicked, or selected value, is a constant in the Arcade expression, the expression must be re-created with the new value and reset on the renderer. Once you update the renderer on the layer, the layer&#8217;s layer view will automatically refresh and update the visualization appropriately.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":335012,"id":335012,"title":"arcade-update-renderer","filename":"arcade-update-renderer.png","filesize":74290,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\/arcade-update-renderer","alt":"","author":"6561","description":"","caption":"","name":"arcade-update-renderer","status":"inherit","uploaded_to":334082,"date":"2018-10-02 16:43:21","modified":"2018-10-02 16:43:21","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":858,"height":320,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","thumbnail-width":213,"thumbnail-height":79,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","medium-width":464,"medium-height":173,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","medium_large-width":768,"medium_large-height":286,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","large-width":858,"large-height":320,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","1536x1536-width":858,"1536x1536-height":320,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","2048x2048-width":858,"2048x2048-height":320,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","card_image-width":826,"card_image-height":308,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/arcade-update-renderer.png","wide_image-width":858,"wide_image-height":320}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>Now the final app looks like the following.<\/p>\n"},{"acf_fc_layout":"storymap","title":"","description":"","static":false,"storymap_url":"<a href=\"https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/updating-arcade\/\">https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/updating-arcade\/<\/a>"},{"acf_fc_layout":"content","content":"<p>Keep in mind that while this version of the app doesn&#8217;t expose any functional differences from the previous version, it does redraw features more slowly than the 4.8 version of the app. We will improve performance in this regard at a future release.<\/p>\n<h2>Coming soon<\/h2>\n<p>In past conferences, such as the 2018 Esri User Conference, I\u2019ve demonstrated other use cases that required using a JavaScript function as a field in a renderer. One such case is <a href=\"https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/airspace-encroachment\/\">the app below<\/a>, which visualizes restricted air space in the Gulf of Mexico based on their risk for encroachment by proposed oil rig locations. As you change the height of the proposed projects, you will see the renderer update accordingly. <a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/build-3d-web-apps-with-your-2d-data\/\">Read this blog post<\/a> to learn more about how a similar app was created.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":334642,"id":334642,"title":"airspace-encroachment","filename":"airspace-encroachment.png","filesize":92945,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\/airspace-encroachment","alt":"","author":"6561","description":"","caption":"","name":"airspace-encroachment","status":"inherit","uploaded_to":334082,"date":"2018-10-01 23:24:52","modified":"2018-10-01 23:24:52","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":1009,"height":559,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","thumbnail-width":213,"thumbnail-height":118,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","medium-width":464,"medium-height":257,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","medium_large-width":768,"medium_large-height":425,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","large-width":1009,"large-height":559,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","1536x1536-width":1009,"1536x1536-height":559,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","2048x2048-width":1009,"2048x2048-height":559,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","card_image-width":826,"card_image-height":458,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/airspace-encroachment.png","wide_image-width":1009,"wide_image-height":559}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/ekenes.github.io\/esri-ts-samples\/visualization\/airspace-encroachment\/"},{"acf_fc_layout":"content","content":"<p>The JavaScript function referenced in this layer&#8217;s renderer uses the height obtained from a <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-layers-CSVLayer.html\">CSVLayer<\/a> or as determined by the user along with the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-geometry-geometryEngine.html\">geometry engine<\/a> to see if the features intersect buffers of the project areas.<\/p>\n<p>We will add support for all <a href=\"https:\/\/developers.arcgis.com\/arcade\/function-reference\/geometry_functions\/\">Arcade geometry functions<\/a> soon, making it possible to use Arcade for this use case with the 4.x JS API. Note that version 3.26 of the JS API already supports Arcade\u2019s geometry functions, so you can use that API if your visualizations require them now.<\/p>\n"}],"authors":[{"ID":6561,"user_firstname":"Kristian","user_lastname":"Ekenes","nickname":"Kristian Ekenes","user_nicename":"kekenes","display_name":"Kristian Ekenes","user_email":"KEkenes@esri.com","user_url":"https:\/\/github.com\/ekenes","user_registered":"2018-03-02 00:18:32","user_description":"Kristian Ekenes is a Principal Product Engineer at Esri specializing in data visualization on the web. He works on the ArcGIS Maps SDK for JavaScript, ArcGIS Arcade, and Map Viewer in ArcGIS Online. Kristian's work focuses on researching and developing new and innovative data visualization capabilities of geospatial data in web maps, Arcade integration in web maps, and applications of generative AI assistants in web maps. Prior to joining Esri, he worked as a GIS Specialist for an environmental consulting company. Kristian has degrees from Brigham Young University and Arizona State University.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/ekenes-zurich-213x200.png' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"related_articles":[{"ID":74871,"post_author":"6561","post_date":"2017-01-10 05:00:33","post_date_gmt":"2017-01-10 05:00:33","post_content":"","post_title":"Using Arcade expressions in web apps","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"using-arcade-expressions-in-web-apps","to_ping":"","pinged":"","post_modified":"2024-11-11 12:40:25","post_modified_gmt":"2024-11-11 20:40:25","post_content_filtered":"","post_parent":0,"guid":"http:\/\/www.esri.com\/arcgis-blog\/products\/product\/uncategorized\/using-arcade-expressions-in-web-apps\/","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":199072,"post_author":"6561","post_date":"2018-06-05 08:00:08","post_date_gmt":"2018-06-05 08:00:08","post_content":"","post_title":"Generate Arcade expressions for data exploration web apps","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"generate-arcade-expressions-for-data-exploration-web-apps","to_ping":"","pinged":"","post_modified":"2024-11-11 12:37:33","post_modified_gmt":"2024-11-11 20:37:33","post_content_filtered":"","post_parent":0,"guid":"http:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=199072","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":321742,"post_author":"6561","post_date":"2018-10-01 08:00:52","post_date_gmt":"2018-10-01 15:00:52","post_content":"","post_title":"Generating Arcade expressions: what Smart Mapping does for you","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"generating-arcade-expressions-what-smart-mapping-does-for-you","to_ping":"","pinged":"","post_modified":"2024-11-11 12:37:22","post_modified_gmt":"2024-11-11 20:37:22","post_content_filtered":"","post_parent":0,"guid":"http:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=321742","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-functions-card.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-functions-banner.png"},"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>Functions aren&#039;t fields; use Arcade instead<\/title>\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\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Functions aren&#039;t fields; use Arcade instead\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\" \/>\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=\"2024-11-11T20:36:40+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\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\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\"},\"author\":{\"name\":\"Kristian Ekenes\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5469f723fbfb78138efbb1da56e6aa9b\"},\"headline\":\"Functions aren&#8217;t fields; use Arcade instead\",\"datePublished\":\"2018-10-15T15:00:53+00:00\",\"dateModified\":\"2024-11-11T20:36:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"arcade expressions\",\"data visualization\",\"jsapi4\"],\"articleSection\":[\"Arcade\",\"Mapping\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\",\"name\":\"Functions aren't fields; use Arcade instead\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2018-10-15T15:00:53+00:00\",\"dateModified\":\"2024-11-11T20:36:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Functions aren&#8217;t fields; use Arcade instead\"}]},{\"@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\/5469f723fbfb78138efbb1da56e6aa9b\",\"name\":\"Kristian Ekenes\",\"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\/2021\/10\/ekenes-zurich-213x200.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/ekenes-zurich-213x200.png\",\"caption\":\"Kristian Ekenes\"},\"description\":\"Kristian Ekenes is a Principal Product Engineer at Esri specializing in data visualization on the web. He works on the ArcGIS Maps SDK for JavaScript, ArcGIS Arcade, and Map Viewer in ArcGIS Online. Kristian's work focuses on researching and developing new and innovative data visualization capabilities of geospatial data in web maps, Arcade integration in web maps, and applications of generative AI assistants in web maps. Prior to joining Esri, he worked as a GIS Specialist for an environmental consulting company. Kristian has degrees from Brigham Young University and Arizona State University.\",\"sameAs\":[\"https:\/\/github.com\/ekenes\",\"https:\/\/www.linkedin.com\/in\/kristian-ekenes\/\",\"https:\/\/x.com\/kekenes\"],\"gender\":\"male\",\"jobTitle\":\"Principal Product Engineer\",\"worksFor\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/kekenes\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Functions aren't fields; use Arcade instead","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\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead","og_locale":"en_US","og_type":"article","og_title":"Functions aren't fields; use Arcade instead","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2024-11-11T20:36:40+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead"},"author":{"name":"Kristian Ekenes","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5469f723fbfb78138efbb1da56e6aa9b"},"headline":"Functions aren&#8217;t fields; use Arcade instead","datePublished":"2018-10-15T15:00:53+00:00","dateModified":"2024-11-11T20:36:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead"},"wordCount":7,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["arcade expressions","data visualization","jsapi4"],"articleSection":["Arcade","Mapping"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead","name":"Functions aren't fields; use Arcade instead","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2018-10-15T15:00:53+00:00","dateModified":"2024-11-11T20:36:40+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/functions-arent-fields-use-arcade-instead#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Functions aren&#8217;t fields; use Arcade instead"}]},{"@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\/5469f723fbfb78138efbb1da56e6aa9b","name":"Kristian Ekenes","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\/2021\/10\/ekenes-zurich-213x200.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/ekenes-zurich-213x200.png","caption":"Kristian Ekenes"},"description":"Kristian Ekenes is a Principal Product Engineer at Esri specializing in data visualization on the web. He works on the ArcGIS Maps SDK for JavaScript, ArcGIS Arcade, and Map Viewer in ArcGIS Online. Kristian's work focuses on researching and developing new and innovative data visualization capabilities of geospatial data in web maps, Arcade integration in web maps, and applications of generative AI assistants in web maps. Prior to joining Esri, he worked as a GIS Specialist for an environmental consulting company. Kristian has degrees from Brigham Young University and Arizona State University.","sameAs":["https:\/\/github.com\/ekenes","https:\/\/www.linkedin.com\/in\/kristian-ekenes\/","https:\/\/x.com\/kekenes"],"gender":"male","jobTitle":"Principal Product Engineer","worksFor":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/author\/kekenes"}]}},"text_date":"October 15, 2018","author_name":"Kristian Ekenes","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/kekenes","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/10\/js-functions-banner.png","primary_product":"ArcGIS Maps SDK for JavaScript","tag_data":[{"term_id":32521,"name":"arcade expressions","slug":"arcade-expressions","term_group":0,"term_taxonomy_id":32521,"taxonomy":"post_tag","description":"","parent":0,"count":27,"filter":"raw"},{"term_id":30111,"name":"data visualization","slug":"data-visualization","term_group":0,"term_taxonomy_id":30111,"taxonomy":"post_tag","description":"","parent":0,"count":97,"filter":"raw"},{"term_id":27491,"name":"jsapi4","slug":"jsapi4","term_group":0,"term_taxonomy_id":27491,"taxonomy":"post_tag","description":"","parent":0,"count":111,"filter":"raw"}],"category_data":[{"term_id":777102,"name":"Arcade","slug":"arcade","term_group":0,"term_taxonomy_id":777102,"taxonomy":"category","description":"","parent":0,"count":98,"filter":"raw"},{"term_id":22941,"name":"Mapping","slug":"mapping","term_group":0,"term_taxonomy_id":22941,"taxonomy":"category","description":"","parent":0,"count":2689,"filter":"raw"}],"product_data":[{"term_id":36831,"name":"ArcGIS Maps SDK for JavaScript","slug":"js-api-arcgis","term_group":0,"term_taxonomy_id":36831,"taxonomy":"product","description":"","parent":36601,"count":362,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":763,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=js-api-arcgis","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/334082","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\/6561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=334082"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/334082\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=334082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=334082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=334082"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=334082"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=334082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}