changeset 1774:092e1e5020bc

Added a new MapGenerator which only returns a map configuration document at the moment (work still in progress). flys-artifacts/trunk@3095 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 28 Oct 2011 05:54:25 +0000
parents 9be01e2e6897
children 0156105222c9
files flys-artifacts/ChangeLog flys-artifacts/doc/conf/conf.xml flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java flys-artifacts/src/main/java/de/intevation/flys/exports/MapGenerator.java flys-artifacts/src/main/java/de/intevation/flys/utils/GeometryUtils.java flys-artifacts/src/main/java/de/intevation/flys/wsplgen/FacetCreator.java
diffstat 8 files changed, 291 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/ChangeLog	Thu Oct 27 14:04:04 2011 +0000
+++ b/flys-artifacts/ChangeLog	Fri Oct 28 05:54:25 2011 +0000
@@ -1,3 +1,27 @@
+2011-10-28  Ingo Weinzierl <ingo@intevation.de>
+
+	* src/main/java/de/intevation/flys/utils/GeometryUtils.java: Added new
+	  method gerRiverBoundary() which returns an Envelope object (which
+	  represents the bounding box of a Geometry) of a riveraxis specified by its
+	  rivername.
+
+	* src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: Use
+	  Geometry.getRiverBoundary() to determine the max extent of a river.
+
+	* src/main/java/de/intevation/flys/wsplgen/FacetCreator.java,
+	  src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: Use
+	  JTS Envelope to save the bounding boxes of WMS layers.
+
+	* src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java:
+	  Adapted the code to apply the changes in GeometryUtils (use Envelope to
+	  determine the max extent of the river axis).
+
+	* src/main/java/de/intevation/flys/exports/MapGenerator.java: New (work in
+	  progress). This Generator will currently return a map configuration in XML
+	  which consists of parameters required by OpenLayers to create a map.
+
+	* doc/conf/conf.xml: Registered the new MapGenerator.
+
 2011-10-27	Felix Wolfsteller	<felix.wolfsteller@intevation.de>
 
 	* doc/conf/meta-data.xml: Do not recommend historical data to load
--- a/flys-artifacts/doc/conf/conf.xml	Thu Oct 27 14:04:04 2011 +0000
+++ b/flys-artifacts/doc/conf/conf.xml	Fri Oct 28 05:54:25 2011 +0000
@@ -115,6 +115,7 @@
         <output-generator name="w_differences">de.intevation.flys.exports.WDifferencesCurveGenerator</output-generator>
         <output-generator name="w_differences_chartinfo">de.intevation.flys.exports.WDifferencesCurveInfoGenerator</output-generator>
         <output-generator name="w_differences_export">de.intevation.flys.exports.WDifferencesExporter</output-generator>
+        <output-generator name="floodmap">de.intevation.flys.exports.MapGenerator</output-generator>
         <!-- Error report generators. -->
         <output-generator name="discharge_longitudinal_section_report">de.intevation.flys.exports.ReportGenerator</output-generator>
         <output-generator name="waterlevel_report">de.intevation.flys.exports.ReportGenerator</output-generator>
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java	Thu Oct 27 14:04:04 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java	Fri Oct 28 05:54:25 2011 +0000
@@ -9,6 +9,8 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
+import com.vividsolutions.jts.geom.Envelope;
+
 import de.intevation.artifacts.Artifact;
 import de.intevation.artifacts.ArtifactNamespaceContext;
 import de.intevation.artifacts.CallContext;
@@ -20,6 +22,7 @@
 import de.intevation.artifactdatabase.state.Facet;
 
 import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
+import de.intevation.flys.utils.GeometryUtils;
 
 
 public class WMSLayerFacet
@@ -30,7 +33,7 @@
     protected String       stateId;
     protected String       hash;
     protected String       url;
-    protected String       extent;
+    protected Envelope     extent;
     protected String       srid;
 
 
@@ -83,13 +86,18 @@
     }
 
 
