Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java @ 5312:2c1045a1e3fe
Added new states and transitions to UESK calculation and adjusted states and UI.
TODO: Some refactoring and code cleanup.
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Thu, 14 Mar 2013 17:25:00 +0100 |
parents | cf7e0d9022fa |
children | a1cb9a734cc5 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java Thu Mar 14 17:21:00 2013 +0100 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java Thu Mar 14 17:25:00 2013 +0100 @@ -43,8 +43,11 @@ import de.intevation.flys.artifacts.model.CalculationMessage; import de.intevation.flys.artifacts.model.CalculationResult; import de.intevation.flys.artifacts.model.FacetTypes; +import de.intevation.flys.artifacts.model.LayerInfo; import de.intevation.flys.artifacts.model.WQKms; - +import de.intevation.flys.artifacts.model.map.HWS; +import de.intevation.flys.artifacts.model.map.HWSContainer; +import de.intevation.flys.artifacts.model.map.HWSFactory; import de.intevation.flys.artifacts.model.map.WMSLayerFacet; import de.intevation.flys.artifacts.model.map.WSPLGENCalculation; import de.intevation.flys.artifacts.model.map.WSPLGENJob; @@ -68,6 +71,26 @@ import de.intevation.flys.wsplgen.JobObserver; import de.intevation.flys.wsplgen.Scheduler; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.naming.Context; + +import org.apache.log4j.Logger; +import org.apache.velocity.Template; +import org.geotools.feature.FeatureCollection; +import org.geotools.feature.FeatureCollections; +import org.geotools.feature.simple.SimpleFeatureBuilder; +import org.hibernate.HibernateException; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; + + public class FloodMapState extends DefaultState implements FacetTypes @@ -102,6 +125,13 @@ public static final int WSPLGEN_DEFAULT_OUTPUT = 0; + private static final String HWS_LINES_SHAPE = "hws-lines.shp"; + + private static final String I18N_HWS_POINTS = "floodmap.hws.points"; + private static final String I18N_HWS_LINES = "floodmap.hws.lines"; + private static final String HWS_LINES = "hws-lines"; + private static final String HWS_POINT_SHAPE = "hws-points.shp"; + private static final String HWS_POINTS = "hws-points"; /** * @param orig @@ -305,6 +335,7 @@ WSPLGENCalculation calculation ) { logger.debug("FloodMapState.prepareWSPLGENJob"); + String scenario = artifact.getDataAsString("scenario"); WSPLGENJob job = new WSPLGENJob( artifact, @@ -320,15 +351,20 @@ setDelta(artifact, job); setGel(artifact, job); setDist(artifact, job); - setLine(artifact, facetCreator, artifactDir, job); - setUserShape(artifact, facetCreator, artifactDir, job); setAxis(artifact, artifactDir, job); setPro(artifact, artifactDir, job); setDgm(artifact, job, context); setArea(artifact, artifactDir, job); setOutFile(artifact, job); setWsp(artifact, context, artifactDir, job); // WSP - + if (scenario.equals("scenario.current")) { + setOfficialHWS(artifact, facetCreator, artifactDir, job); + } + else if (scenario.equals("scenario.scenario")) { + setAdditionalHWS(artifact, facetCreator, artifactDir, job); + setLine(artifact, facetCreator, artifactDir, job); + setUserShape(artifact, facetCreator, artifactDir, job); + } // TODO // setWspTag(artifact, job); @@ -348,6 +384,106 @@ } + private void setAdditionalHWS( + FLYSArtifact artifact, + FacetCreator facetCreator, + File dir, + WSPLGENJob job) { + File line = new File(dir, HWS_LINES_SHAPE); + boolean lines = line.exists(); + logger.debug("shp file exists: " + lines); + if (lines) { + job.addLin(dir + "/" + HWS_LINES_SHAPE); + facetCreator.createShapeFacet(I18N_HWS_LINES, + MapfileGenerator.MS_LAYER_PREFIX + HWS_LINES, + FLOODMAP_LINES, 2); + } + File point = new File(dir, HWS_POINT_SHAPE); + boolean points = point.exists(); + logger.debug("shp file exists: " + points); + if (points) { + facetCreator.createShapeFacet(I18N_HWS_POINTS, + MapfileGenerator.MS_LAYER_PREFIX + HWS_POINTS, + FLOODMAP_FIXPOINTS, 3); + } + } + + + private void setOfficialHWS( + FLYSArtifact artifact, + FacetCreator facetCreator, + File artifactDir, + WSPLGENJob job) { + String river = artifact.getDataAsString("river"); + + HWSContainer hwsLines = HWSFactory.getHWSLines(river); + List<HWS> selectedLines = hwsLines.getOfficialHWS(); + + FeatureCollection collectionLines = FeatureCollections.newCollection(); + SimpleFeatureType lineType = null; + for (HWS h : selectedLines) { + lineType = h.getFeatureType(); + collectionLines.add(h.getFeature()); + } + boolean successLines = false; + if (lineType != null && collectionLines.size() > 0) { + File shapeLines = new File(artifactDir, HWS_LINES_SHAPE); + successLines = GeometryUtils.writeShapefile( + shapeLines, lineType, collectionLines); + } + if (successLines) { + createMapfile( + artifact, + artifactDir, + MapfileGenerator.MS_LAYER_PREFIX + "hws-lines", + HWS_LINES_SHAPE, + "LINE", + "31467", + "hws"); + job.addLin(artifactDir + "/" + HWS_LINES_SHAPE); + facetCreator.createShapeFacet(I18N_HWS_LINES, + MapfileGenerator.MS_LAYER_PREFIX + HWS_LINES, + FLOODMAP_HWS,2); + } + } + + + private void createMapfile( + FLYSArtifact artifact, + File artifactDir, + String name, + String hwsShapefile, + String type, + String srid, + String group + ) { + LayerInfo info = new LayerInfo(); + info.setName(name + artifact.identifier()); + info.setType(type); + info.setDirectory(artifact.identifier()); + info.setTitle(name); + info.setData(hwsShapefile); + info.setSrid(srid); + info.setGroupTitle(group); + MapfileGenerator generator = new ArtifactMapfileGenerator(); + Template tpl = generator.getTemplateByName(MapfileGenerator.SHP_LAYER_TEMPLATE); + try { + File layer = new File(artifactDir.getCanonicalPath() + "/" + name); + generator.writeLayer(info, layer, tpl); + List<String> layers = new ArrayList<String>(); + layers.add(layer.getAbsolutePath()); + generator.generate(); + } + catch(FileNotFoundException fnfe) { + logger.warn("Could not find mapfile for hws layer"); + } + catch (Exception ioe) { + logger.warn("Could not create mapfile for hws layer"); + logger.warn(Arrays.toString(ioe.getStackTrace())); + } + } + + protected void setOut(FLYSArtifact artifact, WSPLGENJob job) { job.setOut(WSPLGEN_DEFAULT_OUTPUT); } @@ -464,6 +600,14 @@ logger.debug( "Successfully created barrier line shapefile. " + "Write shapefile path into WSPLGEN job."); + createMapfile( + artifact, + dir, + MapfileGenerator.MS_LAYER_PREFIX + "barriers-lines", + WSPLGEN_BARRIERS_LINES, + "LINE", + srid, + "barriers"); if (scenario.equals(WSPLGENJob.GEL_NOSPERRE)) { logger.debug("WSPLGEN will not use barrier features."); @@ -478,10 +622,19 @@ GeometryUtils.buildFeatureType("polygons", srs, Polygon.class, obj), fcs[1]); + if (p) { logger.debug( "Successfully created barrier polygon shapefile. " + "Write shapefile path into WSPLGEN job."); + createMapfile( + artifact, + dir, + MapfileGenerator.MS_LAYER_PREFIX + "barriers-poly", + shapePolys.getAbsolutePath(), + "POLYGON", + srid, + "barriers"); if (scenario.equals(WSPLGENJob.GEL_NOSPERRE)) { logger.debug("WSPLGEN will not use barrier features."); @@ -503,22 +656,15 @@ File dir, WSPLGENJob job ) { - File archive = new File(dir, WSPLGEN_USER_ZIP); + File archive = new File(dir, WSPLGEN_USER_SHAPE); boolean exists = archive.exists(); - logger.debug("Zip file exists: " + exists); + logger.debug("shp file exists: " + exists); if (exists) { - try { - File tmpDir = new File(dir, "usr_tmp"); - FileTools.extractArchive(archive, tmpDir); - moveFiles(tmpDir, dir); - } - catch (IOException ioe) { - logger.warn("Zip archive " + dir + "/" + WSPLGEN_USER_ZIP + " could not be extracted."); - return; - } - job.addLin(dir + "/" + WSPLGEN_USER_SHAPE); - facetCreator.createUserShapeFacet(); + facetCreator.createShapeFacet(FacetCreator.I18N_USERSHAPE, + MapfileGenerator.MS_LAYER_PREFIX + "user-rgd", + FLOODMAP_USERSHAPE, + 4); } } @@ -883,41 +1029,6 @@ } - protected void moveFiles(File source, final File target) - throws IOException - { - if (!source.exists()) { - return; - } - if (!target.exists()) { - target.mkdir(); - } - FileTools.walkTree(source, new FileTools.FileVisitor() { - @Override - public boolean visit(File file) { - if (!file.isDirectory()) { - String name = file.getName(); - String suffix = ""; - int pos = name.lastIndexOf('.'); - if (pos > 0 && pos < name.length() - 1) { - suffix = name.substring(pos + 1); - } - else { - return true; - } - try { - FileTools.copyFile(file, new File(target, WSPLGEN_USER_FILENAME + "." + suffix)); - } - catch (IOException ioe) { - logger.warn ("Error while copying file " + file.getName()); - return true; - } - } - return true; - } - }); - FileTools.deleteRecursive(source); - } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :