view src/java/de/intevation/mxd/writer/SymbolWriter.java @ 127:5ba8bf865dc7

Write expressions for string values to the mapfile.
author Raimund Renkert <rrenkert@intevation.de>
date Mon, 20 Jun 2011 11:35:40 +0200
parents 11d63bf00326
children 8f30f7e802d6
line wrap: on
line source
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 <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
 */
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) {
        logger.debug("write(Element)");
        symbolSetObj symbolSet = map.getSymbolset();

        String name = symbolElement.getAttribute("name");
        symbolObj sym = symbolSet.getSymbolByName(name);
        String symType = symbolElement.getAttribute("style");
        String type = symbolElement.getAttribute("type");
        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 if (type.equals("line")) {
            writeHatch(sym);
        }
        else {
            return false;
        }

        try {
            saveSymbolSet(symbolSet);
        }
        catch(Exception e) {
            logger.error("Error saving symbol set.");
            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
        String font = symbolElement.getAttribute("font");
        //Remove all blank character to match the mapserver fonts.txt.
        font = font.replaceAll(" ", "");
        symbol.setFont(font);
        symbol.setType(MS_SYMBOL_TYPE.MS_SYMBOL_TRUETYPE.swigValue());
        symbol.setAntialias(1);
        symbol.setCharacter("&#" + symbolElement.getAttribute("char") + ";");
    }

    private void writeHatch(symbolObj symbol) {
        logger.debug("writeHatch(symbolObj)");
        symbol.setType(MS_SYMBOL_TYPE.MS_SYMBOL_HATCH.swigValue());
    }

    public boolean canWrite(String type) {
        if (type.equals("point") ||
            type.equals("arrow") ||
            type.equals("char") ||
            type.equals("line")) {
            return true;
        }
        else {
            return false;
        }
    }

    private void saveSymbolSet(symbolSetObj symbols)
    throws Exception {
        String path = this.map.getMappath();
        if(path.equals("")) {
            return;
        }
        else {
            path += "symbols.sym";
        }
        symbols.save(path);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)