/* Copyright (C) 2001, 2006 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. */ package gov.nasa.worldwind.layers.Earth; import gov.nasa.worldwind.avlist.*; import gov.nasa.worldwind.geom.*; import gov.nasa.worldwind.layers.*; import gov.nasa.worldwind.util.*; import java.net.*; /** * OpenStreetMap WMS layer(s). * @author Patrick Murris * @version $Id: OpenStreetMapLayer.java 5055 2008-04-14 05:19:11Z tgaskins $ */ public class OpenStreetMapLayer extends BasicTiledImageLayer { private static final String defaultDatasetName = "osm-4326-hybrid"; private String datasetName; /** * Default OpenStreetMap hybrid layer - transparent, see-through. */ public OpenStreetMapLayer() { super(makeLevels(defaultDatasetName)); this.setUseTransparentTextures(true); this.datasetName = defaultDatasetName; } /** * Access to a specific layer from OSM WMS server - eg 'osm-4326'. * @param datasetName the layer dataset name. */ public OpenStreetMapLayer(String datasetName) { super(makeLevels(datasetName)); this.setUseTransparentTextures(true); this.datasetName = datasetName; } private static LevelSet makeLevels(String datasetName) { AVList params = new AVListImpl(); params.setValue(AVKey.TILE_WIDTH, 256); params.setValue(AVKey.TILE_HEIGHT, 256); params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-WMS/" + datasetName); params.setValue(AVKey.SERVICE, "http://t2.hypercube.telascience.org/tiles"); params.setValue(AVKey.DATASET_NAME, datasetName); params.setValue(AVKey.FORMAT_SUFFIX, ".dds"); params.setValue(AVKey.NUM_LEVELS, 20); params.setValue(AVKey.NUM_EMPTY_LEVELS, 0); params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(180d), Angle.fromDegrees(180d))); params.setValue(AVKey.SECTOR, Sector.FULL_SPHERE); params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder()); return new LevelSet(params); } private static class URLBuilder implements TileUrlBuilder { public URL getURL(Tile tile, String imageFormat) throws MalformedURLException { StringBuffer sb = new StringBuffer(tile.getLevel().getService()); if (sb.lastIndexOf("?") != sb.length() - 1) sb.append("?"); sb.append("request=GetMap"); sb.append("&layers="); sb.append(tile.getLevel().getDataset()); sb.append("&srs=EPSG:4326"); sb.append("&width="); sb.append(tile.getLevel().getTileWidth()); sb.append("&height="); sb.append(tile.getLevel().getTileHeight()); Sector s = tile.getSector(); sb.append("&bbox="); sb.append(s.getMinLongitude().getDegrees()); sb.append(","); sb.append(s.getMinLatitude().getDegrees()); sb.append(","); sb.append(s.getMaxLongitude().getDegrees()); sb.append(","); sb.append(s.getMaxLatitude().getDegrees()); sb.append("&format=image/png"); sb.append("&service=WMS"); sb.append("&version=1.1.1"); return new java.net.URL(sb.toString()); } } @Override public String toString() { return Logging.getMessage("layers.Earth.OpenStreetMapLayer.Name") + (defaultDatasetName.equals(this.datasetName) ? "" : " " + this.datasetName); } }