Mercurial > dive4elements > gnv-client
view gnv-artifacts/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java @ 610:6484464d2059
Changed the mechanism for searching for specific parameter collections.
gnv-artifacts/trunk@676 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 11 Feb 2010 11:58:39 +0000 |
parents | 4080b57dcb52 |
children | 4fc97074eb90 |
line wrap: on
line source
package de.intevation.gnv.utils; import com.vividsolutions.jts.geom.MultiLineString; import com.vividsolutions.jts.geom.MultiPolygon; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.net.MalformedURLException; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.geotools.data.DataStoreFactorySpi; import org.geotools.data.DataUtilities; import org.geotools.data.DefaultTransaction; import org.geotools.data.FeatureStore; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.feature.FeatureCollection; import org.geotools.feature.FeatureCollections; import org.geotools.feature.SchemaException; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; /** * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) */ public final class ShapeFileWriter { private static Logger log = Logger.getLogger( ShapeFileWriter.class); private ShapeFileWriter() { } public static boolean writeMultiLineStringsToFile( File shapeFile, Integer parameterId, Integer layer, Date date, List<Pair<Object, MultiLineString>> multiLineStrings ) { return writeMultiLineStringsToFile( shapeFile, parameterId, layer, date, multiLineStrings, "isolines"); } public static boolean writeMultiLineStringsToFile( File shapeFile, Integer parameterId, Integer layer, Date date, List<Pair<Object, MultiLineString>> multiLineStrings, String name ) { Map<String, Serializable> params = new HashMap<String, Serializable>(); try { params.put("url", shapeFile.toURI().toURL()); } catch (MalformedURLException mue) { log.error(mue.getLocalizedMessage(), mue); return false; } params.put("create spatial index", Boolean.TRUE); if (name == null) { name = shapeFile.getName(); } SimpleFeatureType TYPE; try { TYPE = DataUtilities.createType( name, "geom:MultiLineString:srid=4326," + "PARAMETER:Integer," + "LAYER:Integer," + "DATE:Date," + "VALUE:Double"); } catch (SchemaException se) { log.error(se.getLocalizedMessage(), se); return false; } SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE); FeatureCollection<SimpleFeatureType, SimpleFeature> collection = FeatureCollections.newCollection(); for (Pair<Object, MultiLineString> pair: multiLineStrings) { featureBuilder.add(pair.getB()); featureBuilder.add(parameterId); featureBuilder.add(layer); featureBuilder.add(date); featureBuilder.add(pair.getA()); SimpleFeature feature = featureBuilder.buildFeature(null); collection.add(feature); } DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory(); Transaction transaction = null; boolean success = false; try { ShapefileDataStore newDataStore = (ShapefileDataStore)dataStoreFactory.createNewDataStore(params); newDataStore.createSchema(TYPE); newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84); transaction = new DefaultTransaction("create"); String typeName = newDataStore.getTypeNames()[0]; FeatureStore<SimpleFeatureType, SimpleFeature> featureStore = (FeatureStore<SimpleFeatureType, SimpleFeature>) newDataStore.getFeatureSource(typeName); featureStore.setTransaction(transaction); featureStore.addFeatures(collection); transaction.commit(); success = true; } catch (IOException ioe) { log.error(ioe.getLocalizedMessage(), ioe); } finally { if (transaction != null) { if (!success) { try { transaction.rollback(); } catch (IOException ioe) {} } try { transaction.close(); } catch (IOException ioe) {} } } return success; } public static boolean writeMultiPolygonsToFile( File shapeFile, Integer parameterId, Integer layer, Date date, Map<Integer, MultiPolygon> multiPolygons ) { return writeMultiPolygonsToFile( shapeFile, parameterId, layer, date, multiPolygons, "polygons"); } public static boolean writeMultiPolygonsToFile( File shapeFile, Integer parameterId, Integer layer, Date date, Map<Integer, MultiPolygon> multiPolygons, String name ) { Map<String, Serializable> params = new HashMap<String, Serializable>(); try { params.put("url", shapeFile.toURI().toURL()); } catch (MalformedURLException mue) { log.error(mue.getLocalizedMessage(), mue); return false; } params.put("create spatial index", Boolean.TRUE); if (name == null) { name = shapeFile.getName(); } SimpleFeatureType TYPE; try { TYPE = DataUtilities.createType( name, "geom:MultiPolygon:srid=4326," + "PARAMETER:Integer," + "LAYER:Integer," + "DATE:Date," + "CLASS:Integer"); } catch (SchemaException se) { log.error(se.getLocalizedMessage(), se); return false; } SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE); FeatureCollection<SimpleFeatureType, SimpleFeature> collection = FeatureCollections.newCollection(); for (Map.Entry<Integer, MultiPolygon> entry: multiPolygons.entrySet() ) { featureBuilder.add(entry.getValue()); featureBuilder.add(parameterId); featureBuilder.add(layer); featureBuilder.add(date); featureBuilder.add(entry.getKey()); SimpleFeature feature = featureBuilder.buildFeature(null); collection.add(feature); } DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory(); Transaction transaction = null; boolean success = false; try { ShapefileDataStore newDataStore = (ShapefileDataStore)dataStoreFactory.createNewDataStore(params); newDataStore.createSchema(TYPE); newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84); transaction = new DefaultTransaction("create"); String typeName = newDataStore.getTypeNames()[0]; FeatureStore<SimpleFeatureType, SimpleFeature> featureStore = (FeatureStore<SimpleFeatureType, SimpleFeature>) newDataStore.getFeatureSource(typeName); featureStore.setTransaction(transaction); featureStore.addFeatures(collection); transaction.commit(); success = true; } catch (IOException ioe) { log.error(ioe.getLocalizedMessage(), ioe); } finally { if (transaction != null) { if (!success) { try { transaction.rollback(); } catch (IOException ioe) {} } try { transaction.close(); } catch (IOException ioe) {} } } return success; } private static final Double asDouble(Object a) { if (a instanceof Double) { return (Double)a; } if (a instanceof Number) { return Double.valueOf(((Number)a).doubleValue()); } return 0d; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :