Mercurial > dive4elements > river
changeset 5496:23d8f2700b38
Add support for multiple floodplains and add them to the datacage accordingly
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Thu, 28 Mar 2013 12:39:14 +0100 |
parents | 1488227b97b7 |
children | 5d99cd6e146a |
files | flys-artifacts/doc/conf/meta-data.xml flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java flys-backend/src/main/java/de/intevation/flys/model/Floodplain.java |
diffstat | 3 files changed, 109 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/flys-artifacts/doc/conf/meta-data.xml Thu Mar 28 12:38:06 2013 +0100 +++ b/flys-artifacts/doc/conf/meta-data.xml Thu Mar 28 12:39:14 2013 +0100 @@ -1321,17 +1321,42 @@ <dc:macro name="flood-map-floodplain"> <dc:context> <dc:statement> - SELECT count(*) as km_exists - FROM floodplain WHERE river_id = ${river_id} + SELECT DISTINCT + fp.kind_id as kind_id, + flk.name as kind_name + FROM floodplain fp + JOIN floodplain_kinds flk on fp.kind_id = flk.id + WHERE river_id = ${river_id} + AND kind_id=1 </dc:statement> - <dc:elements> - <dc:if test="$km_exists>0"> - <floodplain> - <dc:attribute name="factory" value="wmsfloodplainfactory"/> - <dc:attribute name="ids" value="${river_id}"/> - </floodplain> - </dc:if> - </dc:elements> + <dc:if test="dc:has-result()"> + <dc:elements> + <floody factory="wmsfloodplainfactory" + description="{$kind_name}" + ids="{$river_id};{$kind_name};{$kind_id}"/> + </dc:elements> + </dc:if> + </dc:context> + <dc:context> + <dc:statement> + SELECT DISTINCT + flk.name as kind_name, + fp.kind_id as kind_id, + fp.name as layer_name + FROM floodplain fp + JOIN floodplain_kinds flk on fp.kind_id = flk.id + WHERE river_id = ${river_id} + AND kind_id <> 1 + </dc:statement> + <dc:if test="dc:has-result()"> + <other> + <dc:elements> + <floody factory="wmsfloodplainfactory" + description="{$layer_name}" + ids="{$river_id};{$layer_name};{$kind_id}"/> + </dc:elements> + </other> + </dc:if> </dc:context> </dc:macro> @@ -1809,8 +1834,8 @@ <dc:call-macro name="flood-map-routing"/> </route_data> <hydrboundaries> + <dc:call-macro name="flood-map-floodplain"/> <dc:call-macro name="flood-map-hydr-boundaries"/> - <dc:call-macro name="flood-map-floodplain"/> </hydrboundaries> <dc:call-macro name="flood-map-uesk"/> <gaugelocations>
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java Thu Mar 28 12:38:06 2013 +0100 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java Thu Mar 28 12:39:14 2013 +0100 @@ -84,21 +84,6 @@ riverId = 0; } - public int getRiverId() { - if (riverId == 0) { - String ids = artifact.getDataAsString("ids"); - - try { - riverId = Integer.parseInt(ids); - } - catch (NumberFormatException nfe) { - logger.error("Cannot parse river id from '" + ids + "'"); - } - } - - return riverId; - } - protected River getRiver() { return RiverFactory.getRiver(getRiverId()); } @@ -121,19 +106,46 @@ @Override protected Envelope getExtent(boolean reproject) { - River river = getRiver(); - Floodplain plain = Floodplain.getFloodplain(river.getName()); + River river = getRiver(); + List<Floodplain> fps; - Envelope e = plain.getGeom().getEnvelopeInternal(); + String kind = getIdPart(2); - return e != null && reproject - ? GeometryUtils.transform(e, getSrid()) - : e; + if (kind != null && ! kind.equals("1")) { + fps = Floodplain.getFloodplains(river.getName(), + getName(), Integer.parseInt(kind)); + } else { + fps = Floodplain.getFloodplains(river.getName(), 1); + } + + Envelope max = null; + + for (Floodplain fp: fps) { + Envelope env = fp.getGeom().getEnvelopeInternal(); + + if (max == null) { + max = env; + continue; + } + + max.expandToInclude(env); + } + + return max != null && reproject + ? GeometryUtils.transform(max, getSrid()) + : max; } @Override protected String getFilter() { - return "river_id=" + String.valueOf(getRiverId()); + String kind = getIdPart(2); + if (kind != null && ! kind.equals("1")) { + return "river_id=" + String.valueOf(getRiverId()) + + " AND kind_id=" + kind + + " AND name='" + getName() + "'"; + } + return "river_id=" + String.valueOf(getRiverId()) + + " AND kind_id=1"; } @Override
--- a/flys-backend/src/main/java/de/intevation/flys/model/Floodplain.java Thu Mar 28 12:38:06 2013 +0100 +++ b/flys-backend/src/main/java/de/intevation/flys/model/Floodplain.java Thu Mar 28 12:39:14 2013 +0100 @@ -13,6 +13,7 @@ import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.annotations.Type; +import org.hibernate.HibernateException; import com.vividsolutions.jts.geom.Polygon; @@ -32,6 +33,8 @@ private Polygon geom; + private String name; + public Floodplain() { } @@ -77,6 +80,42 @@ this.geom = geom; } + @Column(name = "name") + public String getName() { + return name; + } + + + public void setName(String name) { + this.name = name; + } + + public static List<Floodplain> getFloodplains(String river, String name, int kind) + throws HibernateException { + Session session = SessionHolder.HOLDER.get(); + Query query = session.createQuery( + "from Floodplain as fp where river.name =:river" + + " and kind.id =:kind" + + " and fp.name=:name"); + query.setParameter("river", river); + query.setParameter("kind", kind); + query.setParameter("name", name); + + List<Floodplain> list = query.list(); + return list.isEmpty() ? null : list; + } + + public static List<Floodplain> getFloodplains(String river, int kind) + throws HibernateException { + Session session = SessionHolder.HOLDER.get(); + Query query = session.createQuery( + "from Floodplain where river.name =:river AND kind.id =:kind"); + query.setParameter("river", river); + query.setParameter("kind", kind); + + List<Floodplain> list = query.list(); + return list.isEmpty() ? null : list; + } public static Floodplain getFloodplain(String river) { Session session = SessionHolder.HOLDER.get();