001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/coverage/grid/GMLGridCoverageWriter.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2006 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstr. 19 030 53115 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 Department of Geography 036 University of Bonn 037 Meckenheimer Allee 166 038 53115 Bonn 039 Germany 040 E-Mail: greve@giub.uni-bonn.de 041 042 043 ---------------------------------------------------------------------------*/ 044 package org.deegree.model.coverage.grid; 045 046 import java.io.IOException; 047 import java.io.OutputStream; 048 import java.net.URL; 049 import java.util.List; 050 import java.util.Map; 051 052 import org.deegree.datatypes.parameter.GeneralParameterValueIm; 053 import org.deegree.datatypes.parameter.InvalidParameterNameException; 054 import org.deegree.datatypes.parameter.InvalidParameterValueException; 055 import org.deegree.datatypes.parameter.OperationParameterIm; 056 import org.deegree.datatypes.parameter.ParameterNotFoundException; 057 import org.deegree.framework.log.ILogger; 058 import org.deegree.framework.log.LoggerFactory; 059 import org.deegree.framework.xml.NamespaceContext; 060 import org.deegree.framework.xml.XMLFragment; 061 import org.deegree.framework.xml.XMLParsingException; 062 import org.deegree.framework.xml.XMLTools; 063 import org.deegree.ogcbase.CommonNamespaces; 064 import org.w3c.dom.Element; 065 import org.w3c.dom.Node; 066 067 /** 068 * Implementation of {@link "org.opengis.coverage.grid.GridCoverageWriter"} for writing a 069 * GridCoverage as GML document to a defined destioation 070 * 071 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 072 * @author last edited by: $Author: apoth $ 073 * 074 * @version $Revision: 6585 $, $Date: 2007-04-11 15:18:40 +0200 (Mi, 11 Apr 2007) $ 075 */ 076 public class GMLGridCoverageWriter extends AbstractGridCoverageWriter { 077 078 private static ILogger LOG = LoggerFactory.getLogger( GMLGridCoverageWriter.class ); 079 080 private URL template = GMLGridCoverageWriter.class.getResource( "gml_rectifiedgrid_template.xml" ); 081 082 /** 083 * 084 * @param destination 085 * @param metadata 086 * @param subNames 087 * @param currentSubname 088 * @param format 089 */ 090 public GMLGridCoverageWriter( Object destination, Map<String, Object> metadata, String[] subNames, 091 String currentSubname, Format format ) { 092 super( destination, metadata, subNames, currentSubname, format ); 093 094 } 095 096 /** 097 * disposes all resources assigned to a GMLGridCoverageWriter instance. For most cases this will 098 * be IO-resources 099 * 100 * @throws IOException 101 */ 102 public void dispose() 103 throws IOException { 104 105 } 106 107 /** 108 * @param coverage 109 * @param parameters 110 * must contain the servlet URL within the first field; all other fields must contain 111 * the required parameters for a valid GetCoverage request 112 * @throws InvalidParameterNameException 113 * @throws InvalidParameterValueException 114 * @throws ParameterNotFoundException 115 * @throws IOException 116 */ 117 public void write( GridCoverage coverage, GeneralParameterValueIm[] parameters ) 118 throws InvalidParameterNameException, InvalidParameterValueException, 119 ParameterNotFoundException, IOException { 120 XMLFragment xml = new XMLFragment(); 121 try { 122 xml.load( template ); 123 Element root = xml.getRootElement(); 124 NamespaceContext nsc = CommonNamespaces.getNamespaceContext(); 125 126 String xpath = "gml:rectifiedGridDomain/gml:RectifiedGrid/gml:limits/gml:GridEnvelope/gml:low"; 127 Element element = (Element) XMLTools.getNode( root, xpath, nsc ); 128 double x = coverage.getEnvelope().minCP.ord[0]; 129 double y = coverage.getEnvelope().minCP.ord[1]; 130 Node node = root.getOwnerDocument().createTextNode( 131 Double.toString( x ) 132 + ' ' 133 + Double.toString( y ) ); 134 element.appendChild( node ); 135 136 xpath = "gml:rectifiedGridDomain/gml:RectifiedGrid/gml:limits/gml:GridEnvelope/gml:high"; 137 element = (Element) XMLTools.getNode( root, xpath, nsc ); 138 x = coverage.getEnvelope().maxCP.ord[0]; 139 y = coverage.getEnvelope().maxCP.ord[1]; 140 node = root.getOwnerDocument().createTextNode( 141 Double.toString( x ) 142 + ' ' 143 + Double.toString( y ) ); 144 element.appendChild( node ); 145 146 xpath = "gml:rectifiedGridDomain/gml:RectifiedGrid/gml:origin/gml:Point"; 147 element = (Element) XMLTools.getNode( root, xpath, nsc ); 148 element.setAttribute( "srsName", coverage.getCoordinateReferenceSystem().getName() ); 149 150 xpath = "gml:rectifiedGridDomain/gml:RectifiedGrid/gml:origin/gml:Point/gml:pos"; 151 element = (Element) XMLTools.getNode( root, xpath, nsc ); 152 x = coverage.getEnvelope().minCP.ord[0]; 153 y = coverage.getEnvelope().minCP.ord[1]; 154 node = root.getOwnerDocument().createTextNode( 155 Double.toString( x ) 156 + ' ' 157 + Double.toString( y ) ); 158 element.appendChild( node ); 159 160 double[] res = calcGridResolution( coverage, parameters ); 161 162 xpath = "gml:rectifiedGridDomain/gml:RectifiedGrid/gml:offsetVector"; 163 List list = XMLTools.getNodes( root, xpath, nsc ); 164 for ( int i = 0; i < list.size(); i++ ) { 165 element = (Element) list.get( i ); 166 element.setAttribute( "srsName", coverage.getCoordinateReferenceSystem().getName() ); 167 if ( i == 0 ) { 168 node = root.getOwnerDocument().createTextNode( res[i] + " 0" ); 169 element.appendChild( node ); 170 } else if ( i == 1 ) { 171 node = root.getOwnerDocument().createTextNode( "0 " + res[i] ); 172 element.appendChild( node ); 173 } else if ( i == 2 ) { 174 node = root.getOwnerDocument().createTextNode( "0 0 " + res[i] ); 175 element.appendChild( node ); 176 } 177 } 178 179 xpath = "gml:rangeSet/gml:File/gml:fileName"; 180 element = (Element) XMLTools.getNode( root, xpath, nsc ); 181 StringBuffer sb = new StringBuffer( 300 ); 182 OperationParameterIm op = (OperationParameterIm) parameters[0].getDescriptor(); 183 sb.append( op.getDefaultValue() ).append( '?' ); 184 for ( int i = 1; i < parameters.length; i++ ) { 185 // OperationParameter 186 op = (OperationParameterIm) parameters[i].getDescriptor(); 187 sb.append( op.getName() ); 188 sb.append( '=' ).append( op.getDefaultValue() ); 189 if ( i < parameters.length - 1 ) { 190 sb.append( '&' ); 191 } 192 } 193 node = root.getOwnerDocument().createCDATASection( sb.toString() ); 194 element.appendChild( node ); 195 } catch ( XMLParsingException e ) { 196 LOG.logError( "could not parse GMLGridCoverage response template", e ); 197 throw new InvalidParameterValueException( "", e.getMessage(), "" ); 198 } catch ( Exception e ) { 199 LOG.logError( "could not write GMLGridCoverage", e ); 200 throw new InvalidParameterValueException( "", e.getMessage(), "" ); 201 } 202 xml.write( ( (OutputStream) destination ) ); 203 204 } 205 206 /** 207 * returns the resolution of the grid in x- and y- directory 208 * 209 * @param coverage 210 * @param parameters 211 * @return the resolution of the grid in x- and y- directory 212 */ 213 private double[] calcGridResolution( GridCoverage coverage, GeneralParameterValueIm[] parameters ) { 214 double wx = coverage.getEnvelope().maxCP.ord[0] - coverage.getEnvelope().minCP.ord[0]; 215 double wy = coverage.getEnvelope().maxCP.ord[1] - coverage.getEnvelope().minCP.ord[1]; 216 Integer width = (Integer) getNamedParameter( parameters, "width" ).getDefaultValue(); 217 Integer height = (Integer) getNamedParameter( parameters, "height" ).getDefaultValue(); 218 double dx = wx / width.doubleValue(); 219 double dy = wy / height.doubleValue(); 220 double[] res = new double[] { dx, dy }; 221 return res; 222 } 223 224 /** 225 * selects the parameter matching the passed name from the passed array 226 * 227 * @param parameters 228 * @param name 229 * @return 230 */ 231 private OperationParameterIm getNamedParameter( GeneralParameterValueIm[] parameters, 232 String name ) { 233 for ( int i = 0; i < parameters.length; i++ ) { 234 // OperationParameter 235 OperationParameterIm op = (OperationParameterIm) parameters[i].getDescriptor(); 236 if ( op.getName().equals( name ) ) { 237 return op; 238 } 239 } 240 return null; 241 } 242 243 } 244 /*************************************************************************************************** 245 * <code> 246 Changes to this class. What the people have been up to: 247 248 $Log$ 249 Revision 1.15 2007/03/06 14:55:16 wanhoff 250 Fixed Javadoc (@throws, changed @see to @link) 251 252 Revision 1.14 2007/02/09 17:28:00 poth 253 *** empty log message *** 254 255 Revision 1.13 2007/02/02 07:59:14 wanhoff 256 fixed Javadoc @return tag and footer 257 258 Revision 1.12 2006/12/27 13:44:37 poth 259 useless method removed 260 261 Revision 1.11 2006/07/05 12:58:09 poth 262 bug fix - creating offSetVectors for rectified grid corrected 263 264 Revision 1.10 2006/06/12 08:09:54 poth 265 calculation of rectified grid completed 266 267 </code> 268 **************************************************************************************************/