-    public void setExtent(String extent) {
+    public void setExtent(Envelope extent) {
         if (extent != null) {
             this.extent = extent;
         }
     }
 
 
+    public Envelope getExtent() {
+        return extent;
+    }
+
+
     public void setSrid(String srid) {
         if (srid != null) {
             this.srid = srid;
@@ -97,6 +105,11 @@
     }
 
 
+    public String getSrid() {
+        return srid;
+    }
+
+
     public Object getData(Artifact artifact, CallContext context) {
         return null;
     }
@@ -115,8 +128,10 @@
         ec.addAttr(facet, "name", name, true);
         ec.addAttr(facet, "url", url, true);
         ec.addAttr(facet, "layers", layers.get(0), true);
-        ec.addAttr(facet, "extent", extent != null ? extent : "", true);
         ec.addAttr(facet, "srid", srid != null ? srid : "", true);
+        ec.addAttr(facet, "extent", extent != null
+            ? GeometryUtils.jtsBoundsToOLBounds(extent)
+            : "", true);
 
         return facet;
     }
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java	Thu Oct 27 14:04:04 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java	Fri Oct 28 05:54:25 2011 +0000
@@ -5,7 +5,7 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.Envelope;
 
 import de.intevation.artifacts.CallMeta;
 import de.intevation.artifacts.GlobalContext;
@@ -79,8 +79,8 @@
 
         RiverAxis axis = RiverAxis.getRiverAxis(river);
         if (axis != null) {
-            Geometry geom   = axis.getGeom().getBoundary();
-            String   bounds = GeometryUtils.jtsBoundsToOLBounds(geom);
+            Envelope env    = axis.getGeom().getEnvelopeInternal();
+            String   bounds = GeometryUtils.jtsBoundsToOLBounds(env);
 
             logger.debug("River '" + river + "' bounds: " + bounds);
             Element bbox = cr.create("bbox");
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java	Thu Oct 27 14:04:04 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java	Fri Oct 28 05:54:25 2011 +0000
@@ -71,7 +71,7 @@
             url);
 
         facet.addLayer(WMS_LAYER_NAME);
-        facet.setExtent(GeometryUtils.getRiverBounds(river));
+        facet.setExtent(GeometryUtils.getRiverBoundary(river));
         facet.setSrid(FLYSUtils.getRiverSrid(artifact));
 
         facets.add(facet);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/MapGenerator.java	Fri Oct 28 05:54:25 2011 +0000
@@ -0,0 +1,208 @@
+package de.intevation.flys.exports;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.geom.Envelope;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.artifacts.common.ArtifactNamespaceContext;
+import de.intevation.artifacts.common.utils.XMLUtils;
+import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
+
+import de.intevation.artifactdatabase.state.Facet;
+
+import de.intevation.flys.artifacts.FLYSArtifact;
+import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.model.WMSLayerFacet;
+import de.intevation.flys.utils.GeometryUtils;
+
+
+public class MapGenerator implements OutGenerator, FacetTypes {
+
+    private static Logger logger = Logger.getLogger(MapGenerator.class);
+
+
+    protected Artifact master;
+
+    protected Document request;
+
+    protected OutputStream out;
+
+    protected CallContext context;
+
+    protected List<WMSLayerFacet> layers;
+
+    protected Envelope maxExtent;
+    protected Envelope initialExtent;
+
+    protected String srid;
+
+
+
+    @Override
+    public void init(Document request, OutputStream out, CallContext context) {
+        logger.debug("MapGenerator.init");
+
+        this.request  = request;
+        this.out      = out;
+        this.context  = context;
+
+        this.layers = new ArrayList<WMSLayerFacet>();
+
+        this.maxExtent = null;
+        this.initialExtent = null;
+    }
+
+
+    @Override
+    public void setMasterArtifact(Artifact master) {
+        logger.debug("MapGenerator.setMasterArtifact");
+        this.master = master;
+    }
+
+
+    @Override
+    public void doOut(
+        Artifact artifact,
+        Facet    facet,
+        Document attr,
+        boolean  visible)
+    {
+        String name = facet.getName();
+
+        logger.debug("MapGenerator.doOut: " +artifact.identifier()+" | "+name);
+        FLYSArtifact flys = (FLYSArtifact) artifact;
+
+        Facet nativeFacet = flys.getNativeFacet(facet);
+
+        if (nativeFacet instanceof WMSLayerFacet) {
+            WMSLayerFacet wms = (WMSLayerFacet) nativeFacet;
+            Envelope   extent = wms.getExtent();
+
+            layers.add(wms);
+
+            setMaxExtent(extent);
+            setSrid(wms.getSrid());
+
+            if (FLOODMAP_WSPLGEN.equals(name) && initialExtent == null) {
+                setInitialExtent(extent);
+            }
+        }
+        else {
+            logger.warn("Facet not supported: " + nativeFacet.getClass());
+        }
+
+    }
+
+
+    @Override
+    public void generate()
+    throws IOException
+    {
+        logger.debug("MapGenerator.generate");
+
+        Document response = XMLUtils.newDocument();
+        ElementCreator c  = new ElementCreator(
+            response,
+            ArtifactNamespaceContext.NAMESPACE_URI,
+            ArtifactNamespaceContext.NAMESPACE_PREFIX);
+
+        Element root   = c.create("floodmap");
+        Element layers = c.create("layers");
+
+        response.appendChild(root);
+        root.appendChild(layers);
+
+        appendLayers(layers);
+        appendMapInformation(root, c);
+
+        XMLUtils.toStream(response, out);
+    }
+
+
+    protected void appendLayers(Element parent) {
+        for (WMSLayerFacet facet: layers) {
+            parent.appendChild(facet.toXML(parent.getOwnerDocument()));
+        }
+    }
+
+
+    protected void setMaxExtent(Envelope maxExtent) {
+        if (maxExtent == null) {
+            return;
+        }
+
+        if (this.maxExtent == null) {
+            logger.debug("Set max extent to: " + maxExtent);
+            this.maxExtent = maxExtent;
+            return;
+        }
+
+        logger.debug("Expand max extent by: " + maxExtent);
+        logger.debug("Max extent before expanding: " + this.maxExtent);
+        this.maxExtent.expandToInclude(maxExtent);
+        logger.debug("Max extent after expanding: " + this.maxExtent);
+    }
+
+
+    protected void setInitialExtent(Envelope initialExtent) {
+        if (initialExtent == null) {
+            return;
+        }
+
+        if (this.initialExtent == null) {
+            logger.debug("Set initial extent to: " + initialExtent);
+            this.initialExtent = initialExtent;
+            return;
+        }
+
+        logger.debug("Set initial extent to: " + initialExtent);
+        this.initialExtent = initialExtent;
+    }
+
+
+    protected void setSrid(String srid) {
+        if (srid == null || srid.length() == 0) {
+            return;
+        }
+
+        this.srid = srid;
+    }
+
+
+    protected void appendMapInformation(Element parent, ElementCreator c) {
+        String mE = GeometryUtils.jtsBoundsToOLBounds(this.maxExtent);
+        logger.debug("BUILD MAX EXTENT OF:" + this.maxExtent);
+        logger.debug("BUILD MAX EXTENT:" + mE);
+
+        Element maxExtent = c.create("maxExtent");
+        maxExtent.setTextContent(mE);
+
+        String iE = GeometryUtils.jtsBoundsToOLBounds(this.initialExtent);
+        logger.debug("BUILD INITIAL EXTENT OF: " + this.initialExtent);
+        logger.debug("BUILD INITIAL EXTENT: " + iE);
+        Element initExtent = c.create("initialExtent");
+        initExtent.setTextContent(iE);
+
+        Element srid = c.create("srid");
+        srid.setTextContent(this.srid);
+
+        // TODO zoom levels
+        // TODO resolutation
+
+        parent.appendChild(maxExtent);
+        parent.appendChild(initExtent);
+        parent.appendChild(srid);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/utils/GeometryUtils.java	Thu Oct 27 14:04:04 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/GeometryUtils.java	Fri Oct 28 05:54:25 2011 +0000
@@ -12,6 +12,7 @@
 import org.apache.log4j.Logger;
 
 import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
 import com.vividsolutions.jts.geom.Geometry;
 
 import org.opengis.feature.simple.SimpleFeature;
@@ -44,13 +45,23 @@
     }
 
 
-    public static String getRiverBounds(String rivername) {
+    public static Envelope getRiverBoundary(String rivername) {
         RiverAxis axis = RiverAxis.getRiverAxis(rivername);
         if (axis != null) {
             // TODO Take the correct EPSG into account. Maybe, we need to
             // reproject the geometry.
-            Geometry geom   = axis.getGeom().getBoundary();
-            return jtsBoundsToOLBounds(geom);
+            return axis.getGeom().getEnvelopeInternal();
+        }
+
+        return null;
+    }
+
+
+    public static String getRiverBounds(String rivername) {
+        Envelope env = getRiverBoundary(rivername);
+
+        if (env == null) {
+            return jtsBoundsToOLBounds(env);
         }
 
         return null;
@@ -58,21 +69,19 @@
 
 
     /**
-     * Returns the boundary of Geometry <i>geom</i> in OpenLayers
+     * Returns the boundary of Envelope <i>env</i> in OpenLayers
      * representation.
      *
-     * @param geom The geometry.
+     * @param env The envelope of a geometry.
      *
-     * @return the OpenLayers boundary of <i>geom</i>.
+     * @return the OpenLayers boundary of <i>env</i>.
      */
-    public static String jtsBoundsToOLBounds(Geometry geom) {
-        Coordinate[] c = geom != null ? geom.getCoordinates() : null;
-
-        if (c == null || c.length < 2) {
-            return null;
-        }
-
-        return "" + c[0].x + " " + c[1].y + " " + c[1].x + " " + c[0].y;
+    public static String jtsBoundsToOLBounds(Envelope env) {
+        return "" +
+            env.getMinX() + " " +
+            env.getMinY() + " " +
+            env.getMaxX() + " " +
+            env.getMaxY();
     }
 
 
--- a/flys-artifacts/src/main/java/de/intevation/flys/wsplgen/FacetCreator.java	Thu Oct 27 14:04:04 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/wsplgen/FacetCreator.java	Fri Oct 28 05:54:25 2011 +0000
@@ -3,6 +3,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import com.vividsolutions.jts.geom.Envelope;
+
 import de.intevation.artifacts.CallContext;
 
 import de.intevation.artifactdatabase.state.Facet;
@@ -66,7 +68,7 @@
         return FLYSUtils.getRiverSrid(artifact);
     }
 
-    protected String getWSPLGENBounds() {
+    protected Envelope getWSPLGENBounds() {
         String river = getRiver();
         double kms[] = FLYSUtils.getKmRange(artifact);
 
@@ -80,11 +82,16 @@
             return null;
         }
 
-        return GeometryUtils.createOLBounds(a.getGeom(), b.getGeom());
+        Envelope envA = a.getGeom().getEnvelopeInternal();
+        Envelope envB = b.getGeom().getEnvelopeInternal();
+
+        envA.expandToInclude(envB);
+
+        return envA;
     }
 
-    protected String getBounds() {
-        return GeometryUtils.getRiverBounds(getRiver());
+    protected Envelope getBounds() {
+        return GeometryUtils.getRiverBoundary(getRiver());
     }
 
     public List<Facet> getFacets() {
@@ -104,9 +111,9 @@
             hash,
             getUrl());
 
-        String bounds = getWSPLGENBounds();
+        Envelope bounds = getWSPLGENBounds();
 
-        if (bounds == null || bounds.length() == 0) {
+        if (bounds == null) {
             bounds = getBounds();
         }
 

http://dive4elements.wald.intevation.org