// ********************************************************************** // // <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/link/LinkCircle.java,v $ // $RCSfile: LinkCircle.java,v $ // $Revision: 1.6 $ // $Date: 2009/01/21 01:24:41 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.layer.link; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import com.bbn.openmap.omGraphics.OMCircle; import com.bbn.openmap.proj.Length; import com.bbn.openmap.proj.coords.LatLonPoint; import com.bbn.openmap.util.Debug; /** * Reading and writing a Link protocol version of a circle. */ public class LinkCircle implements LinkGraphicConstants, LinkPropertiesConstants { /** * Write a circle with lat/lon placement. * * @param latPoint latitude of center point, decimal degrees * @param lonPoint longitude of center point, decimal degrees * @param w horizontal diameter of circle/ellipse, pixels * @param h vertical diameter of circle/ellipse, pixels * @param properties attributes for the circle. * @param dos DataOutputStream. * @throws IOException */ public static void write(float latPoint, float lonPoint, int w, int h, LinkProperties properties, DataOutputStream dos) throws IOException { LinkCircle.write(latPoint, lonPoint, 0, 0, w, h, properties, dos); } /** * Write a circle with x/y placement. * * @param x1 window position of center point from left of window, in pixels * @param y1 window position of center point from top of window, in pixels * @param w horizontal diameter of circle/ellipse, pixels * @param h vertical diameter of circle/ellipse, pixels * @param properties attributes for the circle. * @param dos DataOutputStream. * @throws IOException */ public static void write(int x1, int y1, int w, int h, LinkProperties properties, DataOutputStream dos) throws IOException { dos.write(Link.CIRCLE_HEADER.getBytes()); dos.writeByte(GRAPHICTYPE_CIRCLE); dos.writeByte(RENDERTYPE_XY); dos.writeInt(x1); dos.writeInt(y1); dos.writeInt(w); dos.writeInt(h); properties.write(dos); } /** * Writing a circle at a x, y, offset to a Lat/Lon location. * * @param latPoint latitude of center of circle/ellipse. * @param lonPoint longitude of center of circle/ellipse. * @param offset_x1 # pixels to the right the center will be moved from * lonPoint. * @param offset_y1 # pixels down that the center will be moved from * latPoint. * @param w horizontal diameter of circle/ellipse, pixels. * @param h vertical diameter of circle/ellipse, pixels. * @param properties attributes for the circle. * @param dos DataOutputStream. * @throws IOException */ public static void write(float latPoint, float lonPoint, int offset_x1, int offset_y1, int w, int h, LinkProperties properties, DataOutputStream dos) throws IOException { dos.write(Link.CIRCLE_HEADER.getBytes()); dos.writeByte(GRAPHICTYPE_CIRCLE); dos.writeByte(RENDERTYPE_OFFSET); dos.writeFloat(latPoint); dos.writeFloat(lonPoint); dos.writeInt(offset_x1); dos.writeInt(offset_y1); dos.writeInt(w); dos.writeInt(h); properties.write(dos); } /** * Write a circle with a certain radius at a Lat/Lon location. Assumes the * radius is in decimal degrees. * * @param latPoint latitude of center point, decimal degrees * @param lonPoint longitude of center point, decimal degrees * @param radius distance in decimal degrees * @param properties attributes for the circle. * @param dos DataOutputStream. * @throws IOException */ public static void write(float latPoint, float lonPoint, float radius, LinkProperties properties, DataOutputStream dos) throws IOException { LinkCircle.write(latPoint, lonPoint, radius, -1, -1, properties, dos); } /** * Write a circle with a certain radius at a Lat/Lon location, and allows * you to specify units of the radius. * * @param latPoint latitude of center of circle in decimal degrees * @param lonPoint longitude of center of circle in decimal degrees * @param radius distance * @param units integer value for units for distance - KM, MILES, NMILES. If * < 0, assume decimal degrees. * @param properties attributes for the circle. * @param dos DataOutputStream. * @throws IOException */ public static void write(float latPoint, float lonPoint, float radius, int units, LinkProperties properties, DataOutputStream dos) throws IOException { LinkCircle.write(latPoint, lonPoint, radius, units, -1, properties, dos); } /** * Write a circle with a certain radius at a Lat/Lon location, and allows * you to specify units of the radius, as well as the number of vertices to * use to approximate the circle. * * @param latPoint latitude of center of circle in decimal degrees * @param lonPoint longitude of center of circle in decimal degrees * @param radius distance * @param units integer value for units for distance - OMCircle.KM, * OMCircle.MILES, OMCircle.NMILES. If < 0, assume decimal * degrees. * @param nverts number of vertices for the poly-circle (if < 3, value is * generated internally). * @param properties attributes for the circle. * @param dos DataOutputStream. * @throws IOException */ public static void write(float latPoint, float lonPoint, float radius, int units, int nverts, LinkProperties properties, DataOutputStream dos) throws IOException { // Write this out... dos.write(Link.CIRCLE_HEADER.getBytes()); dos.writeByte(GRAPHICTYPE_CIRCLE); dos.writeByte(RENDERTYPE_LATLON); dos.writeFloat(latPoint); dos.writeFloat(lonPoint); dos.writeFloat(radius); dos.writeByte(units); dos.writeInt(nverts); properties.write(dos); } public static void write(OMCircle circle, Link link, LinkProperties props) throws IOException { LatLonPoint llp; switch (circle.getRenderType()) { case OMCircle.RENDERTYPE_LATLON: llp = circle.getLatLon(); LinkCircle.write((float) llp.getLatitude(), (float) llp.getLongitude(), (float) circle.getRadius(), props, link.dos); break; case OMCircle.RENDERTYPE_XY: LinkCircle.write(circle.getX(), circle.getY(), circle.getWidth(), circle.getHeight(), props, link.dos); break; case OMCircle.RENDERTYPE_OFFSET: llp = circle.getLatLon(); LinkCircle.write(llp.getLatitude(), llp.getLongitude(), circle.getOffX(), circle.getOffY(), circle.getWidth(), circle.getHeight(), props, link.dos); break; default: Debug.error("LinkCircle.write: circle rendertype unknown."); } } /** * Read the circle protocol off the data input, and return an OMCircle. * Assumes the header for the graphic has already been read. * * @param dis the DataInputStream * @return OMCircle * @throws IOException * @see com.bbn.openmap.omGraphics.OMCircle */ public static OMCircle read(DataInputStream dis) throws IOException { return read(dis, null); } /** * Read the circle protocol off the data input, and return an OMCircle. * Assumes the header for the graphic has already been read. * * @param dis the DataInputStream * @param propertiesBuffer a LinkProperties object used to cache previous * settings that can be set on the OMPoly being read. * @return OMCircle * @throws IOException * @see com.bbn.openmap.omGraphics.OMCircle */ public static OMCircle read(DataInputStream dis, LinkProperties propertiesBuffer) throws IOException { OMCircle circle = null; float lat, lon, radius; int x, y, w, h; int renderType = dis.readByte(); switch (renderType) { case RENDERTYPE_LATLON: lat = dis.readFloat(); lon = dis.readFloat(); radius = dis.readFloat(); int units = dis.readByte(); int nverts = dis.readInt(); Length unit = Length.DECIMAL_DEGREE; switch (units) { case 0: unit = Length.KM; break; case 1: unit = Length.MILE; break; case 2: unit = Length.NM; break; default: } circle = new OMCircle(new LatLonPoint.Double(lat, lon), radius, unit, nverts); break; case RENDERTYPE_XY: x = dis.readInt(); y = dis.readInt(); w = dis.readInt(); h = dis.readInt(); circle = new OMCircle(x, y, w, h); break; case RENDERTYPE_OFFSET: lat = dis.readFloat(); lon = dis.readFloat(); x = dis.readInt(); y = dis.readInt(); w = dis.readInt(); h = dis.readInt(); circle = new OMCircle(lat, lon, x, y, w, h); break; default: } if (circle != null) { LinkProperties.loadPropertiesIntoOMGraphic(dis, circle, propertiesBuffer); } return circle; } }