Skip to content
View inMAUIUWPWPFWinUIView on GitHubSample viewer app

Apply a hillshade renderer to a raster.

Image of hillshade renderer

Use case

An environmental agency may track coastal erosion by comparing images of an area taken over a a longer period of time with hillshade renderers applied.

How to use the sample

Choose and adjust the settings to update the hillshade renderer on the raster layer. The sample allows you to change the Altitude, Azimuth, and Slope Type.

How it works

  1. Create a Raster from a grayscale raster file.
  2. Create a RasterLayer from the raster.
  3. Create a Basemap from the raster layer and set it to the map.
  4. Create a HillshadeRenderer, specifying the slope type and other properties, new HillshadeRenderer(Altitude, Azimuth, ZFactor, SlopeType, PixelSizeFactor, PixelSizePower, OutputBitDepth).
  5. Set the hillshade renderer to be used on the raster layer with rasterLayer.Renderer.

Relevant API

  • Basemap
  • HillshadeRenderer
  • Raster
  • RasterLayer

Offline data

This sample downloads the Hillshade raster portal item from ArcGIS Online automatically.

Tags

altitude, angle, azimuth, raster, slope, visualization

Sample Code

RasterHillshade.xaml.csRasterHillshade.xaml.csRasterHillshade.xaml
Use dark colors for code blocksCopy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 // Copyright 2018 Esri. // // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. // You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific // language governing permissions and limitations under the License.  using ArcGIS.Samples.Managers; using Esri.ArcGISRuntime.Mapping; using Esri.ArcGISRuntime.Rasters; using System; using System.Threading.Tasks; using System.Windows;  namespace ArcGIS.WPF.Samples.RasterHillshade {  [ArcGIS.Samples.Shared.Attributes.Sample(  name: "Hillshade renderer",  category: "Layers",  description: "Apply a hillshade renderer to a raster.",  instructions: "Choose and adjust the settings to update the hillshade renderer on the raster layer. The sample allows you to change the Altitude, Azimuth, and Slope Type.",  tags: new[] { "altitude", "angle", "azimuth", "raster", "slope", "visualization" })] [ArcGIS.Samples.Shared.Attributes.OfflineData("ae9739163a76437ea02482e1a807b806")]  public partial class RasterHillshade  {  // Constant to store a z-factor (conversion constant) applied to the hillshade.  // If needed, this can be used to convert z-values to the same unit as the x/y coordinates or to apply a vertical exaggeration.  private const double ZFactor = 1.0;   // Constants to store the Pixel Size Power and Pixel Size Factor values.  // Use these to account for altitude changes (scale) as the viewer zooms in and out (recommended when using worldwide datasets).  private const double PixelSizePower = 1.0;  private const double PixelSizeFactor = 1.0;   // Constant to store the bit depth (pixel depth), which determines the range of values that the hillshade raster can store.  private const int PixelBitDepth = 8;   // Store a reference to the layer  private RasterLayer _rasterLayer;   public RasterHillshade()  {  InitializeComponent();   // Set up the map and load the raster layer from a local file  _ = Initialize();  }   private async Task Initialize()  {  // Create a map with a streets basemap  Map map = new Map(BasemapStyle.ArcGISStreets);   // Get the file name for the local raster dataset  string filepath = GetRasterPath();   // Load the raster file  Raster rasterFile = new Raster(filepath);   try  {  // Create and load a new raster layer to show the image  _rasterLayer = new RasterLayer(rasterFile);  await _rasterLayer.LoadAsync();   // Enable the apply renderer button when the layer loads.  ApplyHillshadeButton.IsEnabled = true;   // Create a viewpoint with the raster's full extent  Viewpoint fullRasterExtent = new Viewpoint(_rasterLayer.FullExtent);   // Set the initial viewpoint for the map  map.InitialViewpoint = fullRasterExtent;   // Add the layer to the map  map.OperationalLayers.Add(_rasterLayer);   // Add the map to the map view  MyMapView.Map = map;   // Add slope type values to the combo box  foreach (object slope in Enum.GetValues(typeof(SlopeType)))  {  SlopeTypeCombo.Items.Add(slope);  }   // Select the "Scaled" slope type enum  SlopeTypeCombo.SelectedValue = SlopeType.Scaled;  }  catch (Exception e)  {  MessageBox.Show(e.ToString(), "Error");  }  }   private void ApplyHillshadeButton_Click(object sender, System.Windows.RoutedEventArgs e)  {  // Get the current parameter values  double altitude = AltitudeSlider.Value;  double azimuth = AzimuthSlider.Value;  SlopeType typeOfSlope = (SlopeType)SlopeTypeCombo.SelectedItem;   // Create a hillshade renderer that uses the values selected by the user  HillshadeRenderer hillshadeRenderer = new HillshadeRenderer(altitude, azimuth, ZFactor, typeOfSlope, PixelSizeFactor, PixelSizePower, PixelBitDepth);   // Apply the new renderer to the raster layer  _rasterLayer.Renderer = hillshadeRenderer;  }   private static string GetRasterPath()  {  return DataManager.GetDataFolder("ae9739163a76437ea02482e1a807b806", "srtm.tiff");  }  } }

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.