Mercurial > mxd2map
view src/java/de/intevation/mxd/writer/SymbolWriter.java @ 250:d10fd4de02aa
Documented a bunch of new features
* Support of picture-marker symbol (issue343)
* Support for ArcGIS named groups (issue381)
* GLOBAL and Layer extents and SRS (issue 379)
author | Stephan Holl <stephan.holl@intevation.de> |
---|---|
date | Fri, 12 Aug 2011 09:15:34 +0200 |
parents | df4e0946ef02 |
children | 6b80e46b8f38 |
line wrap: on
line source
/* * Copyright (c) 2011 by Intevation GmbH, Germany <info@intevation.de> * * This file is part of MXD2map. * * This program is free software under the LGPL (>=v2.1) * Read the file LICENCE.txt coming with the software for details * or visit http://www.gnu.org/licenses/ if it does not exist. * * MXD2map has been developed on behalf of the * Bundesamt fuer Seeschifffahrt und Hydrographie (BSH) in Hamburg * by Intevation GmbH. * * Authors: * Raimund Renkert <raimund.renkert@intevation.de> * Bjoern Schilberg <bjoern.schilberg@intevation.de> * Stephan Holl <stephan.holl@intevation.de> */ 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.fontSetObj; import edu.umn.gis.mapscript.hashTableObj; import edu.umn.gis.mapscript.MS_SYMBOL_TYPE; import java.io.File; /** * 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 member. */ private mapObj map; private classObj cl; /** * Contructor with map object and class object. * * @param map The map object. * @param cl The class object containing the style. */ public SymbolWriter (mapObj map, classObj cl) { this.map = map; this.cl = cl; } /** * Write the content. * * @param symbolElement DOM element containg the style and symbol * attributes. */ 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")) { int exists = symbolExists(symbolElement); if(exists == -1) { String old = symbolElement.getAttribute("name"); symbolElement.setAttribute( "name", old + symbolSet.getNumsymbols() + 1); writeCharacter(sym, symbolElement); } else { symbolElement.setAttribute( "name", symbolSet.getSymbol(exists).getName()); } } 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; } /** * Create a simple point symbol. * * @param symbol The symbol object. */ 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); } /** * Create an arrow symbol. * * @param symbol The symbol object. * @param symbolElement DOM element containing symbol attributes. */ private void writeArrow(symbolObj symbol, Element symbolElement) { logger.debug("writeArrow(symbolObj, Element)"); double len = 0; double width = 1; try { len = Double.parseDouble(symbolElement.getAttribute("length")); width = Double.parseDouble(symbolElement.getAttribute("width")); } catch(NumberFormatException nfe) { logger.warn ("Error setting arrow symbol."); return; } 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); } /** * Create a character marker symbol. * * @param symbol The symbol object. * @param symbolElement DOM element containing symbol attributes. */ private void writeCharacter(symbolObj symbol, Element symbolElement) { logger.debug("writeCharacter(symbolObj, Element)"); String font = symbolElement.getAttribute("font"); //Remove all blank character to match the mapserver fonts.txt. font = font.replaceAll(" ", ""); fontSetObj fso = this.map.getFontset(); hashTableObj fonts = fso.getFonts(); String mapFont = fonts.get(font,""); if (mapFont == null || mapFont.equals("")) { logger.warn( "Could not find font " + font + " in font set. " + "Setting FreeSans as symbol font." + "Please add " + font + " to fonts.txt and replace the alias " + "in symbol \"" + symbolElement.getAttribute("name") + "\"."); font = "FreeSans"; } symbol.setName(symbolElement.getAttribute("name")); symbol.setFont(font); symbol.setType(MS_SYMBOL_TYPE.MS_SYMBOL_TRUETYPE.swigValue()); symbol.setAntialias(1); symbol.setCharacter("&#" + symbolElement.getAttribute("char") + ";"); } /** * Create a hatch symbol for polygon fill. * * @param symbol The symbol object. */ private void writeHatch(symbolObj symbol) { logger.debug("writeHatch(symbolObj)"); symbol.setType(MS_SYMBOL_TYPE.MS_SYMBOL_HATCH.swigValue()); } /** * Determine whether this writer can create the symbol. * * @param type The symbol type. */ public boolean canWrite(String type) { if (type.equals("point") || type.equals("arrow") || type.equals("char") || type.equals("line")) { return true; } else { return false; } } /** * Save the symbol set. * * @param symbols The symbol set object. */ public void saveSymbolSet(symbolSetObj symbols) throws Exception { String path = this.map.getMappath(); String filename = path.substring(path.lastIndexOf(File.separator) + 1, path.lastIndexOf(".")); String symbolPath = filename + "-symbols.sym"; if(path.equals("")) { return; } if (path.endsWith(".map")) { path = path.substring(0, path.lastIndexOf(File.separator) + 1); path += symbolPath; } else { path += symbolPath; } path = path.replaceAll("\\\\", "/"); symbols.save(path); this.map.setSymbolSet(path); } /** * Determine whether the symbol exists. * * @param elem DOM element containing the symbol attributes. * * @return Returns the symbol index if the symbol exists, else returns -1. */ private int symbolExists (Element elem) { symbolSetObj symbolSet = map.getSymbolset(); for (int i = 0; i < symbolSet.getNumsymbols(); i++) { symbolObj sym = symbolSet.getSymbol(i); int stype = sym.getType(); String etype = elem.getAttribute("style"); if(stype == MS_SYMBOL_TYPE.MS_SYMBOL_ELLIPSE.swigValue () && etype.equals("point")) { return i; } else if(stype == MS_SYMBOL_TYPE.MS_SYMBOL_VECTOR.swigValue () && etype.equals("arrow")) { return i; } else if(stype == MS_SYMBOL_TYPE.MS_SYMBOL_TRUETYPE.swigValue () && etype.equals("char")) { String font = elem.getAttribute("font"); font = font.replaceAll(" ", ""); String c = elem.getAttribute("char"); c = "&#" + c + ";"; if (font.equals(sym.getFont()) && c.equals(sym.getCharacter())) { return i; } } else if(stype == MS_SYMBOL_TYPE.MS_SYMBOL_HATCH.swigValue () && etype.equals("hatch")) { return i; } } return -1; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :