diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java @ 5379:61bf64b102bc mapgenfix

Merge with default branch
author Christian Lins <christian.lins@intevation.de>
date Fri, 22 Mar 2013 11:25:54 +0100
parents 2b24073e80d9 d43ef9f709cd
children
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Wed Mar 06 14:14:15 2013 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java	Fri Mar 22 11:25:54 2013 +0100
@@ -17,7 +17,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;
@@ -42,16 +46,18 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 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
@@ -86,6 +92,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
@@ -289,6 +302,7 @@
         WSPLGENCalculation calculation
     ) {
         logger.debug("FloodMapState.prepareWSPLGENJob");
+        String scenario = artifact.getDataAsString("scenario");
 
         WSPLGENJob job = new WSPLGENJob(
             artifact,
@@ -304,15 +318,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);
+        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);
 
@@ -332,6 +351,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_LINES,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);
     }
@@ -448,6 +567,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.");
@@ -462,10 +589,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.");
@@ -487,14 +623,17 @@
         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) {
             FileUtils.extractZipfile(archive, dir);
 
             job.addLin(dir + "/" + WSPLGEN_USER_SHAPE);
-            facetCreator.createUserShapeFacet();
+            facetCreator.createShapeFacet(FacetCreator.I18N_USERSHAPE,
+                MapfileGenerator.MS_LAYER_PREFIX + "user-rgd",
+                FLOODMAP_USERSHAPE,
+                4);
         }
     }
 
@@ -606,8 +745,15 @@
         String river = artifact.getDataAsString("river");
         String srid    = FLYSUtils.getRiverDGMSrid(river);
         String srs     = "EPSG:" + srid;
-logger.debug("srs: " + srs);
-        List<RiverAxis> axes = RiverAxis.getRiverAxis(river);
+
+        List<RiverAxis> axes = null;
+        try {
+            axes = RiverAxis.getRiverAxis(river);
+        }
+        catch (HibernateException iae) {
+            logger.warn("No valid river axis found for " + river);
+            return;
+        }
         if (axes == null || axes.isEmpty()) {
             logger.warn("Could not find river axis for: '" + river + "'");
             return;
@@ -684,7 +830,11 @@
     }
 
 
-    protected void setDgm(FLYSArtifact artifact, WSPLGENJob job) {
+    protected void setDgm(
+        FLYSArtifact artifact,
+        WSPLGENJob job,
+        CallContext context
+    ) {
         String dgm_id = artifact.getDataAsString("dgm");
 
         int id = -1;
@@ -701,7 +851,15 @@
             return;
         }
 
-        job.setDgm(dgm.getPath());
+        File dgmPath = new File (dgm.getPath());
+        if (dgmPath.isAbsolute()) {
+            job.setDgm(dgm.getPath());
+        }
+        else {
+            FLYSContext fc = (FLYSContext)context.globalContext();
+            String prefix = (String) fc.get("dgm-path");
+            job.setDgm(prefix.trim() + dgm.getPath().trim());
+        }
     }
 
 

http://dive4elements.wald.intevation.org