Hillshade Renderer


This sample demonstrates how to use hillshade renderer on a raster.

How to Use

Tap on the wrench button in the Action Bar to change the settings for the HillshadeRenderer. The sample allows you to change the Altitude, Azimuth and Slope type. You can tap on the Render button to update the raster.

How it Works

The sample uses the HillshadeRenderer class to render new hillshades. The parameters provided by the user are passed to HillshadeRender at instantiation: new HillshadeRenderer(mAltitude, mAzimuth, mZFactor, mSlopeType, mPixelSizeFactor, mPixelSizePower, mOutputBitDepth); which returns a RasterRenderer. The RasterRenderer is then added to the RasterLayer.

Provision your device

  1. Download the **srtm-hillshade.zip** data from ArcGIS Online.
  2. Extract the contents of the downloaded zip file to disk.
  3. Create an ArcGIS/samples/raster folder on your device. You can use the Android Debug Bridge (adb) tool found in <sdk-dir>/platform-tools.
  4. Open up a command prompt and execute the adb shell command to start a remote shell on your target device.
  5. Navigate to your sdcard directory, e.g. cd /sdcard/.
  6. Create the ArcGIS/samples directory, mkdir ArcGIS/samples/raster.
  7. You should now have the following directory on your target device, /sdcard/ArcGIS/samples/raster. We will copy the contents of the downloaded data into this directory. Note: Directory may be slightly different on your device.
  8. Exit the shell with the, exit command.
  9. While still in your command prompt, navigate to the root folder where you extracted the contents of the data from step 1 and execute the following command:

adb push srtm-hillshade/. /sdcard/ArcGIS/samples/raster

LinkLocal Location




/* 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,
 * See the License for the specific language governing permissions and
 * limitations under the License.

package com.esri.arcgisruntime.sample.hillshaderenderer;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import com.esri.arcgisruntime.layers.RasterLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.raster.HillshadeRenderer;
import com.esri.arcgisruntime.raster.Raster;
import com.esri.arcgisruntime.raster.SlopeType;

import java.io.File;

 * A sample class which demonstrates how to use a HillshadeRenderer on a RasterLayer.
public class MainActivity extends AppCompatActivity
        implements ParametersDialogFragment.ParametersListener {

    private MapView mMapView;
    private RasterLayer mRasterLayer;
    private int mAltitude;
    private int mAzimuth;
    private double mZFactor;
    private SlopeType mSlopeType;
    private double mPixelSizeFactor;
    private double mPixelSizePower;
    private int mOutputBitDepth;
    private FragmentManager mFragmentManager;

    public void returnParameters(int altitude, int azimuth, SlopeType slopeType) {
        //gets dialog box parameters and calls updateRenderer
        mAltitude = altitude;
        mAzimuth = azimuth;
        mSlopeType = slopeType;

    protected void onCreate(Bundle savedInstanceState) {
        //set default values for HillshadeRenderer parameters
        mAltitude = 45;
        mAzimuth = 315;
        mZFactor = 0.000016;
        mSlopeType = SlopeType.NONE;
        mPixelSizeFactor = 1;
        mPixelSizePower = 1;
        mOutputBitDepth = 8;
        // retrieve the MapView from layout
        mMapView = (MapView) findViewById(R.id.mapView);
        mFragmentManager = getSupportFragmentManager();
        // define permission to request
        String[] reqPermission = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
        int requestCode = 2;
        // For API level 23+ request permission at runtime
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                reqPermission[0]) == PackageManager.PERMISSION_GRANTED) {
        } else {
            // request permission
            ActivityCompat.requestPermissions(MainActivity.this, reqPermission, requestCode);

     * Using values stored in strings.xml, builds path to srtm.tif.
     * @return the path to raster file
    private String buildRasterPath() {
        // get sdcard resource name
        File extStorDir = Environment.getExternalStorageDirectory();
        // get the directory
        String extSDCardDirName =
        // get raster filename
        String filename = this.getString(R.string.raster_name);
        // create the full path to the raster file
        return extStorDir.getAbsolutePath()
                + File.separator
                + extSDCardDirName
                + File.separator
                + filename
                + ".tiff";

     * Creates a new Raster based on a given path and adds it to a RasterLayer which is added to an
     * ArcGISMap as an operational layer.
    private void hillshadeRenderer() {
        // create raster
        Raster raster = new Raster(
                new File(buildRasterPath()).getAbsolutePath());
        Log.d("Raster", raster.getPath());
        // create a raster layer
        mRasterLayer = new RasterLayer(raster);
        // create a basemap from the raster layer
        ArcGISMap map = new ArcGISMap();
        // add the map to a map view
        // add the raster as an operational layer

     * Creates a new HillshadeRenderer according to the chosen property values.
    private void updateRenderer() {
        // create blend renderer
        HillshadeRenderer hillshadeRenderer = new HillshadeRenderer(mAltitude, mAzimuth,
                mZFactor, mSlopeType, mPixelSizeFactor, mPixelSizePower, mOutputBitDepth);

     * Handle the permissions request response.
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        } else {
            // report to user that permission was denied

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.hillshade_parameters, menu);
        return super.onCreateOptionsMenu(menu);

    public boolean onOptionsItemSelected(MenuItem item) {
        ParametersDialogFragment paramDialog = new ParametersDialogFragment();
        Bundle hillshadeParameters = new Bundle();
        //send parameters to fragment
        hillshadeParameters.putInt("altitude", mAltitude);
        hillshadeParameters.putInt("azimuth", mAzimuth);
        hillshadeParameters.putSerializable("slope_type", mSlopeType);
        paramDialog.show(mFragmentManager, "param_dialog");
        return super.onOptionsItemSelected(item);

    protected void onPause() {

    protected void onResume() {