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@33: package de.intevation.mxd.reader; rrenkert@25: rrenkert@25: import java.io.IOException; rrenkert@25: rrenkert@25: import org.apache.log4j.Logger; rrenkert@25: rrenkert@25: import com.esri.arcgis.carto.IMap; rrenkert@39: import com.esri.arcgis.carto.Map; rrenkert@25: import com.esri.arcgis.geometry.ISpatialReference; rrenkert@25: import com.esri.arcgis.geometry.ProjectedCoordinateSystem; rrenkert@25: import com.esri.arcgis.geometry.GeographicCoordinateSystem; rrenkert@31: import com.esri.arcgis.geometry.UnknownCoordinateSystem; rrenkert@25: import com.esri.arcgis.geometry.Projection; rrenkert@39: import com.esri.arcgis.geometry.IEnvelope; rrenkert@27: rrenkert@27: import org.w3c.dom.Element; rrenkert@27: rrenkert@33: import de.intevation.mxd.utils.MapToXMLUtils; rrenkert@33: rrenkert@25: /** rrenkert@25: * Reads map information. rrenkert@25: * rrenkert@25: * @author Raimund Renkert rrenkert@25: */ rrenkert@43: public class MapReader { rrenkert@43: /** rrenkert@43: * The Logger. rrenkert@43: */ rrenkert@43: private static final Logger logger = Logger.getLogger(MapReader.class); rrenkert@25: rrenkert@43: /** rrenkert@43: * Private member. rrenkert@43: */ rrenkert@39: private Map map; rrenkert@31: private MapToXMLUtils util; rrenkert@25: rrenkert@181: /** rrenkert@181: * Constructor with ArcGIS map. rrenkert@181: * rrenkert@181: * @param map The ArcGIS map object. rrenkert@181: */ rrenkert@39: public MapReader(IMap map) rrenkert@39: throws Exception { rrenkert@25: logger.debug("constructor()"); rrenkert@39: if(map instanceof Map) { rrenkert@39: this.map = (Map)map; rrenkert@39: } rrenkert@39: else { rrenkert@39: throw new Exception("Not an instance of \"Map\"!"); rrenkert@39: } rrenkert@25: } rrenkert@25: rrenkert@25: /** rrenkert@25: * Reads the Map attributes. rrenkert@25: */ rrenkert@43: public void read() rrenkert@43: throws IOException { rrenkert@25: logger.debug("read()"); rrenkert@43: if(util == null) { rrenkert@27: throw new IOException("Can not write to document."); rrenkert@43: } rrenkert@27: rrenkert@39: //Create XML Element for map. rrenkert@31: Element mapElement; rrenkert@31: try{ rrenkert@31: mapElement = util.createMap(); rrenkert@31: } rrenkert@31: catch(Exception e){ rrenkert@121: logger.error("Could not create DOM element. Aborting."); rrenkert@121: throw new IOException("Error creating DOM element."); rrenkert@31: } rrenkert@39: rrenkert@39: //Read map name. rrenkert@121: try { rrenkert@121: mapElement.setAttribute("name", map.getName()); rrenkert@121: } rrenkert@121: catch(IOException ioe) { rrenkert@121: logger.warn( rrenkert@121: "Could not read map name." + rrenkert@121: " Setting map name to \"default-map\""); rrenkert@121: mapElement.setAttribute("name", "default-map"); rrenkert@121: } rrenkert@39: rrenkert@39: //Read map extent. rrenkert@121: try { rrenkert@121: IEnvelope ext = map.getExtent(); rrenkert@121: mapElement.setAttribute( rrenkert@121: "extent_max_x", rrenkert@121: String.valueOf(ext.getXMax())); rrenkert@121: mapElement.setAttribute( rrenkert@121: "extent_max_y", rrenkert@121: String.valueOf(ext.getYMax())); rrenkert@121: mapElement.setAttribute( rrenkert@121: "extent_min_x", rrenkert@121: String.valueOf(ext.getXMin())); rrenkert@121: mapElement.setAttribute( rrenkert@121: "extent_min_y", rrenkert@121: String.valueOf(ext.getYMin())); rrenkert@121: } rrenkert@121: catch(IOException ioe) { rrenkert@121: logger.warn("Could not read map extend. Setting to 0, 0, 0, 0."); rrenkert@121: mapElement.setAttribute("extend_max_x", "0"); rrenkert@121: mapElement.setAttribute("extend_min_x", "0"); rrenkert@121: mapElement.setAttribute("extend_max_y", "0"); rrenkert@121: mapElement.setAttribute("extend_min_y", "0"); rrenkert@121: } rrenkert@39: rrenkert@39: //Read map units. rrenkert@121: int units = 0; rrenkert@121: try { rrenkert@121: units = map.getMapUnits(); rrenkert@121: } rrenkert@121: catch(IOException ioe) { rrenkert@121: logger.warn( rrenkert@121: "Could not read map units." + rrenkert@121: " Setting map units to unknown."); rrenkert@121: units = 0; rrenkert@121: } rrenkert@121: rrenkert@39: String s_units; rrenkert@39: switch(units) { rrenkert@39: case 1: s_units = "inches"; break; rrenkert@121: case 2: s_units = "points"; break; rrenkert@121: case 3: s_units = "feet"; break; rrenkert@121: case 4: s_units = "yards"; break; rrenkert@39: case 5: s_units = "miles"; break; rrenkert@39: case 6: s_units = "nauticalmiles"; break; rrenkert@121: case 7: s_units = "millimeters"; break; rrenkert@121: case 8: s_units = "centimeters"; break; rrenkert@121: case 9: s_units = "meters"; break; rrenkert@121: case 10: s_units = "kilometers"; break; rrenkert@121: case 11: s_units = "degree"; break; rrenkert@121: case 12: s_units = "decimeters"; break; rrenkert@121: case 13: s_units = "units_last"; break; rrenkert@121: default : s_units = "unknown"; break; rrenkert@39: } rrenkert@39: mapElement.setAttribute("units", s_units); rrenkert@39: rrenkert@121: if(units == 0) { rrenkert@121: logger.warn( rrenkert@121: "Unknown units." + rrenkert@121: " Please edit units in resulting mapfile."); rrenkert@121: } rrenkert@121: rrenkert@121: try { rrenkert@121: mapElement.setAttribute( rrenkert@121: "scale", rrenkert@121: String.valueOf(map.getMaxScale())); rrenkert@121: } rrenkert@121: catch(IOException ioe) { rrenkert@121: logger.warn("Could not read map scale. Setting map scale to 1000"); rrenkert@121: mapElement.setAttribute("scale", "1000"); rrenkert@121: } rrenkert@39: rrenkert@39: //Read the projection. rrenkert@121: try { rrenkert@121: ISpatialReference sr = map.getSpatialReference(); vc11884admin@170: int projection = 0; rrenkert@121: if(sr instanceof ProjectedCoordinateSystem) { rrenkert@121: ProjectedCoordinateSystem pcs = (ProjectedCoordinateSystem)sr; vc11884admin@170: projection = pcs.getFactoryCode(); rrenkert@121: } rrenkert@121: else if(sr instanceof GeographicCoordinateSystem) { rrenkert@121: GeographicCoordinateSystem gcs = (GeographicCoordinateSystem)sr; vc11884admin@170: projection = gcs.getFactoryCode(); rrenkert@121: } rrenkert@121: else if(sr instanceof UnknownCoordinateSystem) { rrenkert@121: UnknownCoordinateSystem ucs = (UnknownCoordinateSystem)sr; vc11884admin@170: projection = 0; rrenkert@121: } rrenkert@121: else{ rrenkert@121: logger.debug( rrenkert@121: "Unknown SpatialReference: " + rrenkert@121: sr.getClass().toString()); rrenkert@121: } rrenkert@121: vc11884admin@170: if(projection == 0) { rrenkert@121: logger.warn( rrenkert@121: "Unknown projection." + rrenkert@121: " Please edit projection in resulting mapfile."); rrenkert@121: } vc11884admin@170: mapElement.setAttribute("projection", String.valueOf(projection)); rrenkert@31: } rrenkert@121: catch(IOException ioe) { rrenkert@121: logger.warn( rrenkert@121: "Could not read map projection." + rrenkert@121: " Setting map projection to unknown."); rrenkert@121: mapElement.setAttribute("projection", "Unknown"); rrenkert@27: } aheinecke@317: aheinecke@317: // read the reference scale aheinecke@317: try { aheinecke@317: mapElement.setAttribute("referencescale", String.valueOf( aheinecke@317: map.getReferenceScale())); aheinecke@317: } catch (Exception e) { aheinecke@317: logger.warn("Could not read referencescale of map"); aheinecke@317: } rrenkert@27: } rrenkert@27: rrenkert@43: /** rrenkert@43: * Set the utilities. rrenkert@43: */ rrenkert@43: public void setUtil(MapToXMLUtils util) { rrenkert@31: this.util = util; rrenkert@25: } rrenkert@25: } rrenkert@25: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :