Colormap Renderer

Screenshot of Colormap Renderer App

Description

Demonstrates how to use a ColormapRenderer on RasterLayer. ColormapRenderer can be used to replace values on a RasterLayer with a color based on the original value brightness.

How it Works

To apply a ColormapRenderer to a RasterLayer:

  1. Create a Raster from a raster file.
  2. Create a RasterLayer from the Raster.
  3. Create a List<Integer> representing colors. Colors at the beginning of the list replace the darkest values in the raster and colors at the end of the list replaced the brightest values of the raster.
  4. Create a ColormapRenderer with the color list and apply it to the RasterLayer with rasterLayer.setRasterRenderer(colormapRenderer).

Features

  • ArcGISMap
  • Basemap
  • ColormapRenderer
  • MapView
  • Raster
  • RasterLayer

Provision your device

  1. Download the shasta-bw.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 ShastaBW/. /sdcard/ArcGIS/samples/raster

LinkLocal Location

shasta-bw.zip

<sdcard>/ArcGIS/samples/raster/ShastaBW.tif

Code

/* 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.arcgisruntime.sample.colormaprenderer;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.esri.arcgisruntime.layers.RasterLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.raster.ColormapRenderer;
import com.esri.arcgisruntime.raster.Raster;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * A sample class which demonstrates the ColorMapRenderer.
 */
public class MainActivity extends AppCompatActivity {

  private MapView mMapView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // retrieve the MapView from layout
    mMapView = (MapView) findViewById(R.id.mapView);
    // 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) {
      loadRaster();
    } else {
      // request permission
      ActivityCompat.requestPermissions(MainActivity.this, reqPermission, requestCode);
    }
  }

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

  /**
   * Loads ShastaBW.tif as a Raster and adds it to a new RasterLayer. RasterLayer is then added to the map as an
   * operational layer. A List of color values is created (0-149: red) (150-250: yellow). The List is passed to a new
   * ColorMapRenderer, which is then set to the RasterLayer Rendererer. Map viewpoint is then set based on Raster
   * geometry.
   */
  private void loadRaster() {
    // create a raster from a local raster file
    Raster raster = new Raster(buildRasterPath());
    // create a raster layer
    final RasterLayer rasterLayer = new RasterLayer(raster);
    // create a Map with imagery basemap
    ArcGISMap map = new ArcGISMap(Basemap.createImagery());
    // add the map to a map view
    mMapView.setMap(map);
    // add the raster as an operational layer
    map.getOperationalLayers().add(rasterLayer);
    // create a color map where values 0-149 are red (Color.RED) and 150-250 are yellow (Color.Yellow)
    List<Integer> colors = new ArrayList<>();
    for (int i = 0; i <= 250; i++) {
      if (i < 150) {
        colors.add(i, Color.RED);
      } else {
        colors.add(i, Color.YELLOW);
      }
    }
    // create a colormap renderer
    ColormapRenderer colormapRenderer = new ColormapRenderer(colors);
    // set the ColormapRenderer on the RasterLayer
    rasterLayer.setRasterRenderer(colormapRenderer);
    // set Viewpoint on the Raster
    rasterLayer.addDoneLoadingListener(new Runnable() {
      @Override
      public void run() {
        mMapView.setViewpointGeometryAsync(rasterLayer.getFullExtent(), 50);
      }
    });
  }

  /**
   * 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) {
      loadRaster();
    } else {
      // report to user that permission was denied
      Toast.makeText(MainActivity.this,
          getResources().getString(R.string.location_permission_denied),
          Toast.LENGTH_SHORT).show();
    }
  }

  @Override
  protected void onPause() {
    super.onPause();
    mMapView.pause();
  }

  @Override
  protected void onResume() {
    super.onResume();
    mMapView.resume();
  }
}