/* * Copyright (C) 2015 by Array Systems Computing Inc. http://www.array.ca * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package org.esa.s1tbx.io.gamma.header; import org.esa.s1tbx.io.gamma.GammaProductWriter; import org.esa.snap.core.datamodel.GeoPos; import org.esa.snap.core.datamodel.PixelPos; import org.esa.snap.core.datamodel.Product; import org.opengis.referencing.ReferenceIdentifier; import org.opengis.referencing.crs.CoordinateReferenceSystem; import uk.me.jstott.jcoord.LatLng; import uk.me.jstott.jcoord.UTMRef; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; /** * Writer par header */ public class HeaderDEMWriter extends HeaderWriter { private double cornerNorth, cornerEast; private String easting, northing, centralMeridian, latitudeOfOrigin, scaleFactor; public HeaderDEMWriter(final GammaProductWriter writer, final Product srcProduct, final File userOutputFile) { super(writer, srcProduct, userOutputFile); } @Override public void writeParFile() throws IOException { final String oldEOL = System.getProperty("line.separator"); System.setProperty("line.separator", "\n"); final FileOutputStream out = new FileOutputStream(outputFile); try (final PrintStream p = new PrintStream(out)) { p.println(GammaConstants.HEADER_KEY_NAME + sep + srcProduct.getName()); p.println(GammaConstants.HEADER_KEY_WIDTH + sep + srcProduct.getSceneRasterWidth()); p.println(GammaConstants.HEADER_KEY_NLINES + sep + srcProduct.getSceneRasterHeight()); p.println(GammaConstants.HEADER_KEY_DATA_FORMAT + sep + getDataType()); final String demProjection = getDEMProjection(); getCornerCoords(); p.println(GammaConstants.HEADER_KEY_DEM_PROJECTION + sep + demProjection); p.println(GammaConstants.HEADER_KEY_DEM_HGT_OFFSET + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_DEM_SCALE + sep + "1.0"); p.println(GammaConstants.HEADER_KEY_DEM_CORNER_NORTH + sep + cornerNorth); p.println(GammaConstants.HEADER_KEY_DEM_CORNER_EAST + sep + cornerEast); p.println(GammaConstants.HEADER_KEY_DEM_POST_NORTH + sep + "90"); p.println(GammaConstants.HEADER_KEY_DEM_POST_EAST + sep + "90"); p.println(GammaConstants.HEADER_KEY_DATUM_NAME + sep + "WGS84"); p.println(GammaConstants.HEADER_KEY_DATUM_SHIFT_DX + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_DATUM_SHIFT_DY + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_DATUM_SHIFT_DZ + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_DATUM_SCALE + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_DATUM_ROTATION_ALPHA + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_DATUM_ROTATION_BETA + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_DATUM_ROTATION_GAMMA + sep + "0.0"); p.println(GammaConstants.HEADER_KEY_PROJECTION_NAME + sep + demProjection); if(demProjection.equals(GammaConstants.PROJECTION_UTM)) { p.println(GammaConstants.HEADER_KEY_PROJECTION_ZONE + sep + getUTMZone()); p.println(GammaConstants.HEADER_KEY_PROJECTION_FALSE_EASTING + sep + easting); p.println(GammaConstants.HEADER_KEY_PROJECTION_FALSE_NORTHING + sep + northing); p.println(GammaConstants.HEADER_KEY_PROJECTION_CENTER_LON + sep + centralMeridian); p.println(GammaConstants.HEADER_KEY_PROJECTION_CENTER_LAT + sep + latitudeOfOrigin); p.println(GammaConstants.HEADER_KEY_PROJECTION_K0 + sep + scaleFactor); } p.flush(); } catch (Exception e) { throw new IOException("GammaWriter unable to write par file " + e.getMessage()); } finally { System.setProperty("line.separator", oldEOL); } } private void getCornerCoords() { GeoPos geoPos = srcProduct.getSceneGeoCoding().getGeoPos(new PixelPos(0, 0), null); LatLng latLng = new LatLng(geoPos.lat, geoPos.lon); UTMRef utm = latLng.toUTMRef(); cornerNorth = utm.getNorthing(); cornerEast = utm.getEasting(); } private String getDEMProjection() { CoordinateReferenceSystem crs = srcProduct.getSceneCRS(); ReferenceIdentifier id = crs.getName(); if(id.getCode().contains(GammaConstants.PROJECTION_UTM)) { String wkt = crs.toWKT(); easting = wkt.substring(wkt.indexOf("false_easting")+15); easting = easting.substring(0, easting.indexOf(']')).trim(); northing = wkt.substring(wkt.indexOf("false_northing")+16); northing = northing.substring(0, northing.indexOf(']')).trim(); centralMeridian = wkt.substring(wkt.indexOf("central_meridian")+18); centralMeridian = centralMeridian.substring(0, centralMeridian.indexOf(']')).trim(); latitudeOfOrigin = wkt.substring(wkt.indexOf("latitude_of_origin")+20); latitudeOfOrigin = latitudeOfOrigin.substring(0, latitudeOfOrigin.indexOf(']')).trim(); scaleFactor = wkt.substring(wkt.indexOf("scale_factor")+14); scaleFactor = scaleFactor.substring(0, scaleFactor.indexOf(']')).trim(); return GammaConstants.PROJECTION_UTM; } return ""; } private String getUTMZone() { GeoPos centerPos = srcProduct.getSceneGeoCoding().getGeoPos(new PixelPos(srcProduct.getSceneRasterWidth()/2, srcProduct.getSceneRasterHeight()/2), null); int zone = (int) Math.floor(centerPos.getLon()/6+31); return String.valueOf(zone); } @Override protected String getDataType() { return "REAL*4"; } }