rrenkert@243: /* rrenkert@243: * Copyright (c) 2011 by Intevation GmbH, Germany rrenkert@243: * rrenkert@243: * This file is part of MXD2map. rrenkert@243: * rrenkert@243: * This program is free software under the LGPL (>=v2.1) rrenkert@243: * Read the file LICENCE.txt coming with the software for details rrenkert@243: * or visit http://www.gnu.org/licenses/ if it does not exist. rrenkert@243: * rrenkert@243: * MXD2map has been developed on behalf of the rrenkert@243: * Bundesamt fuer Seeschifffahrt und Hydrographie (BSH) in Hamburg rrenkert@243: * by Intevation GmbH. rrenkert@243: * rrenkert@243: * Authors: rrenkert@243: * Raimund Renkert rrenkert@243: * Bjoern Schilberg rrenkert@243: * Stephan Holl rrenkert@243: */ rrenkert@243: rrenkert@58: package de.intevation.mxd.reader; rrenkert@58: rrenkert@58: import org.apache.log4j.Logger; rrenkert@58: rrenkert@58: import com.esri.arcgis.display.ISymbol; rrenkert@63: import com.esri.arcgis.display.IMarkerSymbol; rrenkert@58: import com.esri.arcgis.display.PictureMarkerSymbol; raimund@251: import com.esri.arcgis.support.ms.stdole.Picture; raimund@251: import com.esri.arcgis.display.RgbColor; rrenkert@58: rrenkert@58: import org.w3c.dom.Element; rrenkert@115: import java.io.IOException; raimund@251: import java.awt.Image; raimund@251: import java.awt.image.BufferedImage; raimund@251: import javax.imageio.ImageIO; raimund@251: import java.io.ByteArrayOutputStream; raimund@251: import java.awt.Color; raimund@251: raimund@251: import org.apache.commons.codec.binary.Base64; rrenkert@58: rrenkert@58: /** rrenkert@58: * Reads picture marker symbol information. rrenkert@58: * rrenkert@58: * @author Raimund Renkert rrenkert@58: */ rrenkert@80: public class PictureMarkerSymbolReader rrenkert@80: extends AbstractSymbolReader { rrenkert@58: rrenkert@58: /** rrenkert@58: * The logger. rrenkert@58: */ rrenkert@58: private static final Logger logger = rrenkert@58: Logger.getLogger(PictureMarkerSymbolReader.class); rrenkert@58: rrenkert@58: /** rrenkert@58: * Private member. rrenkert@58: */ rrenkert@58: private PictureMarkerSymbol symbol; rrenkert@58: rrenkert@58: public PictureMarkerSymbolReader(ISymbol symbol) rrenkert@58: throws Exception { aheinecke@336: logger.debug("constructor()"); rrenkert@58: if(symbol instanceof PictureMarkerSymbol) { rrenkert@58: this.symbol = (PictureMarkerSymbol)symbol; rrenkert@58: } rrenkert@58: else { rrenkert@58: throw new Exception("Not a PictureMarkerSymbol!"); rrenkert@58: } rrenkert@58: } rrenkert@58: rrenkert@63: public PictureMarkerSymbolReader(IMarkerSymbol symbol) rrenkert@63: throws Exception { aheinecke@336: logger.debug("constructor()"); rrenkert@63: if(symbol instanceof PictureMarkerSymbol) { rrenkert@63: this.symbol = (PictureMarkerSymbol)symbol; rrenkert@63: } rrenkert@63: else { rrenkert@63: throw new Exception("Not a PictureMarkerSymbol!"); rrenkert@63: } rrenkert@63: } rrenkert@63: rrenkert@58: /** rrenkert@58: * Reads the symbol attributes. rrenkert@58: * rrenkert@58: * @return The XML node. rrenkert@58: */ rrenkert@115: public Element read() { rrenkert@84: //TODO Read the picture from mxd and write it as base64 string to the rrenkert@84: // XML Element. rrenkert@58: logger.debug("read()"); rrenkert@80: Element symbolElement = util.addSymbol(parent); rrenkert@58: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "angle", rrenkert@115: String.valueOf(symbol.getAngle())); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read angle."); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "size", rrenkert@115: String.valueOf(symbol.getSize())); rrenkert@115: } rrenkert@115: catch (IOException ioe) { rrenkert@115: logger.warn("Could not read size. Setting size to 1."); rrenkert@135: symbolElement.setAttribute("size", "1"); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "x_offset", rrenkert@115: String.valueOf(symbol.getXOffset())); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read x-offset."); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "y_offset", rrenkert@115: String.valueOf(symbol.getYOffset())); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read y-offset."); rrenkert@115: } rrenkert@115: rrenkert@115: try { rrenkert@115: symbolElement.setAttribute( rrenkert@115: "name", rrenkert@115: symbol.getNameString()); rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@115: logger.warn("Could not read name. Setting name to \"default\""); rrenkert@115: symbolElement.setAttribute("name", "default"); rrenkert@115: } rrenkert@115: raimund@251: //Read the picture and convert to base64. rrenkert@115: try { raimund@251: Picture p = symbol.getPicture(); raimund@251: Image i = p.toImage(); raimund@251: if(i instanceof BufferedImage) { raimund@251: BufferedImage bi = (BufferedImage)i; raimund@251: ByteArrayOutputStream baos = new ByteArrayOutputStream(); raimund@251: //Get byte array from image. raimund@251: ImageIO.write(bi, "BMP", baos); raimund@251: Base64 encoder = new Base64(); raimund@251: //encode in a base64 string raimund@251: String pict = encoder.encodeBase64String(baos.toByteArray()); raimund@251: symbolElement.setAttribute("picture", pict); raimund@251: raimund@251: //Get transparent color. raimund@251: RgbColor c = new RgbColor(); raimund@251: c.setRGB(symbol.getBitmapTransparencyColor().getRGB()); raimund@251: Color transp = new Color ( raimund@251: c.getRed(), raimund@251: c.getGreen(), raimund@251: c.getBlue()); raimund@251: symbolElement.setAttribute( raimund@251: "transparent_color", raimund@251: String.valueOf(transp.getRGB())); raimund@251: } raimund@251: else { raimund@251: logger.warn("Could not read image symbol."); raimund@251: return null; raimund@251: } rrenkert@115: } rrenkert@115: catch(IOException ioe) { rrenkert@135: logger.warn("Could not read picture."); rrenkert@115: } rrenkert@58: symbolElement.setAttribute("style", "picture"); rrenkert@89: symbolElement.setAttribute("type", "marker"); rrenkert@58: return symbolElement; rrenkert@58: } rrenkert@58: } rrenkert@58: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :