# HG changeset patch # User Raimund Renkert # Date 1306857283 -7200 # Node ID 7d4cf2db43f15be72416d4c5d71065bc78d13d22 # Parent e19c5eb43099d13e8d8c3d38f080033bda344a50 Added new writer classes to be flexible in creating mapfiles. diff -r e19c5eb43099 -r 7d4cf2db43f1 ChangeLog --- a/ChangeLog Tue May 31 15:37:19 2011 +0200 +++ b/ChangeLog Tue May 31 17:54:43 2011 +0200 @@ -1,3 +1,16 @@ +2011-05-31 Raimund Renkert + + * src/java/de/intevation/mxd/writer/IWriter.java, + src/java/de/intevation/mxd/writer/MapScriptWriter.java: + Use the new classes to write the mapfile. Changed exception + handling(TODO: catch all exceptions in the writer). + + * src/java/de/intevation/mxd/writer/MarkerStyleWriter.java: + New. Write the styles for marker symbols. + + * src/java/de/intevation/mxd/writer/SymbolWriter.java: + New. Write symbols to the mapfile. + 2011-05-31 Raimund Renkert * src/java/de/intevation/mxd/Converter.java: diff -r e19c5eb43099 -r 7d4cf2db43f1 src/java/de/intevation/mxd/writer/IWriter.java --- a/src/java/de/intevation/mxd/writer/IWriter.java Tue May 31 15:37:19 2011 +0200 +++ b/src/java/de/intevation/mxd/writer/IWriter.java Tue May 31 17:54:43 2011 +0200 @@ -13,6 +13,6 @@ /** * Write the content. */ - boolean write(Document doc) throws IOException; + boolean write(Document doc) throws Exception; } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r e19c5eb43099 -r 7d4cf2db43f1 src/java/de/intevation/mxd/writer/MapScriptWriter.java --- a/src/java/de/intevation/mxd/writer/MapScriptWriter.java Tue May 31 15:37:19 2011 +0200 +++ b/src/java/de/intevation/mxd/writer/MapScriptWriter.java Tue May 31 17:54:43 2011 +0200 @@ -62,7 +62,8 @@ * * @return Currently always true. */ - public boolean write(Document doc) { + public boolean write(Document doc) + throws Exception { logger.debug("write()"); this.root = doc; @@ -138,7 +139,8 @@ /** * Create layer objects and set the attributes. */ - private void writeLayer() { + private void writeLayer() + throws Exception { logger.debug("writeLayer()"); Element mapNode = (Element)XMLUtils.xpath( root, @@ -192,7 +194,9 @@ * @param layer Mapscript layer object. * @param layerElement Dom element containing the class attributes. */ - private void writeClass(layerObj layer, Element layerElement) { + private void writeClass(layerObj layer, Element layerElement) + throws Exception { + logger.debug("writeClass(layerObj, Element)"); //Get all renderer elements (renderer in arcgis equals class in the //mapfile.) NodeList list = layerElement.getElementsByTagName("renderer"); @@ -216,7 +220,24 @@ co.setExpression(exp); } //Write symbols and styles. - writeSymbol(co, classElement); + NodeList slist = classElement.getElementsByTagName("symbol"); + String type = layerElement.getAttribute("type"); + if(type.equals("point")) { + for(int j = 0; j < slist.getLength(); j++){ + Element symbolElement = (Element) slist.item(j); + MarkerStyleWriter swriter = new MarkerStyleWriter (this.map, co); + swriter.write (symbolElement); + } + } + else if(type.equals("line")) { + for(int j = 0; j < slist.getLength(); j++){ + Element symbolElement = (Element) slist.item(j); + LineStyleWriter swriter = new LineStyleWriter (this.map, co); + swriter.write (symbolElement); + } + } + symbolSetObj symbolSet = map.getSymbolset(); + saveSymbolSet(symbolSet); } } diff -r e19c5eb43099 -r 7d4cf2db43f1 src/java/de/intevation/mxd/writer/MarkerStyleWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java/de/intevation/mxd/writer/MarkerStyleWriter.java Tue May 31 17:54:43 2011 +0200 @@ -0,0 +1,93 @@ +package de.intevation.mxd.writer; + +import java.awt.Color; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Element; + +import edu.umn.gis.mapscript.mapObj; +import edu.umn.gis.mapscript.classObj; +import edu.umn.gis.mapscript.styleObj; +import edu.umn.gis.mapscript.colorObj; +import edu.umn.gis.mapscript.symbolSetObj; + + +/** + * The interface to the mapfile writer. + * + * @author Raimund Renkert + */ +public class MarkerStyleWriter { + + /** + * The Logger. + */ + private static final Logger logger = Logger.getLogger(MarkerStyleWriter.class); + + private mapObj map; + private classObj cl; + private styleObj style; + + public MarkerStyleWriter (mapObj map, classObj cl) { + this.map = map; + this.cl = cl; + this.style = new styleObj(cl); + } + + /** + * Write the content. + */ + public boolean write(Element symbolElement) + throws Exception { + logger.debug("write(Element)"); + symbolSetObj symbolSet = map.getSymbolset(); + + if (symbolElement.hasAttribute("angle")) { + style.setAngle( + Double.parseDouble(symbolElement.getAttribute("angle"))); + } + if(symbolElement.hasAttribute("color")) { + String c = symbolElement.getAttribute("color"); + Color col = Color.decode(c); + colorObj color = new colorObj( + col.getRed(), + col.getGreen(), + col.getBlue(), + -4); + style.setColor(color); + } + if (symbolElement.hasAttribute ("size")) { + style.setSize(Double.parseDouble( + symbolElement.getAttribute("size"))); + } + if(symbolElement.hasAttribute("outline_color")) { + Color oCol = Color.decode( + symbolElement.getAttribute("outline_color")); + colorObj outlineColor = new colorObj( + oCol.getRed(), + oCol.getGreen(), + oCol.getBlue(), + -4); + style.setOutlinecolor(outlineColor); + style.setOutlinewidth(Double.parseDouble( + symbolElement.getAttribute("outline_size"))); + } + + String name = symbolElement.getAttribute("name"); + style.setSymbolByName(map, name); + + String symType = symbolElement.getAttribute("style"); + if(symType.equals("point") || + symType.equals("arrow") || + symType.equals("char")) { + SymbolWriter sw = new SymbolWriter(this.map, this.cl); + sw.write(symbolElement); + } + else { + return false; + } + return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r e19c5eb43099 -r 7d4cf2db43f1 src/java/de/intevation/mxd/writer/SymbolWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java/de/intevation/mxd/writer/SymbolWriter.java Tue May 31 17:54:43 2011 +0200 @@ -0,0 +1,112 @@ +package de.intevation.mxd.writer; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Element; + +import edu.umn.gis.mapscript.mapObj; +import edu.umn.gis.mapscript.classObj; +import edu.umn.gis.mapscript.styleObj; +import edu.umn.gis.mapscript.symbolObj; +import edu.umn.gis.mapscript.symbolSetObj; +import edu.umn.gis.mapscript.lineObj; +import edu.umn.gis.mapscript.pointObj; +import edu.umn.gis.mapscript.MS_SYMBOL_TYPE; + + +/** + * The interface to the mapfile writer. + * + * @author Raimund Renkert + */ +public class SymbolWriter { + + /** + * The Logger. + */ + private static final Logger logger = Logger.getLogger(SymbolWriter.class); + + private mapObj map; + private classObj cl; + private styleObj style; + + public SymbolWriter (mapObj map, classObj cl) { + this.map = map; + this.cl = cl; + this.style = new styleObj(cl); + } + + /** + * Write the content. + */ + public boolean write(Element symbolElement) + throws Exception { + logger.debug("write(Element)"); + symbolSetObj symbolSet = map.getSymbolset(); + + String name = symbolElement.getAttribute("name"); + symbolObj sym = symbolSet.getSymbolByName(name); + + String symType = symbolElement.getAttribute("style"); + if(symType.equals("point")) { + writeSimple(sym); + } + else if (symType.equals("arrow")) { + writeArrow(sym, symbolElement); + } + else if (symType.equals("char")) { + //TODO Does not work at all... waiting for fix. + writeCharacter(sym, symbolElement); + } + else { + return false; + } + return true; + } + + private void writeSimple(symbolObj symbol) { + logger.debug("writeSimple(symbolObj)"); + lineObj points = new lineObj(); + points.add(new pointObj(1,1,0)); + symbol.setType(MS_SYMBOL_TYPE.MS_SYMBOL_ELLIPSE.swigValue()); + symbol.setPoints(points); + symbol.setFilled(1); + } + + private void writeArrow(symbolObj symbol, Element symbolElement) { + logger.debug("writeArrow(symbolObj, Element)"); + double len = Double.parseDouble(symbolElement.getAttribute("length")); + double width = Double.parseDouble(symbolElement.getAttribute("width")); + double ratio = len/width; + lineObj points = new lineObj(); + + points.add(new pointObj(0, 0, 0)); + points.add(new pointObj((1*ratio), 0.5, 0)); + points.add(new pointObj(0, 1, 0)); + points.add(new pointObj(0, 0, 0)); + symbol.setType(MS_SYMBOL_TYPE.MS_SYMBOL_VECTOR.swigValue()); + symbol.setPoints(points); + symbol.setFilled(1); + } + + private void writeCharacter(symbolObj symbol, Element symbolElement) { + logger.debug("writeCharacter(symbolObj, Element)"); + //TODO Write the symbol correctly. See Issue 3885 on trac.osgeo.org + symbol.setFont(symbolElement.getAttribute("font")); + symbol.setType(MS_SYMBOL_TYPE.MS_SYMBOL_TRUETYPE.swigValue()); + symbol.setAntialias(1); + symbol.setCharacter("#&" + symbolElement.getAttribute("char") + ";"); + } + + public boolean canWrite(String type) { + if (type.equals("point") || + type.equals("arrow") || + type.equals("char")) { + return true; + } + else { + return false; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :