sascha@465: package de.intevation.gnv.utils; sascha@465: sascha@465: import java.util.Map; sascha@465: import java.util.List; sascha@465: import java.util.HashMap; sascha@465: sascha@465: import java.io.File; sascha@465: import java.io.IOException; sascha@465: sascha@465: import java.net.MalformedURLException; sascha@465: sascha@465: import com.vividsolutions.jts.geom.MultiPolygon; sascha@465: import com.vividsolutions.jts.geom.MultiLineString; sascha@465: sascha@465: import org.geotools.data.DataUtilities; sascha@465: import org.geotools.data.Transaction; sascha@465: import org.geotools.data.DefaultTransaction; sascha@465: import org.geotools.data.FeatureWriter; sascha@465: sascha@465: import org.geotools.feature.Feature; sascha@465: import org.geotools.feature.FeatureType; sascha@465: import org.geotools.feature.SchemaException; sascha@465: import org.geotools.feature.IllegalAttributeException; sascha@465: sascha@465: import org.geotools.data.shapefile.ShapefileDataStore; sascha@465: import org.geotools.data.shapefile.ShapefileDataStoreFactory; sascha@465: sascha@465: import org.apache.log4j.Logger; sascha@465: sascha@465: /** sascha@465: * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) sascha@465: */ sascha@465: public final class ShapeFileWriter sascha@465: { sascha@465: private static Logger log = Logger.getLogger( sascha@465: ShapeFileWriter.class); sascha@465: sascha@465: private ShapeFileWriter() { sascha@465: } sascha@465: sascha@465: public static boolean writeMultiLineStringsToFile( sascha@465: File shapeFile, sascha@465: List> multiLineStrings sascha@465: ) { sascha@465: return writeMultiLineStringsToFile(shapeFile, multiLineStrings, null); sascha@465: } sascha@465: sascha@465: public static boolean writeMultiLineStringsToFile( sascha@465: File shapeFile, sascha@465: List> multiLineStrings, sascha@465: String typeName sascha@465: ) { sascha@465: HashMap params = new HashMap(); sascha@465: sascha@465: try { sascha@465: params.put( sascha@465: ShapefileDataStoreFactory.URLP.key, sascha@465: shapeFile.toURI().toURL()); sascha@465: } sascha@465: catch (MalformedURLException mue) { sascha@465: log.error(mue.getLocalizedMessage(), mue); sascha@465: return false; sascha@465: } sascha@465: sascha@465: boolean success = false; sascha@465: Transaction tx = null; sascha@465: sascha@465: try { sascha@465: ShapefileDataStoreFactory sfdsf = sascha@465: new ShapefileDataStoreFactory(); sascha@465: sascha@465: ShapefileDataStore sfds = sascha@465: (ShapefileDataStore)sfdsf.createNewDataStore(params); sascha@465: sascha@465: if (typeName == null) { sascha@465: typeName = shapeFile.getName(); sascha@465: } sascha@465: sascha@465: FeatureType featureType = DataUtilities.createType( sascha@465: typeName, sascha@465: "geom:MultiLineString,VALUE:Double"); sascha@465: sascha@465: sfds.createSchema(featureType); sascha@465: sascha@465: tx = new DefaultTransaction(); sascha@465: sascha@465: FeatureWriter featureWriter = sfds.getFeatureWriter( sascha@465: typeName, tx); sascha@465: sascha@465: for (Pair pair: multiLineStrings) { sascha@465: log.debug("00000000000000000 -> " + pair.getA()); sascha@465: Feature feature = featureWriter.next(); sascha@465: feature.setAttribute("geom", pair.getB()); sascha@465: feature.setAttribute("VALUE", asDouble(pair.getA())); sascha@465: featureWriter.write(); sascha@465: } sascha@465: sascha@465: tx.commit(); sascha@465: success = true; sascha@465: } sascha@465: catch (IllegalAttributeException iae) { sascha@465: log.error(iae.getLocalizedMessage(), iae); sascha@465: } sascha@465: catch (SchemaException se) { sascha@465: log.error(se.getLocalizedMessage(), se); sascha@465: } sascha@465: catch (IOException ioe) { sascha@465: log.error(ioe.getLocalizedMessage(), ioe); sascha@465: } sascha@465: finally { sascha@465: if (!success && tx != null) { sascha@465: try { tx.rollback(); } sascha@465: catch (IOException ioe) {} sascha@465: } sascha@465: } sascha@465: sascha@465: if (tx != null) { sascha@465: try { tx.close(); } sascha@465: catch (IOException ioe) {} sascha@465: } sascha@465: sascha@465: return success; sascha@465: } sascha@465: sascha@465: public static boolean writeMultiPolygonsToFile( sascha@465: File shapeFile, sascha@465: Map multiPolygons sascha@465: ) { sascha@465: return writeMultiPolygonsToFile(shapeFile, multiPolygons, null); sascha@465: } sascha@465: sascha@465: public static boolean writeMultiPolygonsToFile( sascha@465: File shapeFile, sascha@465: Map multiPolygons, sascha@465: String typeName sascha@465: ) { sascha@465: HashMap params = new HashMap(); sascha@465: sascha@465: try { sascha@465: params.put( sascha@465: ShapefileDataStoreFactory.URLP.key, sascha@465: shapeFile.toURI().toURL()); sascha@465: } sascha@465: catch (MalformedURLException mue) { sascha@465: log.error(mue.getLocalizedMessage(), mue); sascha@465: return false; sascha@465: } sascha@465: sascha@465: boolean success = false; sascha@465: Transaction tx = null; sascha@465: sascha@465: try { sascha@465: ShapefileDataStoreFactory sfdsf = sascha@465: new ShapefileDataStoreFactory(); sascha@465: sascha@465: ShapefileDataStore sfds = sascha@465: (ShapefileDataStore)sfdsf.createNewDataStore(params); sascha@465: sascha@465: if (typeName == null) { sascha@465: typeName = shapeFile.getName(); sascha@465: } sascha@465: sascha@465: FeatureType featureType = DataUtilities.createType( sascha@465: typeName, sascha@465: "geom:MultiPolygon,CLASS:Integer"); sascha@465: sascha@465: sfds.createSchema(featureType); sascha@465: sascha@465: tx = new DefaultTransaction(); sascha@465: sascha@465: FeatureWriter featureWriter = sfds.getFeatureWriter( sascha@465: typeName, tx); sascha@465: sascha@465: for (Map.Entry entry: sascha@465: multiPolygons.entrySet() sascha@465: ) { sascha@465: Feature feature = featureWriter.next(); sascha@465: feature.setAttribute("geom", entry.getValue()); sascha@465: feature.setAttribute("CLASS", entry.getKey()); sascha@465: featureWriter.write(); sascha@465: } sascha@465: sascha@465: tx.commit(); sascha@465: success = true; sascha@465: } sascha@465: catch (IllegalAttributeException iae) { sascha@465: log.error(iae.getLocalizedMessage(), iae); sascha@465: } sascha@465: catch (SchemaException se) { sascha@465: log.error(se.getLocalizedMessage(), se); sascha@465: } sascha@465: catch (IOException ioe) { sascha@465: log.error(ioe.getLocalizedMessage(), ioe); sascha@465: } sascha@465: finally { sascha@465: if (!success && tx != null) { sascha@465: try { tx.rollback(); } sascha@465: catch (IOException ioe) {} sascha@465: } sascha@465: } sascha@465: sascha@465: if (tx != null) { sascha@465: try { tx.close(); } sascha@465: catch (IOException ioe) {} sascha@465: } sascha@465: sascha@465: return success; sascha@465: } sascha@465: sascha@465: private static final Double asDouble(Object a) { sascha@465: if (a instanceof Double) sascha@465: return (Double)a; sascha@465: if (a instanceof Number) sascha@465: return Double.valueOf(((Number)a).doubleValue()); sascha@465: return 0d; sascha@465: } sascha@465: } sascha@465: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :