{"id":2982193,"date":"2026-09-15T05:39:04","date_gmt":"2026-09-15T12:39:04","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2982193"},"modified":"2026-09-15T05:39:04","modified_gmt":"2026-09-15T12:39:04","slug":"calculate-slope-and-aspect-in-native-maps-sdks","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks","title":{"rendered":"Learn how to calculate slope and aspect with Native Maps SDKs"},"author":10242,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[738191,22941],"tags":[24111,34141,773362,24211,781243],"industry":[],"product":[769142,776202,768902,769152,768912,36601],"class_list":["post-2982193","blog","type-blog","status-publish","format-standard","hentry","category-developers","category-mapping","tag-aspect","tag-map-algebra","tag-native-development","tag-slope","tag-spatial-analysis-apis","product-sdk-net","product-sdk-flutter","product-sdk-kotlin","product-sdk-qt","product-sdk-swift","product-developers"],"acf":{"authors":[{"ID":10242,"user_firstname":"Rachael","user_lastname":"Ellen","nickname":"Rachael Ellen","user_nicename":"rellen","display_name":"Rachael Ellen","user_email":"rellen@esri.com","user_url":"https:\/\/dev.to\/rachaele\/","user_registered":"2019-11-29 11:58:45","user_description":"Rachael is a senior product engineer in the ArcGIS Maps SDKs for Native Apps team, working on the high performance spatial analysis APIs. Following an academic career in geology, she switched careers by learning to code and now enjoys building apps with Native Maps SDKs. She loves sharing code examples, fun geospatial development workflows and the latest product updates with developers via blogs and code.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"},{"ID":468966,"user_firstname":"Isaac","user_lastname":"Hall","nickname":"Isaac Hall","user_nicename":"ihall","display_name":"Isaac Hall","user_email":"ihall@esri.com","user_url":"","user_registered":"2026-08-11 11:28:28","user_description":"","user_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/bb75be59772fb4a97888c4b9d05fc200b0b1224dcc7f7871b8b38417d974e0df?s=96&#038;d=blank&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/bb75be59772fb4a97888c4b9d05fc200b0b1224dcc7f7871b8b38417d974e0df?s=192&#038;d=blank&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' loading='lazy' decoding='async'\/>"}],"short_description":"Learn how to calculate, visualize, and analyze terrain with slope and aspect using Native Maps SDKs spatial analysis APIs.","flexible_content":[{"acf_fc_layout":"content","content":"<p>We\u2019re excited to share that, with the release of ArcGIS Maps SDKs for Native Apps 300.1, you can now calculate slope and aspect from a raster.<\/p>\n<p>Slope and aspect are the two latest features to join the growing library of tools available in the spatial analysis APIs (first introduced at 300.0). This means you can now use Native Maps SDKs to build apps that calculate, visualize, and analyze terrain using slope and aspect derived from digital elevation models.<\/p>\n<p>In this blog, we\u2019ll walk through what slope and aspect are, how you can use the new features in your Native Maps SDKs app, and how to get started.<\/p>\n<p style=\"text-align: center;\"><em>The code snippets, API reference links, and documentation links shown throughout this blog post mostly use ArcGIS Maps SDK for Flutter, but the same concepts apply across all Native Maps SDKs.<\/em><\/p>\n<h2>What are the spatial analysis APIs?<\/h2>\n<p>Before we jump into slope and aspect, here\u2019s a quick overview of what the <a href=\"https:\/\/developers.arcgis.com\/flutter\/spatial-analysis\/\">spatial analysis APIs<\/a> are. They provide a collection of analysis tools that operate on your source data at full resolution. The APIs use the GPU for fast execution, enabling high-precision, high-performance analysis across the range of platforms supported by Native Maps SDKs.<\/p>\n<p>The spatial analysis APIs follow a functional approach to analysis. You start with a <code>ContinuousField<\/code>\u00a0representing your source data, such as a digital elevation model (DEM). You then apply one or more <code>ContinuousFieldFunction<\/code> operations, such as slope, aspect, or map algebra expressions, to define the analysis you want to perform before evaluating the result when needed. Because functions can be chained together before evaluation, you can build complex analysis workflows from a series of simple operations.<\/p>\n<p>In 300.0, we introduced the initial set of functions, including viewshed and line-of-sight analysis, map algebra, and an analysis overlay for interactive workflows. With 300.1, slope, aspect, and more map algebra tools have joined this growing library of spatial analysis capabilities. Check out the <a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/announcements\/whats-new-in-arcgis-maps-sdks-for-native-apps-300-1\">latest release blog<\/a> to learn more about other new features.<\/p>\n<h2>Slope<\/h2>\n<p>Slope describes how steep or shallow a surface is. It represents the rate of change in elevation across a digital elevation model (DEM). Slope is one of the most commonly used terrain derivatives in GIS, as it helps answer practical questions on how people and natural processes interact with the landscape.<\/p>\n<p>For example, imagine a search and rescue team responding in an area that\u2019s off the beaten track, inaccessible to road vehicles. Using the spatial analysis APIs to calculate slope from a DEM stored on the device, rescuers could quickly identify routes suitable for off-road vehicles whilst avoiding terrain that is too steep to traverse safely. If the analysis were then to show there is no way to use even an off-road vehicle, the new tools can help identify places to safely drop off\/pick up teams via helicopter.<\/p>\n<p>To calculate slope, create a <code>ContinuousField<\/code> from your DEM, create a <code>ContinuousFieldFunction<\/code> from it, and then call <code>slope<\/code> to create a new function representing the slope calculation. When evaluated, the spatial analysis APIs use the GPU to efficiently calculate terrain gradients across the elevation surface, potentially processing millions of cells depending on the size of your dataset. These gradients are then used to derive slope values, producing a field containing values in degrees from 0\u00b0 (flat) to 90\u00b0 (vertical). You can learn more about inputs and results for slope in the <a href=\"https:\/\/developers.arcgis.com\/flutter\/api-reference\/reference\/arcgis_maps\/ContinuousFieldFunction\/slope.html\">API reference documentation<\/a>.<\/p>\n<p>Once evaluated, the result is returned as a field that can be displayed, exported, or used as input to further analysis \u2013 see the documentation and samples link at the end of this blog to learn more.<\/p>\n<p>The code below steps through the workflow.<\/p>\n<pre><code>\r\nFuture&lt;RasterLayer&gt; buildSlopeRasterLayer(<span style=\"color: #e36209;\">Uri<\/span> elevationFilePath) <span style=\"color: #d73a49;\">async<\/span> {\r\n  <span style=\"color: #d73a49;\">final<\/span> continuousField = <span style=\"color: #d73a49;\">await<\/span> ContinuousField.createFromFiles(\r\n    filePaths: [elevationFilePath],\r\n    band: <span style=\"color: #005cc5;\">0<\/span>,\r\n  );\r\n\r\n  <span style=\"color: #d73a49;\">final<\/span> elevationFunction = ContinuousFieldFunction.create(continuousField);\r\n  <span style=\"color: #d73a49;\">final<\/span> slopeFunction = elevationFunction.slope();\r\n  <span style=\"color: #d73a49;\">final<\/span> evaluatedField = <span style=\"color: #d73a49;\">await<\/span> slopeFunction.evaluate();\r\n\r\n  <span style=\"color: #d73a49;\">final<\/span> exportedFiles = <span style=\"color: #d73a49;\">await<\/span> evaluatedField .exportToFiles(\r\n    outputDirectory: outputDirectoryUri,\r\n    filenamesPrefix: <span style=\"color: #032f62;\">'slope_result'<\/span>,\r\n  );\r\n\r\n  <span style=\"color: #d73a49;\">final<\/span> raster = Raster.withFileUri(exportedFiles.first);\r\n  <span style=\"color: #d73a49;\">final<\/span> layer = RasterLayer.withRaster(raster)\r\n    ..renderer = StretchRenderer(\r\n      stretchParameters: MinMaxStretchParameters(\r\n        minValues: [<span style=\"color: #005cc5;\">0.0<\/span>],\r\n        maxValues: [<span style=\"color: #005cc5;\">90.0<\/span>],\r\n      ),\r\n      gammas: [<span style=\"color: #005cc5;\">1.0<\/span>],\r\n      estimateStatistics: <span style=\"color: #d73a49;\">false<\/span>,\r\n      colorRamp: ColorRamp(\r\n        type: PresetColorRampType.viridis,\r\n        size: <span style=\"color: #005cc5;\">256<\/span>,\r\n      ),\r\n    );\r\n  <span style=\"color: #d73a49;\">await<\/span> layer.load();\r\n  <span style=\"color: #d73a49;\">return<\/span> layer;\r\n}\r\n\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"image","image":{"ID":2982194,"id":2982194,"title":"TongariroSlope","filename":"Screenshot-2026-09-10-at-16.11.58.png","filesize":3355080,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\/screenshot-2026-09-10-at-16-11-58","alt":"A color-coded slope map showing steep volcanic crater walls and flatter valley floors.","author":"10242","description":"","caption":"Slope visualization calculated from a DEM of Tongariro National Park, New Zealand. Terrain steepness is rendered using a `viridis` color ramp, with darker colours indicating low-angle terrain (such as floors of volcanic craters) and brighter colours indicating steeper slopes around volcanic landforms and valley walls.","name":"screenshot-2026-09-10-at-16-11-58","status":"inherit","uploaded_to":2982193,"date":"2026-09-15 09:51:25","modified":"2026-09-15 09:58:16","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":1760,"height":1612,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58.png","medium-width":285,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58.png","medium_large-width":768,"medium_large-height":703,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58.png","large-width":1179,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58-1536x1407.png","1536x1536-width":1536,"1536x1536-height":1407,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58.png","2048x2048-width":1760,"2048x2048-height":1612,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58-508x465.png","card_image-width":508,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/Screenshot-2026-09-10-at-16.11.58-1179x1080.png","wide_image-width":1179,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2>Aspect<\/h2>\n<p>Aspect describes the compass direction that a slope faces. To put it another way, it identifies the downslope direction of the steepest descent of a slope. Knowing the direction a slope faces could be important for a variety of workflows. For example, south-facing slopes in the northern hemisphere typically receive more solar energy than north-facing slopes, influencing factors such as vegetation growth, snow persistence, and local microclimates.<\/p>\n<p>Just like with slope, calculating aspect is straightforward using the spatial analysis APIs. Create a <code>ContinuousField<\/code> from your DEM, create a <code>ContinuousFieldFunction<\/code> from the field, and call <code>aspect<\/code> to derive the result. The resulting field contains aspect values from 0\u00ba up to but not including 360\u00ba, where north is represented by 0\u00ba, east by 90\u00ba, south by 180\u00ba and west by 270\u00ba. You can learn more about inputs and results for aspect in the <a href=\"https:\/\/developers.arcgis.com\/flutter\/api-reference\/reference\/arcgis_maps\/ContinuousFieldFunction\/aspect.html\">API reference documentation<\/a>.<\/p>\n<p>Again, just like with slope, once evaluated the result is returned as a field that can be displayed, exported, or used as input to further analysis.<\/p>\n<pre><code>\r\n_continuousField = <span style=\"color: #d73a49;\">await<\/span> ContinuousField.createFromFiles(\r\n  filePaths: [elevationFilePath],\r\n  band: <span style=\"color: #005cc5;\">0<\/span>,\r\n);\r\n\r\n_elevationFieldFunction = ContinuousFieldFunction.create(_continuousField);\r\n\r\n_aspectFunction = _elevationFieldFunction.aspect();\r\n<\/code><\/pre>\n<p>While the continuous aspect values can be visualized directly using a stretch renderer, many applications benefit from reclassifying them into compass-direction bands such as north, northeast, east, and so on. This makes the results easier to interpret at a glance and allows each direction to be represented using a distinct color. Click the plus icon below to see the code you can use to achieve this:<\/p>\n<details>\n<summary><span style=\"color: blue; font-style: bold;\"><span style=\"color: #0000ff;\">\u2295\u00a0Click or tap to view code&#8230;<\/span><\/span><\/summary>\n<pre><code>\r\nDiscreteFieldFunction _createCompassDirectionField(\r\n  ContinuousFieldFunction aspectFunction,\r\n) {\r\n  <span style=\"color: #d73a49;\">final<\/span> compassClassifiedAspect = aspectFunction\r\n      <span style=\"color: #6a737d;\">\/\/ North wraps around 360 degrees, so it needs two angle ranges.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanOrEqualToValue(<span style=\"color: #005cc5;\">0<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">22.5<\/span>))\r\n            .logicalOr(\r\n              aspectFunction\r\n                  .isGreaterThanValue(<span style=\"color: #005cc5;\">337.5<\/span>)\r\n                  .logicalAnd(aspectFunction.isLessThanValue(<span style=\"color: #005cc5;\">360<\/span>)),\r\n            ),\r\n        value: <span style=\"color: #005cc5;\">0<\/span>,\r\n      )\r\n      <span style=\"color: #6a737d;\">\/\/ Northeast.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanValue(<span style=\"color: #005cc5;\">22.5<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">67.5<\/span>)),\r\n        value: <span style=\"color: #005cc5;\">1<\/span>,\r\n      )\r\n      <span style=\"color: #6a737d;\">\/\/ East.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanValue(<span style=\"color: #005cc5;\">67.5<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">112.5<\/span>)),\r\n        value: <span style=\"color: #005cc5;\">2<\/span>,\r\n      )\r\n      <span style=\"color: #6a737d;\">\/\/ Southeast.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanValue(<span style=\"color: #005cc5;\">112.5<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">157.5<\/span>)),\r\n        value: <span style=\"color: #005cc5;\">3<\/span>,\r\n      )\r\n      <span style=\"color: #6a737d;\">\/\/ South.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanValue(<span style=\"color: #005cc5;\">157.5<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">202.5<\/span>)),\r\n        value: <span style=\"color: #005cc5;\">4<\/span>,\r\n      )\r\n      <span style=\"color: #6a737d;\">\/\/ Southwest.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanValue(<span style=\"color: #005cc5;\">202.5<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">247.5<\/span>)),\r\n        value: <span style=\"color: #005cc5;\">5<\/span>,\r\n      )\r\n      <span style=\"color: #6a737d;\">\/\/ West.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanValue(<span style=\"color: #005cc5;\">247.5<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">292.5<\/span>)),\r\n        value: <span style=\"color: #005cc5;\">6<\/span>,\r\n      )\r\n      <span style=\"color: #6a737d;\">\/\/ Northwest.<\/span>\r\n      .replaceWithValueIf(\r\n        selection: aspectFunction\r\n            .isGreaterThanValue(<span style=\"color: #005cc5;\">292.5<\/span>)\r\n            .logicalAnd(aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">337.5<\/span>)),\r\n        value: <span style=\"color: #005cc5;\">7<\/span>,\r\n      );\r\n\r\n  <span style=\"color: #6a737d;\">\/\/ Round any remaining fractional results and convert the classified surface<\/span>\r\n  <span style=\"color: #6a737d;\">\/\/ into a discrete field that can be symbolized categorically.<\/span>\r\n  <span style=\"color: #d73a49;\">return<\/span> compassClassifiedAspect.toDiscreteFieldFunction();\r\n}\r\n\r\n<\/code><\/pre>\n<\/details>\n"},{"acf_fc_layout":"image","image":{"ID":2982195,"id":2982195,"title":"TongariroAspect","filename":"TongariroAspect.png","filesize":994171,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\/tongariroaspect","alt":"Aspect map of Tongariro National Park showing slope direction classified into eight compass directions. Red, orange, yellow, green, cyan, blue, dark blue, and purple colours represent different slope orientations across volcanic craters, ridges, and valleys.","author":"10242","description":"","caption":"Aspect visualization of Tongariro National Park, New Zealand. Aspect values derived from a DEM have been reclassified into eight compass-direction categories and rendered with a colormap.","name":"tongariroaspect","status":"inherit","uploaded_to":2982193,"date":"2026-09-15 10:23:26","modified":"2026-09-15 10:32:28","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":1686,"height":1464,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect.png","medium-width":301,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect.png","medium_large-width":768,"medium_large-height":667,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect.png","large-width":1244,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect-1536x1334.png","1536x1536-width":1536,"1536x1536-height":1334,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect.png","2048x2048-width":1686,"2048x2048-height":1464,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect-536x465.png","card_image-width":536,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspect-1244x1080.png","wide_image-width":1244,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2>Aspect-Slope Rendering<\/h2>\n<p>Now that we&#8217;ve looked at slope and aspect individually, let&#8217;s see what happens when we work with them together.<\/p>\n<p>While rendering of each provides useful context for the terrain in your area of interest, combining them creates a rich terrain visualization that can effectively communicate the character of a landscape. Using a combination of the spatial analysis APIs tool suite alongside raster or field analysis renderers, you can use color hue to represent the direction a slope faces and color intensity to represent how steep that slope is. The result simultaneously reveals terrain orientation and steepness in a single layer, helping users interpret ridges, valleys, and exposed slopes without needing to switch between multiple visualizations.<\/p>\n<p>Here&#8217;s how you can do it. After deriving slope and aspect from a DEM, reclassify both slope and aspect fields into a set of discrete categories with map algebra. Categorize slope into broad steepness bands, and aspect into eight compass directions. Then, combine these classifications into a single <code>DiscreteFieldFunction<\/code>, creating a unique category for every aspect-slope combination. A color map can then be used to assign a distinct color to each aspect-slope combination, with hue representing aspect and color intensity indicating increasing steepness.<\/p>\n<p><em>The following code and rendering have been inspired by the <a href=\"https:\/\/doc.esri.com\/en\/arcgis-pro\/latest\/help\/analysis\/raster-functions\/aspect-slope-function.html\">Aspect-Slope function<\/a> rendering available in ArcGIS Pro. Click on the plus sign below to view the code for an aspect-slope rendering.<\/em><\/p>\n<details>\n<summary><span style=\"color: blue; font-style: bold;\"><span style=\"color: #0000ff;\">\u2295\u00a0Click or tap to view code&#8230;<\/span><\/span><\/summary>\n<pre><code>\r\n<span style=\"color: #6a737d;\">\/\/ Step 1: Classify slope into broad bands.<\/span>\r\n<span style=\"color: #6a737d;\">\/\/ This turns continuous slope values into simple numeric buckets.<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> slopeBuckets = _slopeFunction\r\n    .replaceWithValueIf(\r\n      selection: _slopeFunction\r\n          .isGreaterThanOrEqualToValue(<span style=\"color: #005cc5;\">0<\/span>)\r\n          .logicalAnd(_slopeFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">10<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _slopeFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">5<\/span>)\r\n          .logicalAnd(_slopeFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">20<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">20<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _slopeFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">20<\/span>)\r\n          .logicalAnd(_slopeFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">40<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">30<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _slopeFunction.isGreaterThanValue(<span style=\"color: #005cc5;\">40<\/span>),\r\n      value: <span style=\"color: #005cc5;\">40<\/span>,\r\n    );\r\n\r\n<span style=\"color: #6a737d;\">\/\/ Step 2: Classify aspect into compass-direction bands.<\/span>\r\n<span style=\"color: #6a737d;\">\/\/ Each direction gets a bucket value so it can be combined with slope.<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> aspectBuckets = _aspectFunction\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanOrEqualToValue(-<span style=\"color: #005cc5;\">1<\/span>) <span style=\"color: #6a737d;\">\/\/ include flat areas<\/span>\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">22.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">1<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">22.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">67.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">2<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">67.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">112.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">3<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">112.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">157.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">4<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">157.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">202.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">5<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">202.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">247.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">6<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">247.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">292.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">7<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">292.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">337.5<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">8<\/span>,\r\n    )\r\n    .replaceWithValueIf(\r\n      selection: _aspectFunction\r\n          .isGreaterThanValue(<span style=\"color: #005cc5;\">337.5<\/span>)\r\n          .logicalAnd(_aspectFunction.isLessThanOrEqualToValue(<span style=\"color: #005cc5;\">360<\/span>)),\r\n      value: <span style=\"color: #005cc5;\">1<\/span>,\r\n    );\r\n\r\n<span style=\"color: #6a737d;\">\/\/ Step 3: Combine the slope and aspect classes into one discrete field.<\/span>\r\n<span style=\"color: #6a737d;\">\/\/ The numeric codes create a combined aspect-slope category per cell.<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> slopeAspectMap = (slopeBuckets + aspectBuckets).toDiscreteFieldFunction();\r\n\r\n<span style=\"color: #6a737d;\">\/\/ Step 4: Render the combined categories with a fixed colormap.<\/span>\r\n<span style=\"color: #6a737d;\">\/\/ Each combined class code gets a specific color in the legend.<\/span>\r\n<span style=\"color: #6a737d;\">\/\/ Values of 10 or under are relatively flat.<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> colors = &lt;<span style=\"color: #e36209;\">int<\/span>, Color&gt;{\r\n  <span style=\"color: #005cc5;\">11<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">12<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">13<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">14<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">15<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">16<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">17<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">18<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">21<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">152<\/span>, <span style=\"color: #005cc5;\">181<\/span>, <span style=\"color: #005cc5;\">129<\/span>),\r\n  <span style=\"color: #005cc5;\">22<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">114<\/span>, <span style=\"color: #005cc5;\">168<\/span>, <span style=\"color: #005cc5;\">144<\/span>),\r\n  <span style=\"color: #005cc5;\">23<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">124<\/span>, <span style=\"color: #005cc5;\">142<\/span>, <span style=\"color: #005cc5;\">173<\/span>),\r\n  <span style=\"color: #005cc5;\">24<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">140<\/span>, <span style=\"color: #005cc5;\">117<\/span>, <span style=\"color: #005cc5;\">160<\/span>),\r\n  <span style=\"color: #005cc5;\">25<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">180<\/span>, <span style=\"color: #005cc5;\">123<\/span>, <span style=\"color: #005cc5;\">161<\/span>),\r\n  <span style=\"color: #005cc5;\">26<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">203<\/span>, <span style=\"color: #005cc5;\">139<\/span>, <span style=\"color: #005cc5;\">143<\/span>),\r\n  <span style=\"color: #005cc5;\">27<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">197<\/span>, <span style=\"color: #005cc5;\">165<\/span>, <span style=\"color: #005cc5;\">138<\/span>),\r\n  <span style=\"color: #005cc5;\">28<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">189<\/span>, <span style=\"color: #005cc5;\">191<\/span>, <span style=\"color: #005cc5;\">137<\/span>),\r\n  <span style=\"color: #005cc5;\">31<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">141<\/span>, <span style=\"color: #005cc5;\">196<\/span>, <span style=\"color: #005cc5;\">88<\/span>),\r\n  <span style=\"color: #005cc5;\">32<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">61<\/span>, <span style=\"color: #005cc5;\">171<\/span>, <span style=\"color: #005cc5;\">113<\/span>),\r\n  <span style=\"color: #005cc5;\">33<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">80<\/span>, <span style=\"color: #005cc5;\">120<\/span>, <span style=\"color: #005cc5;\">182<\/span>),\r\n  <span style=\"color: #005cc5;\">34<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">119<\/span>, <span style=\"color: #005cc5;\">71<\/span>, <span style=\"color: #005cc5;\">157<\/span>),\r\n  <span style=\"color: #005cc5;\">35<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">192<\/span>, <span style=\"color: #005cc5;\">77<\/span>, <span style=\"color: #005cc5;\">156<\/span>),\r\n  <span style=\"color: #005cc5;\">36<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">231<\/span>, <span style=\"color: #005cc5;\">111<\/span>, <span style=\"color: #005cc5;\">122<\/span>),\r\n  <span style=\"color: #005cc5;\">37<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">226<\/span>, <span style=\"color: #005cc5;\">166<\/span>, <span style=\"color: #005cc5;\">108<\/span>),\r\n  <span style=\"color: #005cc5;\">38<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">214<\/span>, <span style=\"color: #005cc5;\">219<\/span>, <span style=\"color: #005cc5;\">94<\/span>),\r\n  <span style=\"color: #005cc5;\">41<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">132<\/span>, <span style=\"color: #005cc5;\">214<\/span>, <span style=\"color: #005cc5;\">0<\/span>),\r\n  <span style=\"color: #005cc5;\">42<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">0<\/span>, <span style=\"color: #005cc5;\">171<\/span>, <span style=\"color: #005cc5;\">68<\/span>),\r\n  <span style=\"color: #005cc5;\">43<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">0<\/span>, <span style=\"color: #005cc5;\">104<\/span>, <span style=\"color: #005cc5;\">192<\/span>),\r\n  <span style=\"color: #005cc5;\">44<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">108<\/span>, <span style=\"color: #005cc5;\">0<\/span>, <span style=\"color: #005cc5;\">163<\/span>),\r\n  <span style=\"color: #005cc5;\">45<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">202<\/span>, <span style=\"color: #005cc5;\">0<\/span>, <span style=\"color: #005cc5;\">156<\/span>),\r\n  <span style=\"color: #005cc5;\">46<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">85<\/span>, <span style=\"color: #005cc5;\">104<\/span>),\r\n  <span style=\"color: #005cc5;\">47<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">171<\/span>, <span style=\"color: #005cc5;\">71<\/span>),\r\n  <span style=\"color: #005cc5;\">48<\/span>: <span style=\"color: #d73a49;\">const<\/span> Color.fromARGB(<span style=\"color: #005cc5;\">255<\/span>, <span style=\"color: #005cc5;\">244<\/span>, <span style=\"color: #005cc5;\">250<\/span>, <span style=\"color: #005cc5;\">0<\/span>),\r\n};\r\n\r\n<span style=\"color: #6a737d;\">\/\/ Step 5: Build the renderer and apply it to the raster layer.<\/span>\r\n<span style=\"color: #6a737d;\">\/\/ The colormap makes each class visually distinct in the scene.<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> renderer = ColormapRenderer.withColormap(\r\n  Colormap.fromValuesAndColors(colors),\r\n);\r\n\r\n<\/code><\/pre>\n<\/details>\n<p>&nbsp;<\/p>\n<p>As a visualization, aspect-slope results work well as a contextual layer, providing intuitive terrain rendering without obscuring operational data. The combined classification can also serve as the foundation for further spatial analysis, making it easy to identify terrain with combinations of slope and aspect, support suitability modelling, or highlight areas that meet specific environmental conditions.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2982196,"id":2982196,"title":"TongariroAspectSlope","filename":"TongariroAspectSlope.png","filesize":1437418,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\/tongariroaspectslope","alt":"Aspect-slope map of Tongariro National Park showing terrain classified by both slope and aspect. Different colours represent slope direction, while colour intensity indicates increasing steepness.","author":"10242","description":"","caption":"Aspect-slope visualization of Tongariro National Park, New Zealand. Hue represents aspect (compass direction), while color intensity represents slope (terrain steepness). Grey areas represent relatively flat terrain.","name":"tongariroaspectslope","status":"inherit","uploaded_to":2982193,"date":"2026-09-15 10:43:54","modified":"2026-09-15 10:48:42","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":1968,"height":1358,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope.png","medium-width":378,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope.png","medium_large-width":768,"medium_large-height":530,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope.png","large-width":1565,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope-1536x1060.png","1536x1536-width":1536,"1536x1536-height":1060,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope.png","2048x2048-width":1968,"2048x2048-height":1358,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope-674x465.png","card_image-width":674,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/TongariroAspectSlope-1565x1080.png","wide_image-width":1565,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>While aspect-slope maps are useful visualizations, the real power of the spatial analysis APIs comes from treating the results as inputs to further analysis.<\/p>\n<h2><strong>Convert slope result to percent rise with map algebra<\/strong><\/h2>\n<p>Now you\u2019ve learned the basics of calculating and visualizing slope and aspect from a DEM, let\u2019s take it one step further by <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/apply-map-algebra\/\">applying map algebra<\/a> to filter for areas that are of interest to the user of your app.<\/p>\n<p>For example, the units for slope are returned in degrees, but what if you want the result in percent rise for your app? Well, you can easily convert degrees to percent rise using the map algebra tools included with the spatial analysis APIs. Percent rise is defined as the ratio of rise over run multiplied by 100 to convert it to a percentage. You can achieve this with the following code:<\/p>\n<pre><code>\r\n<span style=\"color: #6a737d;\">\/\/ convert slope degrees to radians<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> slopeRadians = _slopeFunction * (math.pi \/ <span style=\"color: #005cc5;\">180.0<\/span>);\r\n<span style=\"color: #6a737d;\">\/\/ take the tangent and multiply by 100 to get the percentage<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> slopePercentRise = slopeRadians.tan() * <span style=\"color: #005cc5;\">100.0<\/span>;\r\n\r\n<\/code><\/pre>\n<p>This creates a new <code>ContinuousFieldFunction<\/code> representing percent rise values derived from the input DEM. However, you may not want to display results for the entire DEM, and instead focus the analysis on terrain that is relevant to your application. \u00a0For example, if you were building an app that allows skiers to explore the variation in slope (in percent rise) across their local resort, a raster representing ski-run footprints could be loaded as a field and used as a mask to restrict the analysis to designated skiing areas rather than the surrounding landscape. This can be achieved using the <code>mask<\/code> function, ensuring that only terrain within the ski-run boundary is included in the result:<\/p>\n<pre><code>\r\n<span style=\"color: #6a737d;\">\/\/ Keep only raster cells where the ski-run raster has data.<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> skiRunSelectionMask = _skiRunFieldFunction.hasData();\r\n<span style=\"color: #6a737d;\">\/\/ Apply the ski-run mask to the percent rise surface.<\/span>\r\n<span style=\"color: #d73a49;\">final<\/span> maskedPercentRise = slopePercentRise.mask(skiRunSelectionMask);\r\n\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"image","image":{"ID":2982198,"id":2982198,"title":"MeribelPercentRise","filename":"MeribelPercentRise-scaled.png","filesize":1964071,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\/meribelpercentrise","alt":"Oblique 3D view of a mountain landscape with ski runs highlighted by percent-rise categories. Ski-run corridors are shaded light, medium, and dark blue to represent increasing terrain steepness, while surrounding terrain is shown in shaded grey relief. A legend indicates low (0-20%), moderate (20-40%), and steep (>40%) percent rise.","author":"10242","description":"","caption":"Percent-rise analysis of ski terrain around Col de la Loze, France. Slope values derived from a DEM were converted to percent rise using map algebra and masked to ski-run footprints, allowing only the skiable terrain to be visualized in a color map. Different shades of blue representing different percent-rise bands highlight variations in slope across the resort. Ski run data from OpenSkiData\/OpenSkiMap.org, \u00a9 OpenStreetMap contributors (ODbL) and Skimap.org.","name":"meribelpercentrise","status":"inherit","uploaded_to":2982193,"date":"2026-09-15 10:55:59","modified":"2026-09-15 12:36:46","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":2560,"height":1333,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-scaled.png","medium-width":464,"medium-height":242,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-scaled.png","medium_large-width":768,"medium_large-height":400,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-scaled.png","large-width":1920,"large-height":1000,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-1536x800.png","1536x1536-width":1536,"1536x1536-height":800,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-2048x1067.png","2048x2048-width":2048,"2048x2048-height":1067,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-826x430.png","card_image-width":826,"card_image-height":430,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/MeribelPercentRise-1920x1000.png","wide_image-width":1920,"wide_image-height":1000}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>From there, you can refine the analysis further using additional suitability criteria. For example, a <code>BooleanFieldFunction<\/code> could identify areas where percent rise falls within a user-defined skiing range (flat areas for beginners, steeper areas for experienced skiers). A <code>DiscreteFieldFunction<\/code> could reclassify terrain into categories such as beginner, intermediate, and advanced runs. Additional raster layers, such as snow depth or land cover, could also be incorporated to support specialized workflows, such as cross-country ski planning. For an example of this type of filtering and reclassification workflow in action, see the <a href=\"https:\/\/developers.arcgis.com\/kotlin\/sample-code\/analyze-terrain-suitability-from-slope-and-aspect\/\">Analyze Terrain Suitability from Slope and Aspect<\/a> sample.<\/p>\n"},{"acf_fc_layout":"blockquote","content":"<p>Percent Rise Caveats<\/p>\n<p>Percent rise can provide a more intuitive measure of terrain steepness than slope in degrees, but the range and distribution of values differ significantly between the two. While slope angles are limited to a range of 0\u00b0 to 90\u00b0, percent rise increases non-linearly and can become very large on steep terrain. As a result, a small number of steep locations may dominate the value range of a raster. Rather than using a single visualization strategy everywhere, consider tailoring your RasterRenderer to the terrain and your audience. You can adjust the stretch range of the minimum and maximum values in MinMaxStretchParameters or instead use PercentClipStretchParameters to help highlight the differences that matter most for your analysis.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Summary<\/h2>\n<p>In this blog post, we&#8217;ve covered what slope and aspect are, why you might want to calculate and visualize them either individually or together, and how you would do that. We&#8217;ve also explored how map algebra can be used to transform, classify and combine terrain analysis results into more advanced workflows. If you want to learn more about how to use slope, aspect, or the spatial analysis APIs more generally, check out the <a href=\"https:\/\/developers.arcgis.com\/flutter\/spatial-analysis\/\">spatial analysis APIs documentation<\/a> and samples most related to this blog, <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/apply-map-algebra\/\">Apply map algebra<\/a> and <a href=\"https:\/\/developers.arcgis.com\/kotlin\/sample-code\/analyze-terrain-suitability-from-slope-and-aspect\/\">Analyze terrain suitability from slope and aspect<\/a>.<\/p>\n<p>If you\u2019d like to learn more about color ramp and renderer options, check out the <a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/new-color-ramps-color-maps-native-maps-sdks\">New Color Ramps and Color Maps in Native Maps SDK blog post<\/a>. You can also learn how to use a renderer in a field analysis in the <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/show-interactive-viewshed-with-analysis-overlay\/\">Show interactive viewshed with analysis overlay sample<\/a>.<\/p>\n<p>We would love to hear how you are using the spatial analysis APIs on the <a href=\"https:\/\/community.esri.com\/en\/categories\/arcgis-runtime-sdks\">Esri Community ArcGIS Maps SDKs for Native Apps forums<\/a>.<\/p>\n"}],"related_articles":[{"ID":2967996,"post_author":"10242","post_date":"2026-06-02 05:00:30","post_date_gmt":"2026-06-02 12:00:30","post_content":"","post_title":"Render data with new color ramps and color maps in Native Maps SDKs","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"new-color-ramps-color-maps-native-maps-sdks","to_ping":"","pinged":"","post_modified":"2026-06-02 08:59:49","post_modified_gmt":"2026-06-02 15:59:49","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2967996","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2978920,"post_author":"4091","post_date":"2026-08-05 06:57:11","post_date_gmt":"2026-08-05 13:57:11","post_content":"","post_title":"What's New in ArcGIS Maps SDKs for Native Apps 300.1","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"whats-new-in-arcgis-maps-sdks-for-native-apps-300-1","to_ping":"","pinged":"","post_modified":"2026-08-10 10:31:41","post_modified_gmt":"2026-08-10 17:31:41","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2978920","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2861932,"post_author":"10242","post_date":"2025-06-30 04:34:40","post_date_gmt":"2025-06-30 11:34:40","post_content":"","post_title":"How to integrate satellite imagery in mobile app development with Flutter Maps SDK","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"how-to-integrate-satellite-imagery-in-mobile-app-development-with-flutter-maps-sdk","to_ping":"","pinged":"","post_modified":"2025-07-01 02:51:31","post_modified_gmt":"2025-07-01 09:51:31","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2861932","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2963262,"post_author":"3811","post_date":"2026-04-21 06:37:47","post_date_gmt":"2026-04-21 13:37:47","post_content":"","post_title":"What\u2019s new in ArcGIS Maps SDKs for Native Apps 300.0","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"whats-new-in-arcgis-maps-sdks-for-native-apps-300-0","to_ping":"","pinged":"","post_modified":"2026-08-02 02:10:14","post_modified_gmt":"2026-08-02 09:10:14","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2963262","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"show_article_image":true,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/BlogCardSlopeAspect.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/BlogBannerSlopeAspect.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>Calculate slope and aspect with Native Maps SDKs<\/title>\n<meta name=\"description\" content=\"Learn how to calculate, visualize, and analyze terrain with slope and aspect using Native Maps SDKs spatial analysis APIs.\" \/>\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\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Learn how to calculate slope and aspect with Native Maps SDKs\" \/>\n<meta property=\"og:description\" content=\"Learn how to calculate, visualize, and analyze terrain with slope and aspect using Native Maps SDKs spatial analysis APIs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\"},\"author\":{\"name\":\"Rachael Ellen\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/d12aeaaab25c748cdf66a320bf0e72cd\"},\"headline\":\"Learn how to calculate slope and aspect with Native Maps SDKs\",\"datePublished\":\"2026-09-15T12:39:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\"},\"wordCount\":11,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"aspect\",\"Map Algebra\",\"native development\",\"Slope\",\"spatial analysis APIs\"],\"articleSection\":[\"Developers\",\"Mapping\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\",\"name\":\"Calculate slope and aspect with Native Maps SDKs\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2026-09-15T12:39:04+00:00\",\"description\":\"Learn how to calculate, visualize, and analyze terrain with slope and aspect using Native Maps SDKs spatial analysis APIs.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Learn how to calculate slope and aspect with Native Maps SDKs\"}]},{\"@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\/d12aeaaab25c748cdf66a320bf0e72cd\",\"name\":\"Rachael Ellen\",\"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\/2024\/01\/LinkedIn_Photo-465x465.jpeg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg\",\"caption\":\"Rachael Ellen\"},\"description\":\"Rachael is a senior product engineer in the ArcGIS Maps SDKs for Native Apps team, working on the high performance spatial analysis APIs. Following an academic career in geology, she switched careers by learning to code and now enjoys building apps with Native Maps SDKs. She loves sharing code examples, fun geospatial development workflows and the latest product updates with developers via blogs and code.\",\"sameAs\":[\"https:\/\/dev.to\/rachaele\/\",\"https:\/\/www.linkedin.com\/in\/rachael-ellen-8a852729\/\"],\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/rellen\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Calculate slope and aspect with Native Maps SDKs","description":"Learn how to calculate, visualize, and analyze terrain with slope and aspect using Native Maps SDKs spatial analysis APIs.","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\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks","og_locale":"en_US","og_type":"article","og_title":"Learn how to calculate slope and aspect with Native Maps SDKs","og_description":"Learn how to calculate, visualize, and analyze terrain with slope and aspect using Native Maps SDKs spatial analysis APIs.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks"},"author":{"name":"Rachael Ellen","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/d12aeaaab25c748cdf66a320bf0e72cd"},"headline":"Learn how to calculate slope and aspect with Native Maps SDKs","datePublished":"2026-09-15T12:39:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks"},"wordCount":11,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["aspect","Map Algebra","native development","Slope","spatial analysis APIs"],"articleSection":["Developers","Mapping"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks","name":"Calculate slope and aspect with Native Maps SDKs","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2026-09-15T12:39:04+00:00","description":"Learn how to calculate, visualize, and analyze terrain with slope and aspect using Native Maps SDKs spatial analysis APIs.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Learn how to calculate slope and aspect with Native Maps SDKs"}]},{"@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\/d12aeaaab25c748cdf66a320bf0e72cd","name":"Rachael Ellen","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\/2024\/01\/LinkedIn_Photo-465x465.jpeg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/01\/LinkedIn_Photo-465x465.jpeg","caption":"Rachael Ellen"},"description":"Rachael is a senior product engineer in the ArcGIS Maps SDKs for Native Apps team, working on the high performance spatial analysis APIs. Following an academic career in geology, she switched careers by learning to code and now enjoys building apps with Native Maps SDKs. She loves sharing code examples, fun geospatial development workflows and the latest product updates with developers via blogs and code.","sameAs":["https:\/\/dev.to\/rachaele\/","https:\/\/www.linkedin.com\/in\/rachael-ellen-8a852729\/"],"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/rellen"}]}},"text_date":"September 15, 2026","author_name":"Multiple Authors","author_page":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/calculate-slope-and-aspect-in-native-maps-sdks","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/09\/BlogBannerSlopeAspect.png","primary_product":"Developers","tag_data":[{"term_id":24111,"name":"aspect","slug":"aspect","term_group":0,"term_taxonomy_id":24111,"taxonomy":"post_tag","description":"","parent":0,"count":13,"filter":"raw"},{"term_id":34141,"name":"Map Algebra","slug":"map-algebra","term_group":0,"term_taxonomy_id":34141,"taxonomy":"post_tag","description":"","parent":0,"count":4,"filter":"raw"},{"term_id":773362,"name":"native development","slug":"native-development","term_group":0,"term_taxonomy_id":773362,"taxonomy":"post_tag","description":"","parent":0,"count":9,"filter":"raw"},{"term_id":24211,"name":"Slope","slug":"slope","term_group":0,"term_taxonomy_id":24211,"taxonomy":"post_tag","description":"","parent":0,"count":14,"filter":"raw"},{"term_id":781243,"name":"spatial analysis APIs","slug":"spatial-analysis-apis","term_group":0,"term_taxonomy_id":781243,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"category_data":[{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":466,"filter":"raw"},{"term_id":22941,"name":"Mapping","slug":"mapping","term_group":0,"term_taxonomy_id":22941,"taxonomy":"category","description":"","parent":0,"count":2767,"filter":"raw"}],"product_data":[{"term_id":769142,"name":"ArcGIS Maps SDK for .NET","slug":"sdk-net","term_group":0,"term_taxonomy_id":769142,"taxonomy":"product","description":"","parent":36601,"count":48,"filter":"raw"},{"term_id":776202,"name":"ArcGIS Maps SDK for Flutter","slug":"sdk-flutter","term_group":0,"term_taxonomy_id":776202,"taxonomy":"product","description":"","parent":36601,"count":28,"filter":"raw"},{"term_id":768902,"name":"ArcGIS Maps SDK for Kotlin","slug":"sdk-kotlin","term_group":0,"term_taxonomy_id":768902,"taxonomy":"product","description":"","parent":36601,"count":43,"filter":"raw"},{"term_id":769152,"name":"ArcGIS Maps SDK for Qt","slug":"sdk-qt","term_group":0,"term_taxonomy_id":769152,"taxonomy":"product","description":"","parent":36601,"count":47,"filter":"raw"},{"term_id":768912,"name":"ArcGIS Maps SDK for Swift","slug":"sdk-swift","term_group":0,"term_taxonomy_id":768912,"taxonomy":"product","description":"","parent":36601,"count":42,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":793,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=developers","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2982193","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\/10242"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2982193"}],"version-history":[{"count":8,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2982193\/revisions"}],"predecessor-version":[{"id":2982209,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2982193\/revisions\/2982209"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2982193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2982193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2982193"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2982193"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2982193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}