// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/omGraphics/grid/ElevationBandGenerator.java,v $ // $RCSfile: ElevationBandGenerator.java,v $ // $Revision: 1.2 $ // $Date: 2005/12/22 18:46:21 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.omGraphics.grid; import com.bbn.openmap.proj.Length; /** * The ElevationBandGenerator is an OMGridGenerator that creates an OMRaster out * of OMGrid data. The OMgrid data is assumed to be meter elevation points, and * the colors given to the pixels in the raster reflect the values as dictated * by the Length units. The colortable given to the generator determines the * colors used, and the band height sets the elevation range for each color. */ public class ElevationBandGenerator extends SimpleColorGenerator { public static final int DEFAULT_BANDHEIGHT = 100; public static final int DEFAULT_ADJUST = 3; /** * The colors to use. The colors[0] is assumed to be the 0 elevation color, * and by default, is a light blue color. */ protected int[] colors; /** * A number between 1-5 to adjust the contrast a little between the colors. */ protected int adjust = DEFAULT_ADJUST; /** * The elevation difference between the edges of a color - or how much the * elevation must change before a pixel gets the next color. */ protected int bandHeight = DEFAULT_BANDHEIGHT; // meters protected Length dataUnits = Length.METER; protected Length displayUnits = Length.METER; public ElevationBandGenerator() { setColortable(createGreyscaleColors(216, 255)); } /** * Takes the value assigned to a pixel, as determined by it's location in * the grid, and gives it a color to be painted by. In this case, the pixel * is colored according to the elevation value. * * @param source a grid point value assigned to the raster pixel. * @return the ARGB to color the pixel. */ public int calibratePointValue(int source) { if (source < -500) { return 0; // clear, nothing is that low... } if (source == 0) { return colors[0]; // water blue, assumed. } if (displayUnits != dataUnits) { source = (int) displayUnits.fromRadians(dataUnits.toRadians(source)); } // I'm not really sure how all this works out - I wrote it a // while ago, and it works, so I'm leaving well enough alone. // Some notes from before: // Start at the darkest color, and then go up through the // colormap for each band height, the start back at the // darkest when you get to the last color. To make this // more useful, I limit the number of colors (10) used - if // there isn;t enough contrast between the colors, you can't // see the bands. The contrast adjustment in 24-bit color // mode(216 colors) lets you add a few colors. int assignment = (int) (((source / bandHeight) % (10 - 2 * (3 - adjust)) * (colors.length / (10 - 2 * (3 - adjust)))) + 6); return colors[assignment]; } public void setColortable(int[] colors) { this.colors = colors; } public int[] getColortable() { return colors; } public void setColors(ElevationColors ec) { setColortable(ec.getColortable()); } public void setBandHeight(int height) { if (height <= 0) height = DEFAULT_BANDHEIGHT; bandHeight = height; } public int getBandHeight() { return bandHeight; } public void setAdjust(int value) { if (value <= 0 || value > 5) value = DEFAULT_ADJUST; adjust = value; } public int getAdjust() { return adjust; } public Length getDataUnits() { return dataUnits; } public void setDataUnits(Length units) { this.dataUnits = units; } public Length getDisplayUnits() { return displayUnits; } public void setDisplayUnits(Length displayUnits) { this.displayUnits = displayUnits; } }