Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/utils/RiverMapfileGenerator.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 | b55975761708 |
children | ae60bb7b8085 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/RiverMapfileGenerator.java Fri Mar 22 11:25:54 2013 +0100 @@ -0,0 +1,161 @@ +package de.intevation.flys.utils; + +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.MultiLineString; + +import de.intevation.flys.artifacts.model.LayerInfo; +import de.intevation.flys.artifacts.model.RiverFactory; + +import de.intevation.flys.model.River; +import de.intevation.flys.model.RiverAxis; + +import java.io.File; +import java.io.FileNotFoundException; + +import java.util.ArrayList; +import java.util.List; + +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; + +import org.apache.velocity.Template; +import org.hibernate.HibernateException; + +public class RiverMapfileGenerator extends MapfileGenerator { + + public static final String XPATH_RIVERMAP_RIVER_PROJECTION = + "/artifact-database/rivermap/river[@name=$name]/srid/@value"; + + public static final String XPATH_RIVERMAP_SHAPEFILE_DIR = + "/artifact-database/rivermap/shapefile-path/@value"; + + public static final String XPATH_RIVERMAP_VELOCITY_LOGFILE = + "/artifact-database/rivermap/velocity/logfile/@path"; + + public static final String XPATH_RIVERMAP_MAPSERVER_URL = + "/artifact-database/rivermap/mapserver/server/@path"; + + public static final String XPATH_RIVERMAP_MAPFILE_PATH = + "/artifact-database/rivermap/mapserver/mapfile/@path"; + + public static final String XPATH_RIVERMAP_MAPFILE_TEMPLATE = + "/artifact-database/rivermap/mapserver/map-template/@path"; + + public static final String XPATH_RIVERMAP_MAPSERVER_TEMPLATE_PATH = + "/artifact-database/rivermap/mapserver/templates/@path"; + + public static final Pattern DB_URL_PATTERN = + Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z]+)"); + + public static final Pattern DB_PSQL_URL_PATTERN = + Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z0-9]+)"); + + private static Logger logger = Logger.getLogger(RiverMapfileGenerator.class); + + /** + * Generate river axis mapfile. + */ + @Override + public void generate() { + logger.debug("generate()"); + + List<River> rivers = RiverFactory.getRivers(); + List<String> riverFiles = new ArrayList<String>(); + + for (River river : rivers) { + // We expect that every river has only one RiverAxis. + // This is not correct but currently the case here, see + // RiverAxis.java. + List<RiverAxis> riverAxis = null; + try { + riverAxis = RiverAxis.getRiverAxis(river.getName()); + } + catch (HibernateException iae) { + logger.error("No valid riveraxis found for " + river.getName()); + continue; + } + + if (riverAxis == null) { + logger.warn("River " + river.getName() + " has no river axis!"); + continue; + } + if (riverAxis.get(0).getGeom() == null) { + logger.warn("River " + river.getName() + + " has no riveraxis geometry!"); + continue; + } + MultiLineString geom = riverAxis.get(0).getGeom(); + Envelope extent = geom.getEnvelopeInternal(); + + createRiverAxisLayer( + river.getName(), + river.getId(), + Integer.toString(geom.getSRID()), + extent.getMinX() + " " + + extent.getMinY() + " " + + extent.getMaxX() + " " + + extent.getMaxY()); + + riverFiles.add("river-" + river.getName() + ".map"); + } + writeMapfile(riverFiles); + } + + protected void createRiverAxisLayer(String riverName, int riverID, String srid, String extend) { + LayerInfo layerInfo = new LayerInfo(); + layerInfo.setName(riverName); + layerInfo.setConnection(MapUtils.getConnection()); + layerInfo.setConnectionType(MapUtils.getConnectionType()); + layerInfo.setSrid(srid); + layerInfo.setExtent(extend); + layerInfo.setType("line"); + // FIXME: Use templates for that + if (FLYSUtils.isUsingOracle()) { + layerInfo.setData("geom FROM river_axes USING SRID " + srid); + } else { + layerInfo.setData("geom FROM river_axes"); + } + layerInfo.setFilter("river_id = " + riverID); + layerInfo.setTitle(riverName + " RiverAxis"); + + File layerFile = new File("river-" + riverName + ".map"); + Template template = getTemplateByName("riveraxis-layer.vm"); + if (template == null) { + logger.warn("Template riveraxis-layer.vm not found."); + return; + } + + try { + writeLayer(layerInfo, layerFile, template); + } + catch (FileNotFoundException e) { + logger.warn(e.getLocalizedMessage(), e); + } + } + + @Override + protected String getVelocityLogfile() { + return FLYSUtils.getXPathString(XPATH_RIVERMAP_VELOCITY_LOGFILE); + } + + @Override + protected String getMapserverTemplatePath() { + return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPSERVER_TEMPLATE_PATH); + } + + @Override + public String getMapserverUrl() { + return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPSERVER_URL); + } + + @Override + protected String getMapfilePath() { + return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPFILE_PATH); + } + + @Override + protected String getMapfileTemplate() { + return FLYSUtils.getXPathString(XPATH_RIVERMAP_MAPFILE_TEMPLATE); + } +}