[Schmitzm-commits] r593 - branches/1.0-gt2-2.6/src/schmitzm/geotools/io

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Sat Nov 28 02:11:36 CET 2009


Author: alfonx
Date: 2009-11-28 02:11:36 +0100 (Sat, 28 Nov 2009)
New Revision: 593

Modified:
   branches/1.0-gt2-2.6/src/schmitzm/geotools/io/GeoExportUtil.java
Log:
nur .prj datei schreiben, wenn nicht schon das gleiche drinsteht (more svn friendly)

Modified: branches/1.0-gt2-2.6/src/schmitzm/geotools/io/GeoExportUtil.java
===================================================================
--- branches/1.0-gt2-2.6/src/schmitzm/geotools/io/GeoExportUtil.java	2009-11-28 01:11:09 UTC (rev 592)
+++ branches/1.0-gt2-2.6/src/schmitzm/geotools/io/GeoExportUtil.java	2009-11-28 01:11:36 UTC (rev 593)
@@ -32,8 +32,10 @@
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.io.StringReader;
 
 import javax.imageio.ImageIO;
 
@@ -58,18 +60,19 @@
 /**
  * In dieser Klasse sind Funktionen zum Datenexport von Geo-Daten
  * zusammengefasst.
- * @author <a href="mailto:martin.schmitz at koeln.de">Martin Schmitz</a> (University of Bonn/Germany)
+ * 
+ * @author <a href="mailto:martin.schmitz at koeln.de">Martin Schmitz</a>
+ *         (University of Bonn/Germany)
  * @version 1.0
  */
 public class GeoExportUtil {
-  /**
-   * Diese Methode exportiert eine {@link org.geotools.feature.FeatureCollection}
-   * in das ShapeFile-Format
-   * (<code><i>name</i>.shp <i>name</i>.shx <i>name</i>.dbf</code>).<br>
-   * Baut auf folgenden Geotools-Klassen auf:
-   * <code>
-   * <ul>
-   * <li>{@link ShapefileDataStore       org.geotools.data.shapefile.ShapefileDataStore}</li>
+	/**
+	 * Diese Methode exportiert eine
+	 * {@link org.geotools.feature.FeatureCollection} in das ShapeFile-Format (
+	 * <code><i>name</i>.shp <i>name</i>.shx <i>name</i>.dbf</code>).<br>
+	 * Baut auf folgenden Geotools-Klassen auf: <code>
+	 * <ul>
+	 * <li>{@link ShapefileDataStore       org.geotools.data.shapefile.ShapefileDataStore}</li>
    * <li>{@link FeatureSource            org.geotools.data.FeatureSource}</li>
    * <li>{@link FeatureStore             org.geotools.data.FeatureStore}</li>
    * <li>{@link Transaction              org.geotools.data.Transaction}</li>
@@ -77,171 +80,206 @@
    * <li>{@link FeatureCollectionReader  schmitzm.geotools.feature.FeatureCollectionReader}</li>
    * </ul>
    * </code>
-   * @param  fc      zu exportierende FeatureCollection
-   * @param  outFile Dateiname (Basisname)
-   * @throws java.lang.Exception bei irgendeinem Fehler
-   */
-  public static void writeFeaturesToShapeFile(FeatureCollection<SimpleFeatureType, SimpleFeature> fc, File outFile) throws Exception {
-//      FeatureCollectionReader featureReader = new FeatureCollectionReader(fc);
+	 * 
+	 * @param fc
+	 *            zu exportierende FeatureCollection
+	 * @param outFile
+	 *            Dateiname (Basisname)
+	 * @throws java.lang.Exception
+	 *             bei irgendeinem Fehler
+	 */
+	public static void writeFeaturesToShapeFile(
+			FeatureCollection<SimpleFeatureType, SimpleFeature> fc, File outFile)
+			throws Exception {
+		// FeatureCollectionReader featureReader = new
+		// FeatureCollectionReader(fc);
 
-      // DataStore fuer Ausgabe-Datei oeffnen
-      ShapefileDataStore shpStore = new ShapefileDataStore(outFile.toURI().toURL());
-//      shpStore.createSchema(featureReader.getFeatureType());
-      shpStore.createSchema(fc.getSchema());
-      // FeatureStore aus dem ShapeFile-DataStore ermitteln
-      FeatureSource<SimpleFeatureType, SimpleFeature> source       = shpStore.getFeatureSource();
-      
-      // TODO 26 @Martin?! Du hattest hier gecastet... ob das so noch geht?! 
-      // FeatureStore  featureStore = (FeatureStore)source;
-      FeatureStore<SimpleFeatureType, SimpleFeature>  featureStore = (FeatureStore<SimpleFeatureType, SimpleFeature>)source;
-      
-      
-      // Features schreiben
-      Transaction transaction = featureStore.getTransaction();
-      featureStore.addFeatures( fc );
-      transaction.commit();
-      transaction.close();
-  }
+		// DataStore fuer Ausgabe-Datei oeffnen
+		ShapefileDataStore shpStore = new ShapefileDataStore(outFile.toURI()
+				.toURL());
+		// shpStore.createSchema(featureReader.getFeatureType());
+		shpStore.createSchema(fc.getSchema());
+		// FeatureStore aus dem ShapeFile-DataStore ermitteln
+		FeatureSource<SimpleFeatureType, SimpleFeature> source = shpStore
+				.getFeatureSource();
 
+		// TODO 26 @Martin?! Du hattest hier gecastet... ob das so noch geht?!
+		// FeatureStore featureStore = (FeatureStore)source;
+		FeatureStore<SimpleFeatureType, SimpleFeature> featureStore = (FeatureStore<SimpleFeatureType, SimpleFeature>) source;
 
-  /**
-   * Diese Methode exportiert ein Raster in eine Datei im ArcInfoASCII-Grid-Format.<br>
-   * Baut auf folgenden Geotools-Klassen auf:
-   * <code>
-   * <ul>
-   *   <li>{@link org.geotools.coverage.grid.GridCoverage2D}</li>
+		// Features schreiben
+		Transaction transaction = featureStore.getTransaction();
+		featureStore.addFeatures(fc);
+		transaction.commit();
+		transaction.close();
+	}
+
+	/**
+	 * Diese Methode exportiert ein Raster in eine Datei im
+	 * ArcInfoASCII-Grid-Format.<br>
+	 * Baut auf folgenden Geotools-Klassen auf: <code>
+	 * <ul>
+	 *   <li>{@link org.geotools.coverage.grid.GridCoverage2D}</li>
    *   <li>{@link org.geotools.gce.arcgrid.ArcGridWriter}</li>
    * </ul>
    * </code>
-   * @param grid    zu exportierendes Grid
-   * @param outFile Ausgabe-Datei
-   * @throws java.lang.Exception bei irgendeinem Fehler
-   */
-  public static void writeGridToArcInfoASCII(GridCoverage2D grid, File outFile) throws Exception {
-	  
-	ArcGridWriter arcGridWriter = new ArcGridWriter(outFile);
-	GeneralParameterValue[] parameters = new GeneralParameterValue[] {};
-	arcGridWriter.write(grid, parameters);
-	arcGridWriter.dispose();
-	
-//    Raster raster = grid.getRenderedImage().getData();
-//    Rectangle2D rect = grid.getEnvelope2D();
-//    // Geo-Koordinaten
-//    double x = rect.getX();
-//    double y = rect.getY();
-//    // Zellenbreite
-//    double cellsize = rect.getWidth() / raster.getWidth();
-//    // Exportieren
-////    throw new UnsupportedOperationException("GeoExportUtil.writeGridToArcInfoASCII(.) has still to be breaked from ArcGridRaster dependency!");
-//    ArcGridRaster writer = new ArcGridRaster(new PrintWriter( new FileOutputStream(outFile) ));
-//    writer.writeRaster(raster, x, y, cellsize, false);
-	
-	
-	
-	// Die peojektion wird vom ArcGridWriter automaitsch mit-geschrieben!
-//    // Projektion schreiben
-//    writeProjectionFile( grid.getCoordinateReferenceSystem(),
-//                         IOUtil.changeFileExt(outFile,"prj"));
-  }
+	 * 
+	 * @param grid
+	 *            zu exportierendes Grid
+	 * @param outFile
+	 *            Ausgabe-Datei
+	 * @throws java.lang.Exception
+	 *             bei irgendeinem Fehler
+	 */
+	public static void writeGridToArcInfoASCII(GridCoverage2D grid, File outFile)
+			throws Exception {
 
-  /**
-   * Diese Methode exportiert ein Raster in eine Datei im GeoTiff-Format.
-   * Daneben wird ein entsprechendes World-File (.tfw) erstellt, in dem die
-   * Georeferenz und Aufloesung des TIF hinterlegt wird.
-   * @param grid   zu exportierendes Grid
-   * @param output Ausgabe-Datei
-   * @throws java.lang.Exception bei irgendeinem Fehler
-   */
-  public static void writeGridToGeoTiff(GridCoverage2D grid, File output) throws Exception {
-//    for (int i=0; i<ImageIO.getWriterFormatNames().length;i++)
-//      System.out.println(ImageIO.getWriterFormatNames()[i]);
+		ArcGridWriter arcGridWriter = new ArcGridWriter(outFile);
+		GeneralParameterValue[] parameters = new GeneralParameterValue[] {};
+		arcGridWriter.write(grid, parameters);
+		arcGridWriter.dispose();
 
-    // GeoTiff-File schreiben
-    ImageIO.write( grid.getRenderedImage(), "tif", output );
-    // World-File schreiben
-    writeWorldFile( grid.getRenderedImage().getWidth(),
-                    grid.getRenderedImage().getHeight(),
-                    grid.getEnvelope2D(),
-                    IOUtil.changeFileExt(output,"tfw"));
-    // Projektion schreiben
-    writeProjectionFile( grid.getCoordinateReferenceSystem(),
-                         IOUtil.changeFileExt(output,"prj"));
-  }
+		// Raster raster = grid.getRenderedImage().getData();
+		// Rectangle2D rect = grid.getEnvelope2D();
+		// // Geo-Koordinaten
+		// double x = rect.getX();
+		// double y = rect.getY();
+		// // Zellenbreite
+		// double cellsize = rect.getWidth() / raster.getWidth();
+		// // Exportieren
+		// // throw new
+		// UnsupportedOperationException("GeoExportUtil.writeGridToArcInfoASCII(.) has still to be breaked from ArcGridRaster dependency!");
+		// ArcGridRaster writer = new ArcGridRaster(new PrintWriter( new
+		// FileOutputStream(outFile) ));
+		// writer.writeRaster(raster, x, y, cellsize, false);
 
-  /**
-   * Diese Methode exportiert ein Raster in eine Datei im ArcInfoASCII-Grid-Format.
-   * @param grid    zu exportierendes Grid
-   * @param outFile Ausgabe-Datei
-   * @throws java.lang.Exception bei irgendeinem Fehler
-   */
-  public static void writeGridRasterToArcInfoASCII(WritableGridRaster grid, File outFile) throws Exception {
-    writeGridToArcInfoASCII(
-        GridUtil.convertToGridCoverage2D(grid),
-        outFile
-    );
-  }
+		// Die peojektion wird vom ArcGridWriter automaitsch mit-geschrieben!
+		// // Projektion schreiben
+		// writeProjectionFile( grid.getCoordinateReferenceSystem(),
+		// IOUtil.changeFileExt(outFile,"prj"));
+	}
 
-  /**
-   * Diese Methode exportiert ein Raster in eine Datei im GeoTiff-Format.
-   * Daneben wird ein entsprechendes World-File (.tfw) erstellt, in dem die
-   * Georeferenz und Aufloesung des TIF hinterlegt wird.
-   * @param grid   zu exportierendes Grid
-   * @param output Ausgabe-Datei
-   * @throws java.lang.Exception bei irgendeinem Fehler
-   */
-  public static void writeGridRasterToGeoTiff(WritableGridRaster grid, File output) throws Exception {
-//    for (int i=0; i<ImageIO.getWriterFormatNames().length;i++)
-//      System.out.println(ImageIO.getWriterFormatNames()[i]);
+	/**
+	 * Diese Methode exportiert ein Raster in eine Datei im GeoTiff-Format.
+	 * Daneben wird ein entsprechendes World-File (.tfw) erstellt, in dem die
+	 * Georeferenz und Aufloesung des TIF hinterlegt wird.
+	 * 
+	 * @param grid
+	 *            zu exportierendes Grid
+	 * @param output
+	 *            Ausgabe-Datei
+	 * @throws java.lang.Exception
+	 *             bei irgendeinem Fehler
+	 */
+	public static void writeGridToGeoTiff(GridCoverage2D grid, File output)
+			throws Exception {
+		// for (int i=0; i<ImageIO.getWriterFormatNames().length;i++)
+		// System.out.println(ImageIO.getWriterFormatNames()[i]);
 
-    // GeoTiff-File schreiben
-    BufferedImage im = new BufferedImage(grid.getWidth(), grid.getHeight(),BufferedImage.TYPE_INT_RGB);
-    im.setData(grid);
-    ImageIO.write( im, "tif", output );
-    // World-File schreiben
-    writeWorldFile(grid.getWidth(), grid.getHeight(), grid.getEnvelope(),IOUtil.changeFileExt(output,"tfw"));
-    // Projektion schreiben
-    writeProjectionFile( grid.getCoordinateReferenceSystem(),
-                         IOUtil.changeFileExt(output,"prj"));
-  }
+		// GeoTiff-File schreiben
+		ImageIO.write(grid.getRenderedImage(), "tif", output);
+		// World-File schreiben
+		writeWorldFile(grid.getRenderedImage().getWidth(), grid
+				.getRenderedImage().getHeight(), grid.getEnvelope2D(), IOUtil
+				.changeFileExt(output, "tfw"));
+		// Projektion schreiben
+		writeProjectionFile(grid.getCoordinateReferenceSystem(), IOUtil
+				.changeFileExt(output, "prj"));
+	}
 
-  /**
-   * Schreibt ein World-File (.tfw) fuer ein Grid. Dabei handelt es sich um
-   * eine zeilenweise ASCII-Datei:<br>
-   * <ol>
-   *    <li>Zellengroesse in X-Richtung (in Meter)</li>
-    *   <li>Koeffizient fuer Rotation in Y-Richtung (<b>wird mit 0.0 befuellt</b>!)</li>
-    *   <li>Koeffizient fuer Rotation in X-Richtung (<b>wird mit 0.0 befuellt</b>!)</li>
-    *   <li>negative Zellengroesse in Y-Richtung (in Meter)</li>
-    *   <li>Horizontale Geo-Referenz (Longitude) der nord-westlichen Ecke</li>
-    *   <li>Vertikale Geo-Referenz (Latitude) der nord-westlichen Ecke</li>
-   * </ol>
-   * @param rasterWidth Breite des Rasters (in Zellen)
-   * @param rasterHeight Hoehe des Rasters (in Zellen)
-   * @param envelope Geo-Referenz des Rasters (Position und Ausdehnung)
-   * @param output Datei in die das World-File geschrieben wird
-   * @exception IOException falls die Datei nicht geschrieben werden kann
-   */
-  public static void writeWorldFile(int rasterWidth, int rasterHeight, Rectangle2D envelope, File output) throws IOException {
-    PrintWriter out = new PrintWriter(output);
+	/**
+	 * Diese Methode exportiert ein Raster in eine Datei im
+	 * ArcInfoASCII-Grid-Format.
+	 * 
+	 * @param grid
+	 *            zu exportierendes Grid
+	 * @param outFile
+	 *            Ausgabe-Datei
+	 * @throws java.lang.Exception
+	 *             bei irgendeinem Fehler
+	 */
+	public static void writeGridRasterToArcInfoASCII(WritableGridRaster grid,
+			File outFile) throws Exception {
+		writeGridToArcInfoASCII(GridUtil.convertToGridCoverage2D(grid), outFile);
+	}
 
-    // Zeile 1: Zellengroesse in Meter
-    out.println( envelope.getWidth() / rasterWidth );
-    // Zeile 2: Rotation in Y-Richtung
-    out.println( "0.0" );
-    // Zeile 3: Rotation in X-Richtung
-    out.println( "0.0" );
-    // Zeile 4: ?
-    out.println( - envelope.getHeight() / rasterHeight );
-    // Zeile 5: X-Georeferenz (Longitude) WESTEN
-    out.println( envelope.getX() );
-    // Zeile 6: Y-Georeferenz (Latitude) NORDEN (Im Envelope steht SUEDEN!!)
-    out.println( envelope.getY() + envelope.getHeight() );
+	/**
+	 * Diese Methode exportiert ein Raster in eine Datei im GeoTiff-Format.
+	 * Daneben wird ein entsprechendes World-File (.tfw) erstellt, in dem die
+	 * Georeferenz und Aufloesung des TIF hinterlegt wird.
+	 * 
+	 * @param grid
+	 *            zu exportierendes Grid
+	 * @param output
+	 *            Ausgabe-Datei
+	 * @throws java.lang.Exception
+	 *             bei irgendeinem Fehler
+	 */
+	public static void writeGridRasterToGeoTiff(WritableGridRaster grid,
+			File output) throws Exception {
+		// for (int i=0; i<ImageIO.getWriterFormatNames().length;i++)
+		// System.out.println(ImageIO.getWriterFormatNames()[i]);
 
-    out.flush();
-    out.close();
-  }
+		// GeoTiff-File schreiben
+		BufferedImage im = new BufferedImage(grid.getWidth(), grid.getHeight(),
+				BufferedImage.TYPE_INT_RGB);
+		im.setData(grid);
+		ImageIO.write(im, "tif", output);
+		// World-File schreiben
+		writeWorldFile(grid.getWidth(), grid.getHeight(), grid.getEnvelope(),
+				IOUtil.changeFileExt(output, "tfw"));
+		// Projektion schreiben
+		writeProjectionFile(grid.getCoordinateReferenceSystem(), IOUtil
+				.changeFileExt(output, "prj"));
+	}
 
-  /**
+	/**
+	 * Schreibt ein World-File (.tfw) fuer ein Grid. Dabei handelt es sich um
+	 * eine zeilenweise ASCII-Datei:<br>
+	 * <ol>
+	 * <li>Zellengroesse in X-Richtung (in Meter)</li>
+	 * <li>Koeffizient fuer Rotation in Y-Richtung (<b>wird mit 0.0
+	 * befuellt</b>!)</li>
+	 * <li>Koeffizient fuer Rotation in X-Richtung (<b>wird mit 0.0
+	 * befuellt</b>!)</li>
+	 * <li>negative Zellengroesse in Y-Richtung (in Meter)</li>
+	 * <li>Horizontale Geo-Referenz (Longitude) der nord-westlichen Ecke</li>
+	 * <li>Vertikale Geo-Referenz (Latitude) der nord-westlichen Ecke</li>
+	 * </ol>
+	 * 
+	 * @param rasterWidth
+	 *            Breite des Rasters (in Zellen)
+	 * @param rasterHeight
+	 *            Hoehe des Rasters (in Zellen)
+	 * @param envelope
+	 *            Geo-Referenz des Rasters (Position und Ausdehnung)
+	 * @param output
+	 *            Datei in die das World-File geschrieben wird
+	 * @exception IOException
+	 *                falls die Datei nicht geschrieben werden kann
+	 */
+	public static void writeWorldFile(int rasterWidth, int rasterHeight,
+			Rectangle2D envelope, File output) throws IOException {
+		PrintWriter out = new PrintWriter(output);
+
+		// Zeile 1: Zellengroesse in Meter
+		out.println(envelope.getWidth() / rasterWidth);
+		// Zeile 2: Rotation in Y-Richtung
+		out.println("0.0");
+		// Zeile 3: Rotation in X-Richtung
+		out.println("0.0");
+		// Zeile 4: ?
+		out.println(-envelope.getHeight() / rasterHeight);
+		// Zeile 5: X-Georeferenz (Longitude) WESTEN
+		out.println(envelope.getX());
+		// Zeile 6: Y-Georeferenz (Latitude) NORDEN (Im Envelope steht SUEDEN!!)
+		out.println(envelope.getY() + envelope.getHeight());
+
+		out.flush();
+		out.close();
+	}
+
+	/**
 	 * Schreibt ein Projektions-File (.prj) fuer ein
 	 * {@link CoordinateReferenceSystem}.
 	 * 
@@ -259,17 +297,19 @@
 		out.flush();
 		out.close();
 	}
-  
 
-  /**
+	/**
 	 * Schreibt ein Projektions-File (.prj) fuer ein
 	 * {@link CoordinateReferenceSystem}. Wenn möglich wird die Schreibweise
-	 * "EPSG:12345" anstelle von WKT verwendet.
+	 * "EPSG:12345" anstelle von WKT verwendet. Wenn die Zieldatei existiert und
+	 * bereits den gleichen Inahlt hat, wird Sie nicht verändert (SVN
+	 * freundlich).
 	 * 
 	 * @param crs
 	 *            Koordinaten-System
 	 * @param outputFile
 	 *            Datei in die die Projektion geschrieben wird
+	 *            
 	 * @exception IOException
 	 *                falls die Datei nicht geschrieben werden kann
 	 */
@@ -278,36 +318,41 @@
 
 		// Directories will be created if needed.
 		outputFile.getParentFile().mkdirs();
-		
-		PrintWriter out = new PrintWriter(outputFile);
 
-		try {
+		String whatToWrite = null;
 
-			String whatToWrite = null;
-
-			/**
-			 * LetIf we can determine the EPSG code for this, let's save it as
-			 * "EPSG:12345" to the file.
-			 */
-			if (!crs.getIdentifiers().isEmpty()) {
-				Object next = crs.getIdentifiers().iterator().next();
-				if (next instanceof Identifier) {
-					Identifier identifier = (Identifier) next;
-					if (identifier.getAuthority().getTitle().toString().equals(
-							"European Petroleum Survey Group")
-							|| identifier.toString().startsWith("EPSG:")) {
-						whatToWrite = "EPSG:" + identifier.getCode();
-					}
+		/**
+		 * LetIf we can determine the EPSG code for this, let's save it as
+		 * "EPSG:12345" to the file.
+		 */
+		if (!crs.getIdentifiers().isEmpty()) {
+			Object next = crs.getIdentifiers().iterator().next();
+			if (next instanceof Identifier) {
+				Identifier identifier = (Identifier) next;
+				if (identifier.getAuthority().getTitle().toString().equals(
+						"European Petroleum Survey Group")
+						|| identifier.toString().startsWith("EPSG:")) {
+					whatToWrite = "EPSG:" + identifier.getCode();
 				}
 			}
+		}
 
-			if (whatToWrite == null) {
-				/*
-				 * If we don't know the EPSG code for the CRS, save it as WKT
-				 */
-				whatToWrite = crs.toWKT();
+		if (whatToWrite == null) {
+			// If we don't know the EPSG code for the CRS, save it as WKT
+			whatToWrite = crs.toWKT();
+		}
+
+		if (outputFile.exists()) {
+			String origCont = IOUtil.readFileAsString(outputFile);
+			if (origCont.equals(whatToWrite)) {
+				// Not writing anything because the file already contains the
+				// same stuff.
+				return;
 			}
+		}
 
+		PrintWriter out = new PrintWriter(outputFile);
+		try {
 			out.println(whatToWrite);
 			out.flush();
 		} finally {
@@ -315,6 +360,4 @@
 		}
 	}
 
-
 }
-



More information about the Schmitzm-commits mailing list