001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/portal/context/DefaultMapModelAccess.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2008 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 package org.deegree.portal.context; 044 045 import java.awt.Rectangle; 046 import java.net.URL; 047 048 import org.deegree.datatypes.QualifiedName; 049 import org.deegree.graphics.sld.StyledLayerDescriptor; 050 import org.deegree.graphics.transformation.GeoTransform; 051 import org.deegree.graphics.transformation.WorldToScreenTransform; 052 import org.deegree.model.crs.CoordinateSystem; 053 import org.deegree.model.spatialschema.Envelope; 054 import org.deegree.model.spatialschema.GeometryFactory; 055 import org.deegree.model.spatialschema.Point; 056 import org.deegree.portal.PortalException; 057 058 /** 059 * 060 * 061 * @version $Revision: 9346 $ 062 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 063 * @author last edited by: $Author: apoth $ 064 * 065 * @version 1.0. $Revision: 9346 $, $Date: 2007-12-27 17:39:07 +0100 (Do, 27 Dez 2007) $ 066 * 067 * @since 2.0 068 */ 069 public class DefaultMapModelAccess implements MapModelAccess { 070 071 private ViewContext vc = null; 072 073 /** 074 * @param vc 075 */ 076 public DefaultMapModelAccess( ViewContext vc ) { 077 this.vc = vc; 078 } 079 080 public ViewContext addCRSToLayer( String name, URL owsAddress, String type, String crsName ) 081 throws PortalException { 082 // TODO Auto-generated method stub 083 return null; 084 } 085 086 public ViewContext addFormatToLayer( String name, URL owsAddress, String type, String mimeType ) 087 throws PortalException { 088 // TODO Auto-generated method stub 089 return null; 090 } 091 092 public ViewContext addLayer( QualifiedName name, URL owsAddress, String type ) 093 throws PortalException { 094 // TODO Auto-generated method stub 095 return null; 096 } 097 098 public ViewContext addLayer( int index, QualifiedName name, URL owsAddress, String type ) 099 throws PortalException { 100 // TODO Auto-generated method stub 101 return null; 102 } 103 104 public ViewContext addLayer( int index, Layer layer ) 105 throws PortalException { 106 // TODO Auto-generated method stub 107 return null; 108 } 109 110 public ViewContext addLayer( Layer layer ) 111 throws PortalException { 112 // TODO Auto-generated method stub 113 return null; 114 } 115 116 public ViewContext addLayers( QualifiedName[] names, URL[] owsAddresses, String type ) 117 throws PortalException { 118 // TODO Auto-generated method stub 119 return null; 120 } 121 122 public ViewContext addLayers( Layer[] layers ) 123 throws PortalException { 124 // TODO Auto-generated method stub 125 return null; 126 } 127 128 public ViewContext addStyleToLayer( QualifiedName name, URL owsAddress, String type, String styleName ) 129 throws PortalException { 130 // TODO Auto-generated method stub 131 return null; 132 } 133 134 public ViewContext assignSLDToLayer( QualifiedName name, URL owsAddress, String type, StyledLayerDescriptor sld ) 135 throws PortalException { 136 // TODO Auto-generated method stub 137 return null; 138 } 139 140 public ViewContext destroyGroup( String groupName ) { 141 // TODO Auto-generated method stub 142 return null; 143 } 144 145 public ViewContext groupLayers( int first, int last, String groupName, String parentGroupName ) 146 throws PortalException { 147 // TODO Auto-generated method stub 148 return null; 149 } 150 151 public ViewContext groupLayers( String[] layers, URL[] owsAddresses, String[] types, String groupName, 152 String parentGroupName ) 153 throws PortalException { 154 // TODO Auto-generated method stub 155 return null; 156 } 157 158 public ViewContext pan( double directionDegree, double factor ) 159 throws PortalException { 160 // TODO Auto-generated method stub 161 return null; 162 } 163 164 /** 165 * moves the boundingbox of the map to a well known direction. Directions that are known: 166 * <ul> 167 * <li> 168 * 169 * @see #PAN_NORTH</li> 170 * <li> 171 * @see #PAN_NORTHEAST</li> 172 * <li> 173 * @see #PAN_NORTHWEST</li> 174 * <li> 175 * @see #PAN_SOUTH</li> 176 * <li> 177 * @see #PAN_SOUTHEAST</li> 178 * <li> 179 * @see #PAN_SOUTHWEST</li> 180 * <li> 181 * @see #PAN_WEST</li> 182 * <li> 183 * @see #PAN_EAST</li> 184 * </ul> 185 * @param direction 186 * direction the map view shall be moved to 187 * @param factor 188 * factor measured in % the map view shall be moved 189 * @return modified ViewContext 190 * @throws PortalException 191 * will be thrown if passed direction is not valid or factor is <= 0 192 */ 193 public ViewContext pan( int direction, double factor ) 194 throws PortalException, ContextException { 195 if ( direction < 0 || direction > 7 ) { 196 throw new PortalException( "invalid pan direction: " + direction ); 197 } 198 if ( factor <= 0 ) { 199 throw new PortalException( "pan factor must be > 0 " ); 200 } 201 factor = factor / 100.0; 202 Point[] bbox = vc.getGeneral().getBoundingBox(); 203 double dx = ( bbox[1].getX() - bbox[0].getX() ) * factor; 204 double dy = ( bbox[1].getY() - bbox[0].getY() ) * factor; 205 double minx = bbox[0].getX(); 206 double miny = bbox[0].getY(); 207 double maxx = bbox[1].getX(); 208 double maxy = bbox[1].getY(); 209 210 if ( direction == MapModelAccess.PAN_WEST || direction == MapModelAccess.PAN_NORTHWEST 211 || direction == MapModelAccess.PAN_SOUTHWEST ) { 212 minx = minx - dx; 213 maxx = maxx - dx; 214 } else if ( direction == MapModelAccess.PAN_EAST || direction == MapModelAccess.PAN_NORTHEAST 215 || direction == MapModelAccess.PAN_SOUTHEAST ) { 216 minx = minx + dx; 217 maxx = maxx + dx; 218 } 219 if ( direction == MapModelAccess.PAN_SOUTH || direction == MapModelAccess.PAN_SOUTHEAST 220 || direction == MapModelAccess.PAN_SOUTHWEST ) { 221 miny = miny - dy; 222 maxy = maxy - dy; 223 } else if ( direction == MapModelAccess.PAN_NORTH || direction == MapModelAccess.PAN_NORTHEAST 224 || direction == MapModelAccess.PAN_NORTHWEST ) { 225 miny = miny + dy; 226 maxy = maxy + dy; 227 } 228 Envelope env = GeometryFactory.createEnvelope( minx, miny, maxx, maxy, null ); 229 return setMapBoundingBox( env ); 230 } 231 232 /** 233 * centers he map described by a ViewContext to the passed point. The behavior of this method is 234 * the same as 235 * 236 * @see #zoom(java.awt.Point, double) with a passed factor == 0; 237 * 238 * @param point 239 * point (pixel coordinates) of the current map that marks the new center of the map 240 * @return modified ViewContext 241 */ 242 public ViewContext recenterMap( java.awt.Point point ) 243 throws ContextException { 244 return zoom( point, 0 ); 245 } 246 247 /** 248 * centers he map described by a ViewContext to the passed point. The behavior of this method is 249 * the same as 250 * 251 * @see #zoom(Point, double) with a passed factor == 0; 252 * 253 * @param point 254 * point (map coordinates) of the current map that marks the new center of the map 255 * @return modified ViewContext 256 */ 257 public ViewContext recenterMap( Point point ) 258 throws ContextException { 259 return zoom( point, 0 ); 260 } 261 262 public ViewContext removeCRSFromLayer( String name, URL owsAddress, String type, String crsName ) { 263 // TODO Auto-generated method stub 264 return null; 265 } 266 267 public ViewContext removeFormatFromLayer( String name, URL owsAddress, String type, String mimeType ) 268 throws PortalException { 269 // TODO Auto-generated method stub 270 return null; 271 } 272 273 public ViewContext removeLayer( QualifiedName name, URL owsAddress, String type ) { 274 // TODO Auto-generated method stub 275 return null; 276 } 277 278 public ViewContext removeStyleFromLayer( QualifiedName name, URL owsAddress, String type, String styleName ) { 279 // TODO Auto-generated method stub 280 return null; 281 } 282 283 public ViewContext setCurrentMapFormat( String mimeType, URL owsAddress, String type ) 284 throws PortalException { 285 // TODO Auto-generated method stub 286 return null; 287 } 288 289 public ViewContext setLayerActiveStyle( QualifiedName name, URL owsAddress, String type, String styleName ) 290 throws PortalException { 291 // TODO Auto-generated method stub 292 return null; 293 } 294 295 public ViewContext setLayers( QualifiedName[] names, URL[] owsAddresses, String type ) 296 throws PortalException { 297 // TODO Auto-generated method stub 298 return null; 299 } 300 301 public ViewContext setLayers( Layer[] layers ) 302 throws PortalException { 303 // TODO Auto-generated method stub 304 return null; 305 } 306 307 public ViewContext setLayersVisible( String name, URL owsAddress, String type, boolean visible ) 308 throws PortalException { 309 // TODO Auto-generated method stub 310 return null; 311 } 312 313 /** 314 * sets the bounding box a map/VieContext 315 * 316 * @param boundingBox 317 * new boundingbox 318 * @return modified ViewContext 319 */ 320 public ViewContext setMapBoundingBox( Envelope boundingBox ) 321 throws ContextException { 322 323 CoordinateSystem crs = vc.getGeneral().getBoundingBox()[0].getCoordinateSystem(); 324 Point[] points = new Point[2]; 325 points[0] = GeometryFactory.createPoint( boundingBox.getMin(), crs ); 326 points[1] = GeometryFactory.createPoint( boundingBox.getMax(), crs ); 327 vc.getGeneral().setBoundingBox( points ); 328 329 return vc; 330 } 331 332 public ViewContext setMapCRS( String crs ) 333 throws PortalException { 334 // TODO Auto-generated method stub 335 return null; 336 } 337 338 /** 339 * sets the width and height of a map described by a ViewContext 340 * 341 * @param width 342 * map width measured in pixel 343 * @param height 344 * map height measured in pixel 345 * @return modified ViewContext 346 * @throws PortalException 347 * will be thrown if width or height < 1 (even a width or height of 1 pixel is not 348 * really useful but formal it is valid); 349 */ 350 public ViewContext setMapSize( int width, int height ) 351 throws PortalException { 352 if ( width < 1 ) { 353 throw new PortalException( "width must be > 0" ); 354 } 355 if ( height < 1 ) { 356 throw new PortalException( "height must be > 0" ); 357 } 358 Rectangle window = new Rectangle( 0, 0, width, height ); 359 vc.getGeneral().setWindow( window ); 360 return vc; 361 } 362 363 public ViewContext swapGroups( QualifiedName name, boolean up ) 364 throws PortalException { 365 // TODO Auto-generated method stub 366 return null; 367 } 368 369 /** 370 * swaps two layers in their order. The layer identified by the passed name and OWS can be moved 371 * up or down for one position. If a layer can not be moved up or down because it is already the 372 * top or bottom most layer the unchanged <code>ViewContext</code> will be returned 373 * <p> 374 * Notice: if to layers to be swaped are served by differend OWS at least one new image-layer 375 * must be created by the client. 376 * </p> 377 * 378 * @param name 379 * name of the layer to be moved up or down in the list 380 * @param owsAddress 381 * address of the OWS that serves the layer 382 * @param type 383 * OWS type (WCS, WMS or WFS) 384 * @param up 385 * true if layer should be moved up otherwise it will be moved down. 386 * @return modified ViewContext 387 * @throws PortalException 388 * will be thrown if the layer does not exists in a ViewContext. 389 */ 390 public ViewContext swapLayers( QualifiedName name, URL owsAddress, String type, boolean up ) 391 throws PortalException { 392 393 Layer layer = vc.getLayerList().getLayer( name.getPrefixedName(), owsAddress.toExternalForm() ); 394 vc.getLayerList().move( layer, up ); 395 return vc; 396 } 397 398 /** 399 * zoom in or out of the map described by a ViewContext and recenters it to the passed point. 400 * <ul> 401 * <li>factor > 0: zoomout</li> 402 * <li>factor < 0: zoomin</li> 403 * <li>factor == 0: recenter</li> 404 * </ul> 405 * 406 * @param factor 407 * zoom factor in % of the boundingbox size 408 * @param point 409 * point (pixel coordinates) of the current map that marks the new center of the map 410 * @return modified ViewContext 411 */ 412 public ViewContext zoom( java.awt.Point point, double factor ) 413 throws ContextException { 414 Point[] points = vc.getGeneral().getBoundingBox(); 415 Rectangle window = vc.getGeneral().getWindow(); 416 GeoTransform gt = new WorldToScreenTransform( points[0].getX(), points[0].getY(), points[1].getX(), 417 points[1].getY(), 0, 0, window.width, window.height ); 418 double x = gt.getSourceX( point.x ); 419 double y = gt.getSourceX( point.y ); 420 Point pt = GeometryFactory.createPoint( x, y, null ); 421 return zoom( pt, factor ); 422 } 423 424 /** 425 * zoom in or out of the map described by a ViewContext and recenters it to the passed point. 426 * <ul> 427 * <li>factor > 0: zoomout</li> 428 * <li>factor < 0: zoomin</li> 429 * <li>factor == 0: recenter</li> 430 * </ul> 431 * 432 * @param factor 433 * zoom factor in % of the boundingbox size 434 * @param point 435 * point (map coordinates) of the current map that marks the new center of the map 436 * @return modified ViewContext 437 */ 438 public ViewContext zoom( Point point, double factor ) 439 throws ContextException { 440 Point[] points = vc.getGeneral().getBoundingBox(); 441 double w = points[1].getX() - points[0].getX(); 442 double h = points[1].getY() - points[0].getY(); 443 factor = 1d + ( factor / 100d ); 444 w = w * factor; 445 h = h * factor; 446 double minx = point.getX() - w / 2d; 447 double miny = point.getY() - h / 2d; 448 double maxx = point.getX() + w / 2d; 449 double maxy = point.getY() + h / 2d; 450 Envelope env = GeometryFactory.createEnvelope( minx, miny, maxx, maxy, null ); 451 return setMapBoundingBox( env ); 452 } 453 454 }