/** * Swap the grid header, avoiding strings * * @param gh grid header to swap */ private void swapGridHeader(int[] gh) { McIDASUtil.flip(gh, 0, 5); McIDASUtil.flip(gh, 7, 7); McIDASUtil.flip(gh, 9, 10); McIDASUtil.flip(gh, 12, 14); McIDASUtil.flip(gh, 32, 51); }
/** * Initialize this reader. Get the Grid specific info * * @param fullCheck for a full check reading grids * @return true if successful * @throws IOException problem reading the data */ protected boolean init(boolean fullCheck) throws IOException { if (rf == null) { logError("File is null"); return false; } gridIndex = new GridIndex(rf.getLocation()); rf.order(RandomAccessFile.BIG_ENDIAN); int numEntries = Math.abs(readInt(10)); if (numEntries > 1000000) { needToSwap = true; numEntries = Math.abs(McIDASUtil.swbyt4(numEntries)); } if (numEntries > MAX_GRIDS) { return false; } // System.out.println("need to Swap = " + needToSwap); // System.out.println("number entries="+numEntries); // go back to the beginning rf.seek(0); // read the fileheader String label = rf.readString(32); // GEMPAK too closely like McIDAS if (label.indexOf("GEMPAK DATA MANAGEMENT FILE") >= 0) { logError("label indicates this is a GEMPAK grid"); return false; } else { // check that they are all printable ASCII chars for (int i = 0; i < label.length(); i++) { String s0 = label.substring(i, i + 1); if (!(0 <= s0.compareTo(" ") && s0.compareTo("~") <= 0)) { logError("bad label, not a McIDAS grid"); return false; } } } // System.out.println("label = " + label); int project = readInt(8); // System.out.println("Project = " + project); int date = readInt(9); // dates are supposed to be yyyddd, but account for ccyyddd up to year 4000 if ((date < 10000) || (date > 400000)) { logError("date wrong, not a McIDAS grid"); return false; } // System.out.println("date = " + date); int[] entries = new int[numEntries]; for (int i = 0; i < numEntries; i++) { entries[i] = readInt(i + 11); // sanity check that this is indeed a McIDAS Grid file if (entries[i] < -1) { logError("bad grid offset " + i + ": " + entries[i]); return false; } } if (!fullCheck) { return true; } // Don't swap: rf.order(RandomAccessFile.BIG_ENDIAN); for (int i = 0; i < numEntries; i++) { if (entries[i] == -1) { continue; } int[] header = new int[64]; rf.seek(entries[i] * 4); rf.readInt(header, 0, 64); if (needToSwap) { swapGridHeader(header); } try { McIDASGridRecord gr = new McIDASGridRecord(entries[i], header); // if (gr.getGridDefRecordId().equals("CONF X:93 Y:65")) { // if (gr.getGridDefRecordId().equals("CONF X:54 Y:47")) { // figure out how to handle Mercator projections // if ( !(gr.getGridDefRecordId().startsWith("MERC"))) { gridIndex.addGridRecord(gr); if (gdsMap.get(gr.getGridDefRecordId()) == null) { McGridDefRecord mcdef = gr.getGridDefRecord(); // System.out.println("new nav " + mcdef.toString()); gdsMap.put(mcdef.toString(), mcdef); gridIndex.addHorizCoordSys(mcdef); } // } } catch (McIDASException me) { logError("problem creating grid dir"); return false; } } // check to see if there are any grids that we can handle if (gridIndex.getGridRecords().isEmpty()) { logError("no grids found"); return false; } return true; }