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.tools.raster;
040
041 import java.awt.image.BufferedImage;
042 import java.awt.image.renderable.ParameterBlock;
043 import java.io.File;
044 import java.net.URI;
045 import java.util.ArrayList;
046 import java.util.List;
047 import java.util.Properties;
048
049 import javax.media.jai.Interpolation;
050 import javax.media.jai.InterpolationBilinear;
051 import javax.media.jai.JAI;
052 import javax.media.jai.RenderedOp;
053
054 import org.deegree.datatypes.QualifiedName;
055 import org.deegree.framework.log.ILogger;
056 import org.deegree.framework.log.LoggerFactory;
057 import org.deegree.framework.util.ConvenienceFileFilter;
058 import org.deegree.framework.util.ImageUtils;
059 import org.deegree.io.dbaseapi.DBaseFile;
060 import org.deegree.model.coverage.grid.WorldFile;
061 import org.deegree.ogcbase.CommonNamespaces;
062
063 /**
064 *
065 *
066 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
067 * @author last edited by: $Author: poth $
068 *
069 * @version. $Revision: 6251 $, $Date: 2007-03-19 16:59:28 +0100 (Mo, 19 Mrz 2007) $
070 */
071 public class Rescaler {
072
073 private static final ILogger LOG = LoggerFactory.getLogger( Rescaler.class );
074
075 private static final URI DEEGREEAPP = CommonNamespaces.buildNSURI( "http://www.deegree.org/app" );
076
077 private static final String APP_PREFIX = "app";
078
079 private String outDir;
080
081 private String format;
082
083 private Interpolation interpolation = new InterpolationBilinear();
084
085 private List<String> fileList;
086
087 private double resolution = 0;
088
089 /**
090 *
091 * @param resolution
092 * @param rootDir
093 * @param outDir
094 * @param format
095 * @param subDirs
096 */
097 Rescaler( double resolution, String rootDir, String outDir, String format, boolean subDirs ) {
098 this.resolution = resolution;
099 this.outDir = outDir;
100 this.format = format;
101 fileList = getFileList( rootDir, subDirs );
102 }
103
104 /**
105 *
106 * @param resolution
107 * @param rootDir
108 * @param outDir
109 * @param dBase
110 * @param format
111 * @param fileColumn
112 * @throws Exception
113 */
114 Rescaler( double resolution, String rootDir, String outDir, String dBase, String format, String fileColumn )
115 throws Exception {
116 this.resolution = resolution;
117 this.outDir = outDir;
118 this.format = format;
119 fileList = getFileList( dBase, fileColumn, rootDir );
120 }
121
122 /**
123 * returns the list of image map files to consider read from a dbase file defined by the dbase
124 * parameter
125 *
126 * @param dbaseFile
127 * name of the dbase file
128 * @param fileColumn
129 * name of the column containing the image map files names
130 * @param baseDir
131 * name of the directory where the image map files are stored if this parameter is
132 * <code>null</code> it is assumed that the image map files are full referenced
133 * within the dbase
134 * @return the list of image map files to consider read from a dbase file defined by the dbase
135 * parameter
136 * @throws Exception
137 */
138 private static List<String> getFileList( String dBaseFile, String fileColumn, String baseDir )
139 throws Exception {
140
141 // handle dbase file extension and file location/reading problems
142 if ( dBaseFile.endsWith( ".dbf" ) ) {
143 dBaseFile = dBaseFile.substring( 0, dBaseFile.lastIndexOf( "." ) );
144 }
145 DBaseFile dbf = new DBaseFile( dBaseFile );
146
147 // sort dbase file contents chronologicaly (oldest first)
148 int cnt = dbf.getRecordNum();
149
150 Object[] mapItems = new Object[cnt];
151 QualifiedName fileC = new QualifiedName( APP_PREFIX, fileColumn.toUpperCase(), DEEGREEAPP );
152
153 for ( int i = 0; i < cnt; i++ ) {
154 // name of map file
155 mapItems[i] = dbf.getFRow( i + 1 ).getDefaultProperty( fileC ).getValue();
156 }
157
158 // extract names of image files from dBase file and attach them to rootDir
159 if ( baseDir == null ) {
160 baseDir = "";
161 } else if ( !baseDir.endsWith( "/" ) && !baseDir.endsWith( "\\" ) ) {
162 baseDir = baseDir + '/';
163 }
164 List<String> imageFiles = new ArrayList<String>( mapItems.length );
165 for ( int i = 0; i < mapItems.length; i++ ) {
166 if ( mapItems[i] != null ) {
167 imageFiles.add( baseDir + mapItems[i] );
168 }
169 }
170
171 return imageFiles;
172 }
173
174 /**
175 * returns the list of image map files to consider read from a defined root directory.
176 *
177 * @param rootDir
178 * root directory where to read image map files
179 * @param subdirs
180 * true if subdirectories of the root directory shall be parsed for image maps too
181 * @return the list of image map files to consider read from a defined root directory.
182 */
183 private static List<String> getFileList( String rootDir, boolean subdirs ) {
184 List<String> list = new ArrayList<String>( 10000 );
185 File file = new File( rootDir );
186 List<String> extensions = new ArrayList<String>();
187 extensions.add( "JPEG" );
188 extensions.add( "JPG" );
189 extensions.add( "BMP" );
190 extensions.add( "PNG" );
191 extensions.add( "GIF" );
192 extensions.add( "TIF" );
193 extensions.add( "TIFF" );
194 extensions.add( "GEOTIFF" );
195 ConvenienceFileFilter cff = new ConvenienceFileFilter( extensions, true );
196 String[] entries = file.list( cff );
197 if ( entries != null ) {
198 for ( int i = 0; i < entries.length; i++ ) {
199 File entry = new File( rootDir + '/' + entries[i] );
200 if ( entry.isDirectory() && subdirs ) {
201 list = readSubDirs( entry, list, cff );
202 } else {
203 list.add( rootDir + '/' + entries[i] );
204 }
205 }
206 }
207 return list;
208 }
209
210 /**
211 *
212 * @param file
213 * @param list
214 * @return
215 */
216 private static List<String> readSubDirs( File file, List<String> list, ConvenienceFileFilter cff ) {
217
218 String[] entries = file.list( cff );
219 if ( entries != null ) {
220 for ( int i = 0; i < entries.length; i++ ) {
221 File entry = new File( file.getAbsolutePath() + '/' + entries[i] );
222 if ( entry.isDirectory() ) {
223 list = readSubDirs( entry, list, cff );
224 } else {
225 list.add( file.getAbsolutePath() + '/' + entries[i] );
226 }
227 }
228 }
229 return list;
230 }
231
232 /**
233 *
234 * @throws Exception
235 */
236 public void process()
237 throws Exception {
238 for ( int i = 0; i < fileList.size(); i++ ) {
239 System.out.print( fileList.get( i ) + "\r" );
240 File file = new File( fileList.get( i ) );
241 BufferedImage image = ImageUtils.loadImage( file );
242 WorldFile wf = WorldFile.readWorldFile( fileList.get( i ), WorldFile.TYPE.CENTER, image.getWidth(),
243 image.getHeight() );
244 float qx = (float)(wf.getResx()/resolution);
245 float qy = (float)(wf.getResy()/resolution);
246
247 ParameterBlock pb = new ParameterBlock();
248 pb.addSource( image );
249 pb.add( qx ); // The xScale
250 pb.add( qy ); // The yScale
251 pb.add( 0.0F ); // The x translation
252 pb.add( 0.0F ); // The y translation
253 pb.add( interpolation ); // The interpolation
254 // Create the scale operation
255 RenderedOp ro = JAI.create( "scale", pb, null );
256 try {
257 image = ro.getAsBufferedImage();
258 } catch ( Exception e ) {
259 e.printStackTrace();
260 }
261
262 wf = new WorldFile( resolution, resolution, 0, 0, wf.getEnvelope() );
263 int p = file.getName().lastIndexOf( '.' );
264 String fileBaseName = file.getName().substring( 0, p );
265 ImageUtils.saveImage( image, outDir + fileBaseName + '.' + format, 1 );
266 WorldFile.writeWorldFile( wf, outDir + fileBaseName );
267 System.gc();
268 }
269 }
270
271 private static void printHelp() {
272 System.out.println();
273 System.out.println( "Parameter description for RasterSplitter:" );
274 System.out.println( "-res : desired raster resolution" );
275 System.out.println( "-format : desired image format of result images (mandatory)" );
276 System.out.println( "-outDir : directory where result images shall be stored (mandatory)" );
277
278 System.out.println( "-rootDir : directory from where images to split will be read (mandatory)" );
279 System.out.println( "-subDirs : (true|false). If 'true' all sub directories of the 'rootDir' " );
280 System.out.println( " will be searched for images too (optional; default = false)" );
281 }
282
283 private static boolean validate( Properties map ) {
284 if ( map.getProperty( "-res" ) == null ) {
285 System.out.println( "-res must be set!" );
286 return false;
287 }
288 if ( map.getProperty( "-format" ) == null ) {
289 System.out.println( "-format must be set!" );
290 return false;
291 }
292 if ( map.getProperty( "-outDir" ) == null ) {
293 System.out.println( "-outDir must be set!" );
294 return false;
295 }
296 if ( map.getProperty( "-rootDir" ) == null ) {
297 System.out.println( "-rootDir must be set!" );
298 return false;
299 }
300 if ( map.getProperty( "-subDirs" ) != null && !"true".equals( map.getProperty( "-subDirs" ) )
301 && !"false".equals( map.getProperty( "-subDirs" ) ) ) {
302 System.out.println( "if -subDirs is set it must be true or false!" );
303 return false;
304 }
305 return true;
306 }
307
308 /**
309 * @param args
310 * @throws Exception
311 */
312 public static void main( String[] args ) throws Exception {
313 Properties map = new Properties();
314 for ( int i = 0; i < args.length; i += 2 ) {
315 map.put( args[i], args[i + 1] );
316 }
317 if ( !validate( map ) ) {
318 printHelp();
319 return;
320 }
321
322 String format = map.getProperty( "-format" );
323 String outDir = map.getProperty( "-outDir" );
324 double res = Double.parseDouble( map.getProperty( "-res" ) );
325 Rescaler rescaler = null;
326 if ( map.get( "-dbaseFile" ) != null ) {
327 String dBaseFile = map.getProperty( "-dbaseFile" );
328 String fileColum = map.getProperty( "-fileColumn" );
329 String baseDir = map.getProperty( "-baseDir" );
330 if ( baseDir == null ) {
331 baseDir = map.getProperty( "-rootDir" );
332 }
333 rescaler = new Rescaler( res, baseDir, outDir, dBaseFile, format, fileColum );
334 } else if ( map.get( "-rootDir" ) != null ) {
335 String rootDir = map.getProperty( "-rootDir" );
336 boolean subDirs = "true".equals( map.get( "-subDirs" ) );
337 rescaler = new Rescaler( res, rootDir, outDir, format, subDirs );
338 } else {
339 LOG.logInfo( map.toString() );
340 System.out.println( "-rootDir or -dbaseFile parameter must be defined" );
341 return;
342 }
343 rescaler.process();
344
345 }
346
347 }