Blend renderer

View on GitHubSample viewer app

Blend a hillshade with a raster by specifying the elevation data. The resulting raster looks similar to the original raster, but with some terrain shading, giving it a textured look.

Image of blend renderer

Use case

A blend renderer can be used to apply a color ramp to a hillshade to emphasize areas of high or low elevation. A blend renderer can also be used to add a hillshade effect to aerial or satellite imagery, thereby making changes in elevation more visible.

How to use the sample

Choose and adjust the altitude, azimuth, slope type and color ramp type settings to update the image.

How it works

  1. Create a Raster object from a raster file.
  2. Create a RasterLayer object from the raster.
  3. Create a Basemap object from the raster layer and set it to the map.
  4. Create another Raster object for elevation from a grayscale raster file.
  5. Create a BlendRenderer object, specifying the elevation raster, color ramp, and other properties.
    • If you specify a non-null color ramp, use the elevation raster as the base raster in addition to the elevation raster parameter. That way, the color ramp is used instead of the satellite imagery.
  6. Set the blend renderer to the raster layer.

Relevant API

  • BlendRenderer
  • ColorRamp
  • Raster
  • RasterLayer

Tags

color ramp, elevation, hillshade, image, raster, raster layer, visualization

Sample Code

BlendRendererController.javaBlendRendererController.javaBlendRendererSample.java
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
118
119
120
121
122
123
124
125
126
127
128
/*
 * Copyright 2017 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.
 */

package com.esri.samples.blend_renderer;

import java.io.File;
import java.util.Collections;

import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Slider;

import com.esri.arcgisruntime.layers.RasterLayer;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.raster.BlendRenderer;
import com.esri.arcgisruntime.raster.ColorRamp;
import com.esri.arcgisruntime.raster.Raster;
import com.esri.arcgisruntime.raster.SlopeType;

public class BlendRendererController {

  @FXML private MapView mapView;
  @FXML private ComboBox<SlopeType> slopeTypeComboBox;
  @FXML private ComboBox<ColorRamp.PresetType> colorRampComboBox;
  @FXML private Slider azimuthSlider;
  @FXML private Slider altitudeSlider;

  private String imageryRasterPath;
  private String elevationRasterPath;

  public void initialize() {

    // create rasters
    imageryRasterPath = new File(System.getProperty("data.dir"), "./samples-data/raster/Shasta.tif").getAbsolutePath();
    elevationRasterPath = new File(System.getProperty("data.dir"), "./samples-data/raster/Shasta_Elevation.tif").getAbsolutePath();

    // create and load a raster layer
    RasterLayer rasterLayer = new RasterLayer(new Raster(imageryRasterPath));
    // when the raster has loaded create a basemap from it and create a new ArcGISMap with the basemap
    rasterLayer.addDoneLoadingListener(() -> {
      if (rasterLayer.getLoadStatus() == LoadStatus.LOADED) {
        Basemap basemap = new Basemap(rasterLayer);
        ArcGISMap map = new ArcGISMap(basemap);
        // set the map to the map view
        mapView.setMap(map);
        updateRenderer();
      }
    });
    rasterLayer.loadAsync();

    // set defaults
    colorRampComboBox.getItems().setAll(ColorRamp.PresetType.values());
    colorRampComboBox.getSelectionModel().select(ColorRamp.PresetType.NONE);
    slopeTypeComboBox.getItems().setAll(SlopeType.values());
    slopeTypeComboBox.getSelectionModel().select(SlopeType.NONE);

    // add listeners
    altitudeSlider.valueChangingProperty().addListener(o -> {
      if (!altitudeSlider.isValueChanging()) {
        updateRenderer();
      }
    });
    azimuthSlider.valueChangingProperty().addListener(o -> {
      if (!azimuthSlider.isValueChanging()) {
        updateRenderer();
      }
    });

  }

  /**
   * Updates the raster layer renderer according to the chosen property values.
   */
  public void updateRenderer() {

    ColorRamp colorRamp;
    // if the color ramp selection is none, don't apply a color ramp otherwise apply the selected color ramp
    if (colorRampComboBox.getSelectionModel().getSelectedItem() == ColorRamp.PresetType.NONE) {
      colorRamp = null;
    } else {
      colorRamp = new ColorRamp(colorRampComboBox.getSelectionModel().getSelectedItem(), 800);
    }

    // if color ramp is NONE, use the satellite imagery raster color instead of coloring the hillshade elevation raster
    RasterLayer rasterLayer;
    if (colorRamp == null) {
      rasterLayer = new RasterLayer(new Raster(imageryRasterPath));
    } else {
      rasterLayer = new RasterLayer(new Raster(elevationRasterPath));
    }
    // set the basemap to the raster layer
    mapView.getMap().setBasemap(new Basemap(rasterLayer));

    // create blend renderer and set it to the raster layer
    BlendRenderer blendRenderer = new BlendRenderer(new Raster(elevationRasterPath), Collections.singletonList(9.0),
      Collections.singletonList(255.0), null, null, null, null, colorRamp, altitudeSlider.getValue(),
      azimuthSlider.getValue(), 1, slopeTypeComboBox.getSelectionModel().getSelectedItem(), 1, 1, 8);

    rasterLayer.setRasterRenderer(blendRenderer);
  }

  /**
   * Stops and releases all resources used in application.
   */
  void terminate() {

    if (mapView != null) {
      mapView.dispose();
    }
  }

}

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