{"id":830171,"date":"2020-04-27T09:00:42","date_gmt":"2020-04-27T16:00:42","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=830171"},"modified":"2020-04-23T16:18:49","modified_gmt":"2020-04-23T23:18:49","slug":"mapping-large-datasets-on-the-web","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web","title":{"rendered":"Mapping large datasets on the web"},"author":6561,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[22941],"tags":[34601,30111,315102,626691],"industry":[],"product":[36831,36601],"class_list":["post-830171","blog","type-blog","status-publish","format-standard","hentry","category-mapping","tag-data-exploration","tag-data-visualization","tag-oceans","tag-spilhaus","product-js-api-arcgis","product-developers"],"acf":{"short_description":"Mapping large amounts of data on the web has always been a challenge. Learn techniques you can use to improve performance with large datasets.","flexible_content":[{"acf_fc_layout":"content","content":"<p>At the Esri 2020 Developer Summit plenary I presented a web app, <a href=\"https:\/\/ekenes.github.io\/conferences\/ds-2020\/plenary\/one-ocean\/index.html\">One Ocean<\/a>, which allows you to interactively explore data from Esri\u2019s open <a href=\"https:\/\/www.esri.com\/en-us\/about\/science\/ecological-marine-units\/overview\">Ecological Marine Unit<\/a> (EMU) dataset. This app is one example of how you can prepare a massive dataset for data exploration in the browser using the <a href=\"https:\/\/developers.arcgis.com\/javascript\/\">ArcGIS API for JavaScript<\/a> (ArcGIS JS API).<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830301,"id":830301,"title":"app-preview","filename":"app-preview-1.jpg","filesize":226696,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1.jpg","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/app-preview-2","alt":"Ocean currents and temperature at 5m below the sea surface.","author":"6561","description":"","caption":"One Ocean allows you to explore ocean temperature and salinity at various sea depths.","name":"app-preview-2","status":"inherit","uploaded_to":830171,"date":"2020-04-21 22:07:05","modified":"2020-04-21 22:08:03","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":1397,"height":797,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1-213x200.jpg","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1.jpg","medium-width":457,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1.jpg","medium_large-width":768,"medium_large-height":438,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1.jpg","large-width":1397,"large-height":797,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1.jpg","1536x1536-width":1397,"1536x1536-height":797,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1.jpg","2048x2048-width":1397,"2048x2048-height":797,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1-815x465.jpg","card_image-width":815,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/app-preview-1.jpg","wide_image-width":1397,"wide_image-height":797}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/ekenes.github.io\/conferences\/ds-2020\/plenary\/one-ocean\/index.html"},{"acf_fc_layout":"content","content":"<p>The app allows the user to explore temperature, salinity, direction, and velocity at various depths throughout the world&#8217;s ocean. It renders the data in the <a href=\"https:\/\/storymaps.arcgis.com\/stories\/756bcae18d304a1eac140f19f4d5cb3d\">Spilhaus projection<\/a>, which displays what we typically consider multiple oceans as one continuous body of water.<\/p>\n"},{"acf_fc_layout":"content","content":"<p>You can view the five-minute demo of this app as it was presented at the Developer Summit in the video below.<\/p>\n"},{"acf_fc_layout":"youtube","start_time":"0","end_time":"","youtube_video_url":"<iframe title=\"Custom Web Applications\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/TE3fIN2I3eQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>"},{"acf_fc_layout":"content","content":"<p>Jeremy Bartley and I recorded a one hour Developer Summit virtual session, <em>Best Practices for Building Web Apps that Visualize Large Datasets<\/em>, in which we discuss and demonstrate how to optimize large datasets for web applications. Check out the <a href=\"https:\/\/www.youtube.com\/watch?v=n4Y0qnbqfMg\">video<\/a> below.<\/p>\n"},{"acf_fc_layout":"youtube","start_time":"0","end_time":"","youtube_video_url":"<iframe title=\"Best Practices for Building Web Apps that Visualize Large Datasets [2020]\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/n4Y0qnbqfMg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>"},{"acf_fc_layout":"content","content":"<p>You can also access the session <a href=\"https:\/\/ekenes.github.io\/conferences\/ds-2020\/large-data\/\">slides and demos<\/a> in my <a href=\"https:\/\/ekenes.github.io\/conferences\/ds-2020\/\">Dev Summit 2020 GitHub repo<\/a>. This blog will highlight some of the steps that went into creating the One Ocean app to demonstrate the principles Jeremy and I discussed in the session above.<\/p>\n<h2>Get to know your data<\/h2>\n<p>I&#8217;ve been interested in the EMU data since it was made available to the public a few years ago. In fact, anyone can freely <a href=\"https:\/\/esri.maps.arcgis.com\/home\/group.html?id=6c78a5125d3244f38d1bc732ef0ee743#overview\">download the full dataset<\/a> as an ArcGIS Pro package. <\/p>\n<p>Upon downloading the package, I came to the daunting realization that I was dealing with a massive dataset \u2013 a 4 GB geodatabase containing nearly 52 million points. <\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830341,"id":830341,"title":"emu-details-scream","filename":"emu-details-scream.jpg","filesize":52886,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream.jpg","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/emu-details-scream","alt":"An item details page in ArcGIS Online showing a scream emoji next to the size of the data (4GB).","author":"6561","description":"","caption":"4 GB is too much data to load in the browser. Additional processing is required to explore it in a meaningful way.","name":"emu-details-scream","status":"inherit","uploaded_to":830171,"date":"2020-04-21 22:37:14","modified":"2020-04-21 22:39:51","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":939,"height":625,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream-213x200.jpg","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream.jpg","medium-width":392,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream.jpg","medium_large-width":768,"medium_large-height":511,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream.jpg","large-width":939,"large-height":625,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream.jpg","1536x1536-width":939,"1536x1536-height":625,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream.jpg","2048x2048-width":939,"2048x2048-height":625,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream-699x465.jpg","card_image-width":699,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/emu-details-scream.jpg","wide_image-width":939,"wide_image-height":625}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/esri.maps.arcgis.com\/home\/group.html?id=6c78a5125d3244f38d1bc732ef0ee743#overview"},{"acf_fc_layout":"content","content":"<p>These are the key points I learned prior to processing it:<\/p>\n<ul>\n<li>The data is represented as 52 million points in a single layer<\/li>\n<li>It requires 4 GB of data<\/li>\n<li>Each point is located at every \u00bc degree of latitude\/longitude<\/li>\n<li>Up to 102 points are stacked at each location (from sea surface to ~5,000m depth)<\/li>\n<li>There are 12 attributes per point (temperature, salinity, phosphate, oxygen, silicates, EMU cluster, etc.)<\/li>\n<\/ul>\n<p>Since data of that size is too large to work with in the browser, Jeremy and I brainstormed ways to work with it in a meaningful way.<\/p>\n<h2>Data processing<\/h2>\n<p>Users frequently ask about the limit for the number of points or features the ArcGIS JS API can render in a web application. Ultimately, it depends on a number of factors: the device, the browser, the speed of the internet connection, network latency, etc. But 4 GB of data is too large in any scenario.<\/p>\n<p>Our goal was to reduce the size to be as small as possible without compromising the story or the desired experience. That involved processing our data using the following methods:<\/p>\n<ul>\n<li><a href=\"#table-pivot\">Table pivot<\/a><\/li>\n<li><a href=\"#geometry-thinning\">Geometry thinning<\/a><\/li>\n<li><a href=\"#attribute-thinning\">Attribute thinning<\/a><\/li>\n<\/ul>\n<p><a name=\"table-pivot\"><\/a><\/p>\n<h3>Table pivot<\/h3>\n<p>Our first order of business was to reduce the number of rows in the table. Since the original layer has up to 102 points (or rows) at each x\/y location, we felt we could flatten the table to one row for each x\/y coordinate. <\/p>\n<p>Preparing all the attribute data for each geometry in a single row allows the ArcGIS JS API to update the underlying data values driving the visual properties of the renderer at up to 60 fps without reprocessing geometries on the GPU. This prevents flashing when the renderer updates with new data.<\/p>\n<p>The goal was to take a table that looked like this:<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":835801,"id":835801,"title":"Screen Shot 2020-04-23 at 1.59.24 PM","filename":"Screen-Shot-2020-04-23-at-1.59.24-PM.png","filesize":39729,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/screen-shot-2020-04-23-at-1-59-24-pm","alt":"table with multiple rows representing data for the same geometry","author":"6561","description":"","caption":"A table recording temperature and salinity values at the same location at various depths. Rows with matching colors indicate duplicate x\/y locations with data values captured at various depths.","name":"screen-shot-2020-04-23-at-1-59-24-pm","status":"inherit","uploaded_to":830171,"date":"2020-04-23 21:06:20","modified":"2020-04-23 21:58:56","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":514,"height":217,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","medium-width":464,"medium-height":196,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","medium_large-width":514,"medium_large-height":217,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","large-width":514,"large-height":217,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","1536x1536-width":514,"1536x1536-height":217,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","2048x2048-width":514,"2048x2048-height":217,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","card_image-width":514,"card_image-height":217,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png","wide_image-width":514,"wide_image-height":217}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.24-PM.png"},{"acf_fc_layout":"content","content":"<p>And pivot it to a table with fewer rows (one unique row per location), but more columns&#8230;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":836011,"id":836011,"title":"Screen Shot 2020-04-23 at 3.00.27 PM","filename":"Screen-Shot-2020-04-23-at-3.00.27-PM.png","filesize":20332,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/screen-shot-2020-04-23-at-3-00-27-pm","alt":"table with two rows and multiple columns representing different attributes for each row","author":"6561","description":"","caption":"The flattened table has only one row per x\/y location and records each attribute value in a separate column for each depth level.","name":"screen-shot-2020-04-23-at-3-00-27-pm","status":"inherit","uploaded_to":830171,"date":"2020-04-23 22:00:51","modified":"2020-04-23 22:01:07","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":993,"height":73,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM-213x73.png","thumbnail-width":213,"thumbnail-height":73,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM.png","medium-width":464,"medium-height":34,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM.png","medium_large-width":768,"medium_large-height":56,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM.png","large-width":993,"large-height":73,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM.png","1536x1536-width":993,"1536x1536-height":73,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM.png","2048x2048-width":993,"2048x2048-height":73,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM-826x61.png","card_image-width":826,"card_image-height":61,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-3.00.27-PM.png","wide_image-width":993,"wide_image-height":73}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/Screen-Shot-2020-04-23-at-1.59.40-PM.png"},{"acf_fc_layout":"content","content":"<p>Conveniently, my colleague <a href=\"https:\/\/www.esri.com\/arcgis-blog\/author\/kvangraafeiland\/\">Keith VanGraafeiland<\/a> had already done this. By using a series of spatial joins in ArcGIS Pro, he was able to create a new layer with one point per x\/y location. Now our data looked like the following:<\/p>\n<ul>\n<li>The number of points was reduced to 677,109 features! Now the layer contained one row per x\/y location with fields for each attribute at each depth level.<\/li>\n<li>This introduced a new problem \u2013 Now the layer has 1,224 fields, or 102 fields for each variable for each depth level (e.g. temp_1, temp_2, temp_3, etc. ). In other words, the temperature at depth level 1, depth level 2, etc. at each location.<\/li>\n<\/ul>\n<p><a name=\"geometry-thinning\"><\/a><\/p>\n<h3>Geometry thinning<\/h3>\n<p>While the table pivot significantly reduced the number of points, 677,000 features is still too many for a global extent. Knowing each point was \u00bc degree apart, we experimented with thinning points to every \u00bd degree. <\/p>\n<p>We accomplished this using a <em>Select Layer By Attribute<\/em> operation in ArcGIS Pro with the SQL expression in the image below.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830411,"id":830411,"title":"sql","filename":"sql.jpg","filesize":49301,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/sql","alt":"The results of a select layer by attribute operation in ArcGIS Pro.","author":"6561","description":"","caption":"The SQL expression in the results of this tool show how to select points at every 1\/2 degree of latitude and longitude.","name":"sql","status":"inherit","uploaded_to":830171,"date":"2020-04-21 22:58:10","modified":"2020-04-21 22:59:21","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":800,"height":868,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql-213x200.jpg","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg","medium-width":241,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg","medium_large-width":768,"medium_large-height":833,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg","large-width":800,"large-height":868,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg","1536x1536-width":800,"1536x1536-height":868,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg","2048x2048-width":800,"2048x2048-height":868,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql-429x465.jpg","card_image-width":429,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg","wide_image-width":800,"wide_image-height":868}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/sql.jpg"},{"acf_fc_layout":"content","content":"<p>This reduced the number of points all the way down to 84,711 features. This resulted in a new layer symbolized with blue points in the image below.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830421,"id":830421,"title":"thinning","filename":"thinning.png","filesize":269591,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/thinning","alt":"EMU data points at every 1\/4 degree are orange. Every 1\/2 degree the points are blue","author":"6561","description":"","caption":"Orange points indicate the original 1\/4 degree locations of the EMU grid. The blue points show the results of the Select Layer by Attribute operation described above. The blue points were exported as a new layer.","name":"thinning","status":"inherit","uploaded_to":830171,"date":"2020-04-21 23:01:13","modified":"2020-04-23 22:04: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":1016,"height":685,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png","medium-width":387,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png","medium_large-width":768,"medium_large-height":518,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png","large-width":1016,"large-height":685,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png","1536x1536-width":1016,"1536x1536-height":685,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png","2048x2048-width":1016,"2048x2048-height":685,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning-690x465.png","card_image-width":690,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png","wide_image-width":1016,"wide_image-height":685}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/thinning.png"},{"acf_fc_layout":"content","content":"<p>While the data looks more coarse at this scale, the \u00bd degree resolution still works great at a worldwide extent.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830431,"id":830431,"title":"world-extent-84k","filename":"world-extent-84k.jpg","filesize":79614,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/world-extent-84k","alt":"Points located at every 1\/2 degree cover the world's ocean.","author":"6561","description":"","caption":"The EMU layer thinned to 1\/2 degree intervals at a worldwide scale. At this scale, the data still maintain good resolution.","name":"world-extent-84k","status":"inherit","uploaded_to":830171,"date":"2020-04-21 23:09:36","modified":"2020-04-21 23:11:23","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":819,"height":381,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k-213x200.jpg","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","medium-width":464,"medium-height":216,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","medium_large-width":768,"medium_large-height":357,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","large-width":819,"large-height":381,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","1536x1536-width":819,"1536x1536-height":381,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","2048x2048-width":819,"2048x2048-height":381,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","card_image-width":819,"card_image-height":381,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg","wide_image-width":819,"wide_image-height":381}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/world-extent-84k.jpg"},{"acf_fc_layout":"content","content":"<p><a name=\"attribute-thinning\"><\/a><\/p>\n<h3>Attribute thinning<\/h3>\n<p>Feature services are limited to 1,024 columns. So I removed about 300 fields to make the layer publishable at 960 fields.<\/p>\n<p>After publishing, I created a <a href=\"https:\/\/doc.arcgis.com\/en\/arcgis-online\/manage-data\/create-hosted-views.htm\">hosted Layer View<\/a> and limited the number of fields to only the attributes I was concerned with: temperature, salinity, direction, and velocity.<\/p>\n<p>After all the processing we were able to reduce the data to a manageable 84,711 points and 317 attributes. However, that many attributes for that many points still results in more than 311 MB of uncompressed data. <\/p>\n<p>Thanks to performance improvements made in the ArcGIS JS API and hosted and enterprise feature services over the last year, we can reduce that size down to 145 MB of compressed data. <\/p>\n<h2>How the ArcGIS JS API and ArcGIS Online improve web app performance<\/h2>\n<p>There are a number of things the ArcGIS JS API and ArcGIS Online do in tandem to improve the efficiency of rendering more data more efficiently in the browser. These can be viewed by opening your developer tools and inspecting the network traffic for the feature service queries.<\/p>\n<p>The image below shows an example of a query the ArcGIS JS API makes to a hosted ArcGIS Online feature service.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830451,"id":830451,"title":"query-params","filename":"query-params.png","filesize":113385,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/query-params","alt":"query parameters from a network request in the browser.","author":"6561","description":"","caption":"Query parameters from a feature tile request made in the One Ocean app.","name":"query-params","status":"inherit","uploaded_to":830171,"date":"2020-04-21 23:18:26","modified":"2020-04-21 23:19:19","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":1036,"height":874,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png","medium-width":309,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png","medium_large-width":768,"medium_large-height":648,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png","large-width":1036,"large-height":874,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png","1536x1536-width":1036,"1536x1536-height":874,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png","2048x2048-width":1036,"2048x2048-height":874,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params-551x465.png","card_image-width":551,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png","wide_image-width":1036,"wide_image-height":874}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/query-params.png"},{"acf_fc_layout":"content","content":"<p><strong>PBF<\/strong> \u2013 Data is requested in protocol binary format (PBF) to improve vertex encoding and therefore speed up drawing times.<\/p>\n<p><strong>outFields<\/strong> \u2013 The ArcGIS JS API only requests fields required for rendering plus any specifically requested by the developer. This can significantly reduce payload size, improving download speed. (In the One Ocean app I requested all fields for reasons mentioned in the <a href=\"#client-side\">Fast, client-side analytics<\/a> section below.<\/p>\n<p><strong>Quantization<\/strong> \u2013 Quantization parameters ensure the client only requests one vertex per pixel based on the view tolerance. The query in the image above indicates each pixel had an approximate size of 4.9 km. Vertices in the returned geometries are guaranteed to conform to that tolerance, except for point data. Since point geometries aren&#8217;t dropped from the response, quantization doesn&#8217;t make much of a difference in performance for the One Ocean app. However, it can have a major impact in reducing payload size for polygons and polyline geometries.<\/p>\n<p><strong>Tiled requests<\/strong> &#8211; The <code>resultType: tile<\/code> parameter is the API&#8217;s way of telling the server the query can be repeated in multiple clients and should therefore be cached as a feature tile. <\/p>\n<p>The responses for these requests will look like those the image below. Note the outlined columns.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":835901,"id":835901,"title":"network-traffic","filename":"network-traffic-1.png","filesize":71908,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/network-traffic-3","alt":"network requests made in the One Ocean app with some headers highlighted.","author":"6561","description":"","caption":"","name":"network-traffic-3","status":"inherit","uploaded_to":830171,"date":"2020-04-23 21:30:11","modified":"2020-04-23 21:30:26","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":859,"height":384,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png","medium-width":464,"medium-height":207,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png","medium_large-width":768,"medium_large-height":343,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png","large-width":859,"large-height":384,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png","1536x1536-width":859,"1536x1536-height":384,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png","2048x2048-width":859,"2048x2048-height":384,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1-826x369.png","card_image-width":826,"card_image-height":369,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png","wide_image-width":859,"wide_image-height":384}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/network-traffic-1.png"},{"acf_fc_layout":"content","content":"<p><strong>Content-Encoding<\/strong> \u2013 Data is compressed using <a href=\"https:\/\/github.com\/google\/brotli\">Brotli<\/a> compression for efficient data transfer.<\/p>\n<p><strong>Caching<\/strong> \u2013 The <code>x-cache: Hit from cloudfront<\/code> indicates the response comes from the CDN cache. The <code>x-esri-ftiles-cache-compress: true<\/code> indicates the response is cached as a feature tile on the server. ArcGIS Online takes advantage of several tiers of feature tile caching on the server and CDN (for public layers only). This reduces load on the server and underlying database, significantly improving performance. <a href=\"https:\/\/www.esri.com\/arcgis-blog\/author\/pbarker_esri\/\">Paul Barker<\/a> wrote an <a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/data-management\/data-management\/scalable-hosted-feature-layers-in-arcgis-online-tile-queries-and-response-caching\/\">excellent blog<\/a> detailing how this works.<\/p>\n<p>All of these concepts help improve the time it takes to load the data. This is evident in large layers where these improvements go a long way in improving performance.<\/p>\n<p><a name=\"client-side\"><\/a><\/p>\n<h2>Fast, client-side analytics<\/h2>\n<p>Despite those performance improvements, the One Ocean app still makes heavy queries, totaling up to 145 MB of data. That requires the user to wait about 30 seconds before they can use the app on a desktop browser (we chose to block mobile devices from loading the app because of the enormous size of the data). While 30 seconds is a long amount of time, the wait is worth it. Once all that data is loaded, you can explore authoritative data spanning the vast global ocean without the need for fancy software or an advanced knowledge of oceans. An ocean full of data is at your fingertips!<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830681,"id":830681,"title":"loading-icon","filename":"loading-icon.png","filesize":227962,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/loading-icon","alt":"loading icon","author":"6561","description":"The loading icon communicates that the initial load time is longer than expected.","caption":"Loading a whopping 145 MB of data takes some time, but exploring that amount of data with a smooth UX is worth the wait.","name":"loading-icon","status":"inherit","uploaded_to":830171,"date":"2020-04-22 01:10:09","modified":"2020-04-23 22:22:13","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":1060,"height":791,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon.png","medium-width":350,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon.png","medium_large-width":768,"medium_large-height":573,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon.png","large-width":1060,"large-height":791,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon.png","1536x1536-width":1060,"1536x1536-height":791,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon.png","2048x2048-width":1060,"2048x2048-height":791,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon-623x465.png","card_image-width":623,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/loading-icon.png","wide_image-width":1060,"wide_image-height":791}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>While the ArcGIS JS API dynamically requests data as needed by the renderer, I opted to request it all up front by setting the layer <code>outfields<\/code> to <code>[*]<\/code>. <\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">const<\/span> emuLayer = <span style=\"color: #333;font-weight: bold\">new<\/span> FeatureLayer({\r\n  portalItem: {\r\n    id: <span style=\"color: #d14\">\"9ff162e1ea1a4885acd8c4ceeab588a5\"<\/span>\r\n  },\r\n  outFields: [<span style=\"color: #d14\">\"*\"<\/span>]\r\n});\r\n<\/code><\/pre>\n<p>Even though this makes for a very long initial load time of just under 30 seconds, this allows the app to update the underlying data values driving the visual properties of the renderer without reprocessing geometries on the GPU or requesting additional attributes from the server. <\/p>\n<p>Every time the user explores the data by switching a variable or moving the depth slider, the renderer updates in the following way:<\/p>\n<details>\n<summary><strong>Click to show\/hide the code<\/strong><\/summary>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\">emuLayer.renderer = {\r\n  type: <span style=\"color: #d14\">\"simple\"<\/span>,\r\n  symbol: {\r\n    type: <span style=\"color: #d14\">\"web-style\"<\/span>,\r\n    name: <span style=\"color: #d14\">\"tear-pin-1\"<\/span>,\r\n    styleName: <span style=\"color: #d14\">\"Esri2DPointSymbolsStyle\"<\/span>\r\n  },\r\n  visualVariables: [{\r\n    type: <span style=\"color: #d14\">\"color\"<\/span>,\r\n    <span style=\"color: #998;font-style: italic\">\/\/ temp_1, temp_2, temp_3, etc<\/span>\r\n    field: <span style=\"color: #d14\">`temp_<span style=\"color: #333;font-weight: normal\">${getLevelFromDepth(depthSlider.values[0])}<\/span>`<\/span>,\r\n    stops: [\r\n      { value: <span style=\"color: #008080\">0<\/span>, color: <span style=\"color: #d14\">\"#1993ff\"<\/span> },\r\n      { value: <span style=\"color: #008080\">5<\/span>, color: <span style=\"color: #d14\">\"#2e6ca4\"<\/span> },\r\n      { value: <span style=\"color: #008080\">15<\/span>, color: <span style=\"color: #d14\">\"#403031\"<\/span> },\r\n      { value: <span style=\"color: #008080\">27<\/span>, color: <span style=\"color: #d14\">\"#a6242e\"<\/span> },\r\n      { value: <span style=\"color: #008080\">30<\/span>, color: <span style=\"color: #d14\">\"#ff2638\"<\/span> }\r\n    ]\r\n  }, {\r\n    type: <span style=\"color: #d14\">\"size\"<\/span>,\r\n    <span style=\"color: #998;font-style: italic\">\/\/ Velocity_1, Velocity_2, Velocity_3, etc<\/span>\r\n    field: <span style=\"color: #d14\">`Velocity_<span style=\"color: #333;font-weight: normal\">${getLevelFromDepth(depthSlider.values[0])}<\/span>`<\/span>,\r\n    minDataValue: <span style=\"color: #008080\">0<\/span>,\r\n    maxDataValue: <span style=\"color: #008080\">0.5<\/span>,\r\n    <span style=\"color: #998;font-style: italic\">\/\/ update size based on view scale<\/span>\r\n    minSize: {\r\n      type: <span style=\"color: #d14\">\"size\"<\/span>,\r\n      valueExpression: <span style=\"color: #d14\">\"$view.scale\"<\/span>,\r\n      stops: [\r\n        { value: <span style=\"color: #008080\">7812500<\/span>, size: <span style=\"color: #d14\">\"12px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">15625000<\/span>, size: <span style=\"color: #d14\">\"8px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">31250000<\/span>, size: <span style=\"color: #d14\">\"6px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">62500000<\/span>, size: <span style=\"color: #d14\">\"4px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">125000000<\/span>, size: <span style=\"color: #d14\">\"2px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">250000000<\/span>, size: <span style=\"color: #d14\">\"1px\"<\/span> }\r\n      ]\r\n    },\r\n    maxSize: {\r\n      type: <span style=\"color: #d14\">\"size\"<\/span>,\r\n      valueExpression: <span style=\"color: #d14\">\"$view.scale\"<\/span>,\r\n      stops: [\r\n        { value: <span style=\"color: #008080\">7812500<\/span>, size: <span style=\"color: #d14\">\"32px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">15625000<\/span>, size: <span style=\"color: #d14\">\"20px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">31250000<\/span>, size: <span style=\"color: #d14\">\"16px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">62500000<\/span>, size: <span style=\"color: #d14\">\"12px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">125000000<\/span>, size: <span style=\"color: #d14\">\"6px\"<\/span> },\r\n        { value: <span style=\"color: #008080\">250000000<\/span>, size: <span style=\"color: #d14\">\"4px\"<\/span> }\r\n      ]\r\n    }\r\n  }, {\r\n    type: <span style=\"color: #d14\">\"rotation\"<\/span>,\r\n    <span style=\"color: #998;font-style: italic\">\/\/ Direction_1, Direction_2, Direction_3, etc<\/span>\r\n    field: <span style=\"color: #d14\">`Direction_<span style=\"color: #333;font-weight: normal\">${getLevelFromDepth(depthSlider.values[0])}<\/span>`<\/span>,\r\n    rotationType: <span style=\"color: #d14\">\"geographic\"<\/span>\r\n  }]\r\n};\r\n<\/code><\/pre>\n<\/details>\n<p>Note the red outlines in the snippet below. It&#8217;s not the color and size properties that change with each slider update. Rather, it&#8217;s the attribute names driving the visualization that update. <\/p>\n"},{"acf_fc_layout":"image","image":{"ID":830511,"id":830511,"title":"highlighted-snippet","filename":"highlighted-snippet.png","filesize":58766,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/highlighted-snippet","alt":"JavaScript code highlighted in red showing where the data value is replaced each time the renderer updates.","author":"6561","description":"","caption":"","name":"highlighted-snippet","status":"inherit","uploaded_to":830171,"date":"2020-04-21 23:42:01","modified":"2020-04-21 23:42: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":495,"height":511,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png","medium-width":253,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png","medium_large-width":495,"medium_large-height":511,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png","large-width":495,"large-height":511,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png","1536x1536-width":495,"1536x1536-height":511,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png","2048x2048-width":495,"2048x2048-height":511,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet-450x465.png","card_image-width":450,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png","wide_image-width":495,"wide_image-height":511}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/highlighted-snippet.png"},{"acf_fc_layout":"content","content":"<p>Each slider value corresponds to a depth level used in the field names (e.g. <code>temp_1<\/code> indicates the temperature value for a point at the first depth level. <code>temp_2<\/code> is the temperature at the same location at the next depth level, etc.). For each slider value change, I simply update the renderer to point to each of the field names for the depth level indicated by the slider. <\/p>\n<p>Then the ArcGIS JS API takes over and quickly makes the update so we can see how temperature, salinity, current speed, and current direction change for each location at various depths of the world&#8217;s ocean.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":836131,"id":836131,"title":"current5","filename":"current5.png","filesize":425174,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/current5","alt":"Equatorial currents at 5m below the sea surface.","author":"6561","description":"","caption":"Equatorial currents at 5 meters below the sea surface.","name":"current5","status":"inherit","uploaded_to":830171,"date":"2020-04-23 22:51:06","modified":"2020-04-23 22:52:22","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":1332,"height":771,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5.png","medium-width":451,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5.png","medium_large-width":768,"medium_large-height":445,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5.png","large-width":1332,"large-height":771,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5.png","1536x1536-width":1332,"1536x1536-height":771,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5.png","2048x2048-width":1332,"2048x2048-height":771,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5-803x465.png","card_image-width":803,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current5.png","wide_image-width":1332,"wide_image-height":771}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current-5-scaled.jpg"},{"acf_fc_layout":"image","image":{"ID":836161,"id":836161,"title":"current95","filename":"current95.png","filesize":363264,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\/current95","alt":"Equatorial currents at 95 meters below the sea surface.","author":"6561","description":"","caption":"Equatorial currents at 95 meters below the sea surface. Notice how the same locations show colder water and slower currents moving in the opposite direction as those closer to the surface.","name":"current95","status":"inherit","uploaded_to":830171,"date":"2020-04-23 22:52:40","modified":"2020-04-23 22:53:04","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":1332,"height":769,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95.png","medium-width":452,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95.png","medium_large-width":768,"medium_large-height":443,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95.png","large-width":1332,"large-height":769,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95.png","1536x1536-width":1332,"1536x1536-height":769,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95.png","2048x2048-width":1332,"2048x2048-height":769,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95-805x465.png","card_image-width":805,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current95.png","wide_image-width":1332,"wide_image-height":769}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/current-95m-scaled.jpg"},{"acf_fc_layout":"content","content":"<h2>Wrap up<\/h2>\n<p>There&#8217;s a lot the ArcGIS JS API and ArcGIS Online do to help improve web app performance. But that doesn&#8217;t excuse the app developer from doing what they can to reduce the size of large datasets in the browser. <\/p>\n<p>Remember to do the following to reduce the size of your data if possible: <\/p>\n<ul>\n<li>Familiarize yourself with the data<\/li>\n<li>Preprocess the data (e.g. table pivots) to leverage powerful JS API capabilities<\/li>\n<li>Thin the geometries<\/li>\n<li>Thin the attributes<\/li>\n<\/ul>\n<p>Here are some related resources to check out:<\/p>\n<ul>\n<li><a href=\"https:\/\/one-ocean-esrioceans.hub.arcgis.com\/\">One Ocean Hub<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/data-management\/data-management\/scalable-hosted-feature-layers-in-arcgis-online-tile-queries-and-response-caching\/\">Scalable hosted feature layers in ArcGIS Online: Tile queries and response caching<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/about\/newsroom\/arcuser\/enhancements-for-mapping-more-data-more-efficiently-in-the-browser\/\">ArcUser &#8211; Enhancements for Mapping More Data, More Efficiently in the Browser<\/a><\/li>\n<li><a href=\"https:\/\/ekenes.github.io\/conferences\/ds-2020\/large-data\/\">Developer Summit slides and demos<\/a><\/li>\n<\/ul>\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":827321,"post_author":"4271","post_date":"2020-04-24 11:36:45","post_date_gmt":"2020-04-24 18:36:45","post_content":"","post_title":"DevSummit 2020 \u2013 ArcGIS API for JavaScript Recordings Available!","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"arcgis-api-for-javascript-devsummit-2020-videos-available","to_ping":"","pinged":"","post_modified":"2020-04-24 12:22:51","post_modified_gmt":"2020-04-24 19:22:51","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=827321","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":80901,"post_author":"6981","post_date":"2024-10-03 12:24:29","post_date_gmt":"2024-10-03 19:24:29","post_content":"","post_title":"Scalable hosted feature layers in ArcGIS Online: Tile queries and response caching","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"scalable-hosted-feature-layers-in-arcgis-online-tile-queries-and-response-caching","to_ping":"","pinged":"","post_modified":"2025-07-10 13:23:32","post_modified_gmt":"2025-07-10 20:23:32","post_content_filtered":"","post_parent":0,"guid":"http:\/\/www.esri.com\/arcgis-blog\/products\/product\/uncategorized\/scalable-hosted-feature-layers-in-arcgis-online-tile-queries-and-response-caching\/","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":712232,"post_author":"6561","post_date":"2020-01-29 08:30:02","post_date_gmt":"2020-01-29 16:30:02","post_content":"","post_title":"How and why to adjust symbol size by scale in web maps","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"how-and-why-to-adjust-size-by-scale-in-web-maps","to_ping":"","pinged":"","post_modified":"2020-01-28 17:15:57","post_modified_gmt":"2020-01-29 01:15:57","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=712232","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/temp-currents-card.jpg","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/temp-currents-bannder.jpg"},"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>Mapping large datasets on the web<\/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\/mapping-large-datasets-on-the-web\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mapping large datasets on the web\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.esri.com\/arcgis-blog\/wp-content\/uploads\/2020\/04\/temp-currents-card.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"826\" \/>\n\t<meta property=\"og:image:height\" content=\"465\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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\/mapping-large-datasets-on-the-web#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\"},\"author\":{\"name\":\"Kristian Ekenes\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5469f723fbfb78138efbb1da56e6aa9b\"},\"headline\":\"Mapping large datasets on the web\",\"datePublished\":\"2020-04-27T16:00:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\"},\"wordCount\":6,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"data exploration\",\"data visualization\",\"oceans\",\"spilhaus\"],\"articleSection\":[\"Mapping\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\",\"name\":\"Mapping large datasets on the web\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2020-04-27T16:00:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mapping large datasets on the web\"}]},{\"@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":"Mapping large datasets on the web","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\/mapping-large-datasets-on-the-web","og_locale":"en_US","og_type":"article","og_title":"Mapping large datasets on the web","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","og_image":[{"width":826,"height":465,"url":"https:\/\/www.esri.com\/arcgis-blog\/wp-content\/uploads\/2020\/04\/temp-currents-card.jpg","type":"image\/jpeg"}],"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\/mapping-large-datasets-on-the-web#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web"},"author":{"name":"Kristian Ekenes","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5469f723fbfb78138efbb1da56e6aa9b"},"headline":"Mapping large datasets on the web","datePublished":"2020-04-27T16:00:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web"},"wordCount":6,"commentCount":3,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["data exploration","data visualization","oceans","spilhaus"],"articleSection":["Mapping"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web","name":"Mapping large datasets on the web","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2020-04-27T16:00:42+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/mapping\/mapping-large-datasets-on-the-web#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Mapping large datasets on the web"}]},{"@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":"April 27, 2020","author_name":"Kristian Ekenes","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/kekenes","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/04\/temp-currents-bannder.jpg","primary_product":"ArcGIS Maps SDK for JavaScript","tag_data":[{"term_id":34601,"name":"data exploration","slug":"data-exploration","term_group":0,"term_taxonomy_id":34601,"taxonomy":"post_tag","description":"","parent":0,"count":14,"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":315102,"name":"oceans","slug":"oceans","term_group":0,"term_taxonomy_id":315102,"taxonomy":"post_tag","description":"","parent":0,"count":24,"filter":"raw"},{"term_id":626691,"name":"spilhaus","slug":"spilhaus","term_group":0,"term_taxonomy_id":626691,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"}],"category_data":[{"term_id":22941,"name":"Mapping","slug":"mapping","term_group":0,"term_taxonomy_id":22941,"taxonomy":"category","description":"","parent":0,"count":2683,"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":361,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":761,"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\/830171","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=830171"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/830171\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=830171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=830171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=830171"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=830171"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=830171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}