001 //$HeadURL$ 002 /*---------------- FILE HEADER ------------------------------------------ 003 This file is part of deegree. 004 Copyright (C) 2001-2008 by: 005 Department of Geography, University of Bonn 006 http://www.giub.uni-bonn.de/deegree/ 007 lat/lon GmbH 008 http://www.lat-lon.de 009 010 This library is free software; you can redistribute it and/or 011 modify it under the terms of the GNU Lesser General Public 012 License as published by the Free Software Foundation; either 013 version 2.1 of the License, or (at your option) any later version. 014 This library is distributed in the hope that it will be useful, 015 but WITHOUT ANY WARRANTY; without even the implied warranty of 016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 Lesser General Public License for more details. 018 You should have received a copy of the GNU Lesser General Public 019 License along with this library; if not, write to the Free Software 020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 021 Contact: 022 023 Andreas Poth 024 lat/lon GmbH 025 Aennchenstr. 19 026 53177 Bonn 027 Germany 028 E-Mail: poth@lat-lon.de 029 030 Prof. Dr. Klaus Greve 031 Department of Geography 032 University of Bonn 033 Meckenheimer Allee 166 034 53115 Bonn 035 Germany 036 E-Mail: greve@giub.uni-bonn.de 037 ---------------------------------------------------------------------------*/ 038 039 package org.deegree.io.oraclegeoraster; 040 041 import java.io.BufferedReader; 042 import java.io.File; 043 import java.io.FileReader; 044 import java.io.FileWriter; 045 import java.io.IOException; 046 import java.io.PrintWriter; 047 import java.io.Reader; 048 import java.sql.CallableStatement; 049 import java.sql.Connection; 050 import java.sql.ResultSet; 051 import java.sql.SQLException; 052 import java.sql.Statement; 053 import java.text.DecimalFormat; 054 import java.text.NumberFormat; 055 import java.util.Locale; 056 057 import org.deegree.framework.log.ILogger; 058 import org.deegree.framework.log.LoggerFactory; 059 import org.deegree.framework.util.StringTools; 060 061 import oracle.jdbc.OraclePreparedStatement; 062 import oracle.spatial.georaster.GeoRasterAdapter; 063 import oracle.sql.STRUCT; 064 065 /** 066 * This class offers one public static method for importing an image read from a file 067 * into Oracle GeoRaster Database. To work correctly following assumptions are made: 068 * <ul> 069 * <li>a worldfile is assigend to the image file 070 * <li>DLLTrigger has been set for RDT-Table 071 * <li>no mosaicing and pyramid calculations will be perform by this class 072 * </ul> 073 * 074 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 075 * @author last edited by: $Author: poth $ 076 * 077 * @version. $Revision: 6251 $, $Date: 2007-03-19 16:59:28 +0100 (Mo, 19 Mrz 2007) $ 078 */ 079 public class GeoRasterWriter { 080 081 private static final ILogger LOG = LoggerFactory.getLogger( GeoRasterWriter.class ); 082 083 /** 084 * 085 * @param connection 086 * database connection 087 * @param imageFile 088 * absolut path to the image file to import 089 * @param worldFilename 090 * name of the images worldfile 091 * @param rdtName 092 * name of the RDT table 093 * @param imageTableName 094 * name of the tabvle to store the image 095 * @param georColName 096 * name of the GeoRaster column in imageTableName 097 * @throws Exception 098 */ 099 public static void importRaster( Connection connection, String imageFile, String worldFilename, String rdtName, 100 String imageTableName, String georColName ) 101 throws Exception { 102 103 try { 104 105 connection.setAutoCommit( false ); 106 107 Statement stat = connection.createStatement(); 108 String sql = null; 109 ResultSet resSet = null; 110 111 sql = "select max(id) from " + imageTableName; 112 113 resSet = stat.executeQuery( sql ); 114 if ( !resSet.next() ) { 115 throw new SQLException( "Error initializing ID" ); 116 } 117 int newRasterID = resSet.getInt( 1 ); 118 newRasterID++; 119 sql = StringTools.concat( 500, "insert into ", imageTableName, "( ID, ", georColName, ") ", "values ( ", 120 newRasterID, ", MDSYS.sdo_geor.init( '", rdtName, "' ) )" ); 121 LOG.logInfo( sql ); 122 stat.execute( sql ); 123 124 // RASTERPROPERTY 125 sql = "SELECT a." + georColName + ".rasterid FROM " + imageTableName + " a where id = " + newRasterID; 126 resSet = stat.executeQuery( sql ); 127 LOG.logInfo( sql ); 128 if ( !resSet.next() ) { 129 throw new SQLException( "Error initializing rasterID" ); 130 } 131 int rasterID = resSet.getInt( 1 ); 132 133 resSet.close(); 134 stat.close(); 135 136 String s7 = StringTools.concat( 500, "SELECT ", georColName, " FROM ", imageTableName, " a where a.", 137 georColName, ".rasterid = ? and a.", georColName, ".rasterdatatable = ?" ); 138 LOG.logInfo( s7 ); 139 140 OraclePreparedStatement oraclepreparedstatement = (OraclePreparedStatement) connection.prepareStatement( s7 ); 141 142 oraclepreparedstatement.setInt( 1, rasterID ); 143 oraclepreparedstatement.setString( 2, rdtName ); 144 ResultSet resultset = null; 145 146 resultset = oraclepreparedstatement.executeQuery(); 147 148 if ( !resultset.next() ) { 149 throw new SQLException( "No georaster object exists at rasterid = " + rasterID + ", RDT = " + rdtName ); 150 } 151 152 STRUCT struct = (STRUCT) resultset.getObject( georColName.toUpperCase() ); 153 oracle.sql.Datum adatum[] = struct.getOracleAttributes(); 154 oraclepreparedstatement.close(); 155 156 if ( adatum[0] != null || adatum[1] != null || adatum[4] != null ) { 157 158 String s9 = "delete from " + rdtName + " where rasterid = " + rasterID; 159 CallableStatement callablestatement = connection.prepareCall( s9 ); 160 LOG.logInfo( s9 ); 161 callablestatement.execute(); 162 String s10 = StringTools.concat( 1000, "declare\ngeor SDO_GEORASTER;\nbegin\nselect ", georColName, 163 " into geor from ", imageTableName, " a where a.", georColName, 164 ".rasterid = ", rasterID, " and a.", georColName, 165 ".rasterdatatable = '", rdtName, "' for update;\n", 166 "geor := sdo_geor.init('", rdtName, "', ", rasterID, ");\n", 167 "update ", imageTableName, " a set ", georColName, " = geor where a.", 168 georColName, ".rasterid = ", rasterID, " and a.", georColName, 169 ".rasterdatatable = '", rdtName, "';commit;end;" ); 170 CallableStatement callablestatement1 = connection.prepareCall( s10 ); 171 LOG.logInfo( s10 ); 172 callablestatement1.execute(); 173 } 174 175 File f = null; 176 try { 177 // FIXME this is not so fine: creatign 2 files, one of which is empty 178 // not so bad, because they get deleted when Importer ends; fix if time 179 // availab 180 f = File.createTempFile( "temp_wld", "tfw" ); 181 f.deleteOnExit(); 182 saveWorldFile( f.getAbsolutePath(), createParsFromWorldfile( new FileReader( worldFilename ) ), true ); 183 184 } catch ( Exception e ) { 185 LOG.logError( e.getMessage(), e ); 186 } 187 188 STRUCT struct1 = GeoRasterAdapter.loadFromFile( "", imageFile, "WORLDFILE", f.getAbsolutePath() + ".tfw", 189 "blocking=true", struct, connection ); 190 191 if ( struct1 != null ) { 192 // Raster_relief_imp 193 String s8 = StringTools.concat( 500, "UPDATE ", imageTableName, " a SET a.", georColName, 194 " = ? WHERE a.", georColName, ".rasterid = ? and a.", georColName, 195 ".rasterdatatable = ?" ); 196 LOG.logInfo( s8 ); 197 OraclePreparedStatement oraclepreparedstatement1 = (OraclePreparedStatement) connection.prepareStatement( s8 ); 198 oraclepreparedstatement1.setObject( 1, struct1 ); 199 oraclepreparedstatement1.setInt( 2, rasterID ); 200 oraclepreparedstatement1.setString( 3, rdtName ); 201 oraclepreparedstatement1.execute(); 202 oraclepreparedstatement1.close(); 203 } else { 204 throw new SQLException( "\nThe georaster object is not loaded correctly!!" ); 205 } 206 if ( resultset != null ) { 207 resultset.close(); 208 } 209 210 connection.commit(); 211 LOG.logInfo( "commited" ); 212 } catch ( Exception e ) { 213 LOG.logError( e.getMessage(), e ); 214 throw new RuntimeException( e ); 215 } 216 } 217 218 public static double[] createParsFromWorldfile( Reader reader ) 219 throws Exception { 220 double[] pars = null; 221 DecimalFormat decimalformat = (DecimalFormat) NumberFormat.getInstance( Locale.ENGLISH ); 222 BufferedReader bufferedreader = null; 223 try { 224 bufferedreader = new BufferedReader( reader ); 225 double d = decimalformat.parse( bufferedreader.readLine().trim() ).doubleValue(); 226 double d1 = decimalformat.parse( bufferedreader.readLine().trim() ).doubleValue(); 227 double d2 = decimalformat.parse( bufferedreader.readLine().trim() ).doubleValue(); 228 double d3 = decimalformat.parse( bufferedreader.readLine().trim() ).doubleValue(); 229 double d4 = decimalformat.parse( bufferedreader.readLine().trim() ).doubleValue(); 230 double d5 = decimalformat.parse( bufferedreader.readLine().trim() ).doubleValue(); 231 232 decimalformat = (DecimalFormat) DecimalFormat.getInstance( Locale.GERMAN ); 233 decimalformat.setDecimalSeparatorAlwaysShown( true ); 234 decimalformat.setGroupingUsed( false ); 235 decimalformat.setMinimumFractionDigits( 1 ); 236 pars = new double[] { d, d1, d2, d3, d4, d5 }; 237 238 } catch ( Exception e ) { 239 e.printStackTrace(); 240 } 241 bufferedreader.close(); 242 return pars; 243 } 244 245 private static void saveWorldFile( String filename, double[] wldPars, boolean reformat ) 246 throws IOException { 247 248 StringBuffer sb = new StringBuffer(); 249 250 String[] _wldPars = new String[wldPars.length]; 251 252 DecimalFormat decimalformat = null; 253 if ( reformat ) { // reformat numbers to german locale 254 decimalformat = (DecimalFormat) NumberFormat.getInstance( Locale.GERMAN ); 255 } else { 256 decimalformat = (DecimalFormat) NumberFormat.getInstance( Locale.ENGLISH ); 257 } 258 decimalformat.setDecimalSeparatorAlwaysShown( true ); 259 decimalformat.setGroupingUsed( false ); 260 decimalformat.setMinimumFractionDigits( 1 ); 261 for ( int i = 0; i < _wldPars.length; i++ ) { 262 _wldPars[i] = decimalformat.format( wldPars[i] ); 263 264 } 265 266 sb.append( _wldPars[0] ).append( "\n" ).append( _wldPars[1] ).append( "\n" ); 267 sb.append( _wldPars[2] ).append( "\n" ).append( _wldPars[3] ).append( "\n" ); 268 sb.append( _wldPars[4] ).append( "\n" ).append( _wldPars[5] ).append( "\n" ); 269 270 File f = new File( filename + ".tfw" ); 271 if ( reformat ) {// reformat also menas: only need this file temporarily 272 f.deleteOnExit(); 273 } 274 FileWriter fw = new FileWriter( f ); 275 PrintWriter pw = new PrintWriter( fw ); 276 277 pw.print( sb.toString() ); 278 279 pw.close(); 280 fw.close(); 281 } 282 283 }