//**********************************************************************
//
//<copyright>
//
//BBN Technologies
//10 Moulton Street
//Cambridge, MA 02138
//(617) 873-8000
//
//Copyright (C) BBNT Solutions LLC. All rights reserved.
//
//</copyright>
//**********************************************************************
//
//$Source:
///cvs/darwars/ambush/aar/src/com/bbn/ambush/mission/MissionHandler.java,v
//$
//$RCSfile: MissionHandler.java,v $
//$Revision: 1.10 $
//$Date: 2004/10/21 20:08:31 $
//$Author: dietrick $
//
//**********************************************************************
package com.bbn.openmap.dataAccess.mapTile;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import com.bbn.openmap.OMComponent;
/**
* The ZoomLevelInfo class is used by the TileMaker and handles how tiles are
* defined and created for a particular zoom level. It handles any bounds
* restrictions, what layers should be rendered at this zoom level, and the path
* to the tiles from the root directory. The properties for this component are:
* <p>
*
* <pre>
* #Needed for property file creation of TileMaker
* zoomMarker.class=com.bbn.openmap.image.ZoomLevelInfo
* #Optional, to limit tile areas created, in sets of 4
* zoomMarker.bounds=lat lon lat lon lat lon lat lon
* zoomMarker.description=Tiles for zoom level 4
* #Marker names for layers to be rendered, the property prefixes for the layers held by TileMaker
* zoomMarker.layers=lakes shape
* zoomMarker.name=ZoomLayerInfo 4
* zoomMarker.zoomLevel=4
*
* </pre>
*
* Note that the zoomMarker keyword should be stored in the TileMaker zoomLevels
* property list.
*
* @author dietrick
*/
public class ZoomLevelInfo
extends OMComponent {
protected int zoomLevel = 0;
protected float scale = -1f;
/**
* Default constructor.
*/
public ZoomLevelInfo() {
}
/**
* @return the current zoom level.
*/
public int getZoomLevel() {
return zoomLevel;
}
/**
* @param zoomLevel the current zoom level.
*/
public void setZoomLevel(int zoomLevel) {
this.zoomLevel = zoomLevel;
}
/**
* Return the current scale set in this object.
*
* @return scale setting for zoom level
*/
public float getScale() {
return scale;
}
/**
* Set the current scale to use for calculating the zoom level.
*
* @param scale to set
*/
public void setScale(float scale) {
this.scale = scale;
}
/**
* @return the number of tiles across or down for the current zoom level.
*/
public int getEdgeTileCount() {
return (int) Math.pow(2, zoomLevel);
}
/**
* Given a bounds containing a lat/lon box (x, y, w, h in decimal degrees)
* and a transform for the MapTileCoordinates being used for the tiles
* (OpenStreetMap or Google (MTS)), provide the UV tile coordinates for the
* the bounding box.
*
* @param bounds decimal degree bounds
* @param mtct MapTileCoordinateTransform (OSMMapTileCoordinateTransform or
* TMSMapTileCoordinateTransform).
* @return UV tile coordinates for bounds.
*/
public Rectangle2D getUVBounds(Rectangle2D bounds, MapTileCoordinateTransform mtct, int zoomLevel) {
double x = bounds.getX();
double y = bounds.getY();
double h = bounds.getHeight();
double w = bounds.getWidth();
Point2D point1 = new Point2D.Double(x, y + h);
Point2D point2 = new Point2D.Double(x + w, y);
Point2D uluv = mtct.latLonToTileUV(point1, zoomLevel);
Point2D lruv = mtct.latLonToTileUV(point2, zoomLevel);
x = Math.floor(uluv.getX());
y = Math.floor(uluv.getY());
w = Math.ceil(lruv.getX() - x);
h = Math.ceil(lruv.getY() - y);
return new Rectangle2D.Double(x, y, w, h);
}
/**
* Creates the parent directory of the file with the current zoom level set
* in the ZoomLevelInfo.
*
* @param rootDir path to root of dir structire, with no file separator at
* the end.
* @param uvx uv x coordinate of map tile.
* @param uvy uv y coordinate of map tile.
* @return path of parent directory of the file (no y coordinate).
*/
public String formatParentDirectoryName(String rootDir, int uvx, int uvy) {
return rootDir + "/" + getZoomLevel() + "/" + uvx;
}
/**
* Creates file path given a root directory plus current zoom level, x, and
* y. Ready for file extension, which should have a period on it.
*
* @param rootDir path to root of dir structure, with no file separator at
* the end.
* @param uvx uv x coordinate of the map tile.
* @param uvy uv y coordinate of the map tile
* @return a file path, sans file extension.
*/
public String formatImageFilePath(String rootDir, int uvx, int uvy) {
return rootDir + "/" + getZoomLevel() + "/" + uvx + "/" + uvy;
}
}