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