// ********************************************************************** // // <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/layer/location/ByteRasterLocation.java,v $ // $RCSfile: ByteRasterLocation.java,v $ // $Revision: 1.5 $ // $Date: 2009/01/21 01:24:42 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.layer.location; /* Java Core */ import java.awt.Point; import javax.swing.ImageIcon; import com.bbn.openmap.layer.DeclutterMatrix; import com.bbn.openmap.omGraphics.OMRaster; import com.bbn.openmap.omGraphics.OMRasterObject; import com.bbn.openmap.proj.Projection; /** * A Location that takes a byte array and creates a Raster for a Location * marker. The byte array should be the contents of an image file (gif, jpeg) * that an ImageIcon object can use to create an Image object. */ public class ByteRasterLocation extends Location { /** The spacing between the label and the outside of the image. */ public int SPACING = 0; /** * Create a ByteRasterLocation at a latitude/longitude location. * * @param latitude latitide in decimal degrees * @param longitude longitude in decimal degrees. * @param name the label for the location. * @param bytearr a byte array from an image file that an ImageIcon can use * to create an Image icon. Can also be the binary contents of an * image from a database query. */ public ByteRasterLocation(double latitude, double longitude, String name, byte bytearr[]) { super(latitude, longitude, name, getIconRaster(latitude, longitude, bytearr)); if (location instanceof OMRaster) { setHorizontalLabelBuffer((((OMRaster) location).getWidth() / 2) + SPACING); } } /** * Create a ByteRasterLocation at a screen x/y location. * * @param x horizontal pixel screen location from the the left side of the * map. * @param y vertical pixel screen location, from the top of the map. * @param name the label for the location. * @param bytearr a byte array from an image file that an ImageIcon can use * to create an Image icon. Can also be the binary contents of an * image from a database query. */ public ByteRasterLocation(int x, int y, String name, byte bytearr[]) { super(x, y, name, getIconRaster(x, y, bytearr)); if (location instanceof OMRaster) { setHorizontalLabelBuffer((((OMRaster) location).getWidth() / 2) + SPACING); } } /** * Create a ByteRasterLocation at a screen x/y location. * * @param latitude latitide in decimal degrees * @param longitude longitude in decimal degrees. * @param xOffset horizontal pixel screen location from the longitude map * point. * @param yOffset vertical pixel screen location, from the latitide map * point. * @param name the label for the location. * @param bytearr a byte array from an image file that an ImageIcon can use * to create an Image icon. Can also be the binary contents of an * image from a database query. */ public ByteRasterLocation(double latitude, double longitude, int xOffset, int yOffset, String name, byte bytearr[]) { super(latitude, longitude, xOffset, yOffset, name, getIconRaster(latitude, longitude, xOffset, yOffset, bytearr)); if (location instanceof OMRaster) { setHorizontalLabelBuffer((((OMRaster) location).getWidth() / 2) + SPACING); } } /** * Create an OMRaster at a latitude/longitude, from a image byte array. * * @param lat latitide in decimal degrees * @param lon longitude in decimal degrees. * @param bytearr a byte array from an image file that an ImageIcon can use * to create an Image icon. Can also be the binary contents of an * image from a database query. */ public static OMRaster getIconRaster(double lat, double lon, byte bytearr[]) { ImageIcon icon = getIconRaster(bytearr); if (icon == null) return null; int offX = icon.getIconWidth() / 2; int offY = icon.getIconHeight() / 2; return new OMRaster(lat, lon, -offX, -offY, icon); } /** * Create a x/y OMRaster with an image byte array. * * @param x horizontal pixel screen location from the the left side of the * map. * @param y vertical pixel screen location, from the top of the map. * @param bytearr a byte array from an image file that an ImageIcon can use * to create an Image icon. Can also be the binary contents of an * image from a database query. */ public static OMRaster getIconRaster(int x, int y, byte bytearr[]) { ImageIcon icon = getIconRaster(bytearr); if (icon == null) return null; int offX = icon.getIconWidth() / 2; int offY = icon.getIconHeight() / 2; return new OMRaster(x - offX, y - offY, icon); } /** * Create a lat/lon OMRaster, pffset to a certain pixel location, with an * image byte array. * * @param lat latitide in decimal degrees * @param lon longitude in decimal degrees. * @param x horizontal pixel screen location from the longitude map point. * @param y vertical pixel screen location, from the latitide map point. * @param bytearr a byte array from an image file that an ImageIcon can use * to create an Image icon. Can also be the binary contents of an * image from a database query. */ public static OMRaster getIconRaster(double lat, double lon, int x, int y, byte bytearr[]) { ImageIcon icon = getIconRaster(bytearr); if (icon == null) return null; int offX = icon.getIconWidth() / 2; int offY = icon.getIconHeight() / 2; return new OMRaster(lat, lon, x - offX, y - offY, icon); } /** * Create an ImageIcon from a byte array. The byte array should reflect the * contents of a standard image file. */ public static ImageIcon getIconRaster(byte bytearr[]) { if (bytearr == null) return null; ImageIcon icon = new ImageIcon(bytearr); return icon; } /** * Given the label is this location has a height and width, find a clean * place on the map for it. Assumes label is not null. * * @param declutter the DeclutterMatrix for the map. */ protected void declutterLabel(DeclutterMatrix declutter, Projection proj) { super.declutterLabel(declutter, proj); if (isShowLocation()) { // Take up space with the label if (location instanceof OMRasterObject) { Point lp = ((OMRasterObject) location).getMapLocation(); // This location is the upper left location of the // declutter matrix. The declutter matrix works from // lower left to upper right. if (lp != null) { int locHeight = ((OMRasterObject) location).getHeight(); int locWidth = ((OMRasterObject) location).getWidth(); // Need to get this right for the DeclutterMatrix // space, but changing lp changes where the // location will appear - fix this later. lp.y += locHeight; declutter.setTaken(lp, locWidth, locHeight); // Reset it to the original projected location. lp.y -= locHeight; } } } } /** * Given a new latitude/longitude, reposition the graphic and label. */ public void setGraphicLocations(double latitude, double longitude) { if (location instanceof OMRaster) { OMRaster ras = (OMRaster) location; ras.setLat(latitude); ras.setLon(longitude); label.setLat(latitude); label.setLon(longitude); setHorizontalLabelBuffer((ras.getWidth() / 2) + SPACING); } } /** * Given a new x/y screen location, reposition the graphic and label. */ public void setGraphicLocations(int x, int y) { if (location instanceof OMRaster) { OMRaster ras = (OMRaster) location; ras.setX(x); ras.setY(y); label.setX(x); label.setY(y); setHorizontalLabelBuffer((ras.getWidth() / 2) + SPACING); } } /** * Given a new latitude/longitude with x/y offset points, reposition the * graphic and label. */ public void setGraphicLocations(double latitude, double longitude, int offsetX, int offsetY) { if (location instanceof OMRaster) { OMRaster ras = (OMRaster) location; ras.setLat(latitude); ras.setLon(longitude); ras.setX(offsetX); ras.setY(offsetY); label.setLat(latitude); label.setLon(longitude); label.setX(offsetX); label.setY(offsetY); setHorizontalLabelBuffer((ras.getWidth() / 2) + SPACING); } } }