// ********************************************************************** // // <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/rpf/RpfTocEntry.java,v $ // $RCSfile: RpfTocEntry.java,v $ // $Revision: 1.7 $ // $Date: 2006/12/13 16:45:25 $ // $Author: dietrick $ // // ********************************************************************** /* * The meat of this code is based on source code provided by * The MITRE Corporation, through the browse application source * code. Many thanks to Nancy Markuson who provided BBN with the * software, and to Theron Tock, who wrote the software, and * Daniel Scholten, who revised it - (c) 1994 The MITRE * Corporation for those parts, and used/distributed with permission. */ package com.bbn.openmap.layer.rpf; import com.bbn.openmap.io.BinaryFile; import com.bbn.openmap.io.FormatException; /** * Reads and holds an entry in the RPF table of contents file. */ public class RpfTocEntry { /** Degrees/pixel. */ public double vertInterval, horizInterval; /** meters/pixel. */ public double vertResolution, horizResolution; public int horizFrames, vertFrames; public RpfFrameEntry[][] frames; public char zone; /* DKS new 7/94 */ public char version; /* 1-9: DKS new 5/3/95 for Dchum */ public boolean Cib; /* Cib vs. cadrg flag */ public String compressionRatio; public String producer; public String scale; public RpfCoverageBox coverage; /* * Since RpfProductInfo changed to enum, there are times where the scale and * scale string can be read out of the A.TOC file and set for entries where * the chart series has those values as VARIOUS or UNDEFINED. They used to * be stored in the RpfProductInfo class, but as it is now an enum, these are * new member variables to hold the A.TOC values. */ public float altScale = 0f; public String altScaleString; /** * Not determined at read-time. RpfTocHandler sets this later, when the * frames are evaluated for their existence. */ public RpfProductInfo info; public RpfTocEntry(BinaryFile binFile, int entryNumber) throws java.io.EOFException, FormatException { this(binFile, 0, entryNumber); } public RpfTocEntry(BinaryFile binFile, int TOCNumber, int entryNumber) throws java.io.EOFException, FormatException { coverage = new RpfCoverageBox(); coverage.tocNumber = TOCNumber; coverage.entryNumber = entryNumber; read(binFile); // Figure out the CADRG projection zone for the coverage. coverage.zone = com.bbn.openmap.proj.CADRG.getProjZone(zone); } public void setInfo(String seriesCode) { info = RpfProductInfo.get(seriesCode.toUpperCase()); if (info != null) { Cib = info.dataType.equalsIgnoreCase("CIB"); coverage.chartCode = info.seriesCode; } else { info = RpfProductInfo.UK; } } public void read(BinaryFile binFile) throws java.io.EOFException, FormatException { /* * e.g. "CADRG" , for type - deduced later, via framename of entry, and * using RpfProductInfo. */ /* String type = */binFile.readFixedLengthString(5); compressionRatio = binFile.readFixedLengthString(5); /* * Same as type - deduced via RpfProductInfo. There is a float scale * inside the info, and a scaleString. */ scale = binFile.readFixedLengthString(12); coverage.scale = RpfTocHandler.textScaleToLong(scale); zone = binFile.readChar(); /* char: 1-9 A-J */ producer = binFile.readFixedLengthString(5); coverage.nw_lat = binFile.readDouble(); coverage.nw_lon = binFile.readDouble(); /* double sw_lat = */binFile.readDouble(); /* double sw_lon = */binFile.readDouble(); /* double ne_lat = */binFile.readDouble(); /* double ne_lon = */binFile.readDouble(); coverage.se_lat = binFile.readDouble(); coverage.se_lon = binFile.readDouble(); vertResolution = binFile.readDouble(); horizResolution = binFile.readDouble(); vertInterval = binFile.readDouble(); horizInterval = binFile.readDouble(); vertFrames = binFile.readInteger(); horizFrames = binFile.readInteger(); coverage.subframeLatInterval = vertInterval * 256.0; coverage.subframeLonInterval = horizInterval * 256.0; } protected boolean isFramesLoaded() { return frames != null; } protected RpfFrameEntry[][] getFrames() { if (frames == null) { frames = new RpfFrameEntry[vertFrames][horizFrames]; for (int j = 0; j < vertFrames; j++) { for (int k = 0; k < horizFrames; k++) { frames[j][k] = new RpfFrameEntry(); } } } return frames; } protected RpfFrameEntry getFrame(int row, int column) { RpfFrameEntry[][] frames = getFrames(); return frames[row][column]; } public String toString() { StringBuffer s = new StringBuffer(); s.append("RpfTocEntry ##################").append("\n"); s.append(" vertInterval ").append(vertInterval).append(", horizInterval ").append(horizInterval).append("\n"); s.append(" vertResolution ").append(vertResolution).append(", horizResolution ").append(horizResolution) .append("\n"); s.append(" horizFrames ").append(horizFrames).append(", vertFrames ").append(vertFrames).append("\n"); s.append(" zone ").append(zone).append("\n"); s.append(" scale ").append(scale).append("\n"); s.append(" version ").append(version).append("\n"); s.append(" Cib ").append(Cib).append("\n"); s.append(" compressionRatio ").append(compressionRatio).append("\n"); s.append(" producer ").append(producer).append("\n"); s.append(coverage); return s.toString(); } }