package org.geotools.tile.nasa; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.imageio.IIOException; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import junit.framework.TestCase; import org.geotools.catalog.GeoResource; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.geometry.Envelope2D; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.tile.TileMap; import org.geotools.tile.TileMapInfo; import org.geotools.tile.TileResource; import org.geotools.tile.TileServer; import org.geotools.tile.TileService; import org.geotools.tile.TileServiceInfo; import org.geotools.tile.TileSet; import org.geotools.tile.ZoomLevel; import org.geotools.tile.cache.TileRange; import com.vividsolutions.jts.geom.Envelope; public class WorldWindTest extends TestCase { WorldWindTileProtocol ww; private URL url; @Override protected void setUp() throws Exception { super.setUp(); url = WorldWindTest.class.getResource("earthimages.xml"); ww = new WorldWindTileProtocol( url ); } public void testServiceInfo() throws Exception { TileServiceInfo info = ww.getInfo( null ); assertEquals( "Images", info.getTitle() ); // example does not include abstract or description String description1 = info.getDescription(); String description2 = info.getAbstract(); } public void testTileMapInfo() throws Exception { TileServiceInfo info = ww.getInfo( null ); List ids = ww.getTileMapIds(info, null); URI id = (URI) ids.get(0); TileMapInfo tileInfo = ww.getTileMapInfo( info, id, null ); assertNotNull( tileInfo ); assertFalse( tileInfo.getZoomLevels().isEmpty() ); ZoomLevel zero = (ZoomLevel) tileInfo.getZoomLevels().iterator().next(); assertEquals( "160x80", 160, zero.getNumberOfColumns() ); assertEquals( "160x80", 80, zero.getNumberOfRows() ); Envelope bbox = tileInfo.getBounds(); assertNotNull( bbox ); assertEquals( 180.0, bbox.getHeight(), 0.001 ); assertEquals( 360.0, bbox.getWidth(), 0.001 ); assertEquals( "105", tileInfo.getName() ); assertEquals( "NLT Landsat7 (Visible Color)", tileInfo.getTitle() ); assertEquals( id , tileInfo.getIdentifier()); } public void testServiceInfoInternal() throws Exception { WorldWindTileServiceInfo info = (WorldWindTileServiceInfo) ww.getInfo( null ); List ids = info.childrenIds(); assertFalse( ids.isEmpty() ); URI id = (URI) ids.get(0); QuadTileMapInfo quadInfo = info.getInfo( id ); assertNotNull( quadInfo ); } public void testStratagy(){ TileServiceInfo info = ww.getInfo( null ); List ids = ww.getTileMapIds(info, null); URI id = (URI) ids.get(0); TileServer server = new TileServer( info ); TileMapInfo tileInfo = ww.getTileMapInfo( info, id, null ); TileMap tileMap = new TileMap( server, tileInfo ); ZoomLevel zero = (ZoomLevel) tileInfo.getZoomLevels().iterator().next(); TileSet tileSet = tileMap.getTileSet(zero); assertNotNull( tileSet ); assertEquals( zero, tileSet.getZoomLevel() ); Envelope request = new Envelope(-140,-130,40,50); TileRange range = tileSet.getTileRange( request ); Envelope bounds = range.getBounds(); assertTrue( bounds.intersects( request )); } public void testAccessorFailover() throws IOException { String good = "http://worldwind25.arc.nasa.gov/tile/tile.aspx?T=bmng.topo.bathy.200411&L=1&X=3&Y=7"; String bad = "http://worldwind25.arc.nasa.gov/tile/tile.aspx?T=105&L=0&X=63&Y=22"; ImageInputStream inputGood = Accessor.openImageInput( new URL(good)); ImageInputStream inputBad = Accessor.openImageInput( new URL(bad)); assertNotNull( inputGood ); //assertNull( inputBad ); ImageReader jpeg = ImageIO.getImageReadersByFormatName("jpeg").next(); jpeg.setInput( inputGood ); BufferedImage image = jpeg.read(0); assertNotNull( image ); assertEquals( 512, image.getWidth() ); assertEquals( 512, image.getHeight() ); jpeg.dispose(); jpeg = ImageIO.getImageReadersByFormatName("jpeg").next(); jpeg.setInput( inputBad ); try { image = jpeg.read(0); assertNotNull( image ); assertEquals( 512, image.getWidth() ); assertEquals( 512, image.getHeight() ); fail("This was supposed to be a bad image"); } catch( IIOException expected){ // expected } finally { jpeg.dispose(); } } public void testTileService() throws IOException { TileService service = new TileService(null,Collections.singletonMap("url",url)); TileResource topo = null; for( Iterator i=service.members(null).iterator(); i.hasNext();){ GeoResource handle = (GeoResource) i.next(); if( handle.getInfo(null).getName().equals("bmng.topo.bathy.200411")){ topo = (TileResource) handle; break; } } assertNotNull( topo ); TileMapInfo info = (TileMapInfo) topo.getInfo(null); assertEquals( new Envelope(-180, 180, -90, 90), info.getBounds() ); TileMap tileMap = topo.getTileMap( null ); assertEquals( info, tileMap.getInfo() ); ZoomLevel zero = (ZoomLevel) info.getZoomLevels().iterator().next(); assertEquals( 10, zero.getNumberOfColumns() ); assertEquals( 5, zero.getNumberOfRows() ); TileSet set = tileMap.getTileSet( zero ); } public void testInterestingRange() throws Exception { TileService service = new TileService(null,Collections.singletonMap("url",url)); TileResource topo = null; for( Iterator i=service.members(null).iterator(); i.hasNext();){ GeoResource handle = (GeoResource) i.next(); if( handle.getInfo(null).getName().equals("bmng.topo.bathy.200411")){ topo = (TileResource) handle; break; } } TileMapInfo info = (TileMapInfo) topo.getInfo(null); TileMap tileMap = topo.getTileMap( null ); ZoomLevel zero = (ZoomLevel) info.getZoomLevels().iterator().next(); TileSet set = tileMap.getTileSet( zero ); // start of test Envelope requestBounds = new Envelope(-167.87629932873148,-74.33033309983843,38.48575622428183,95.87699629341508); Rectangle requestRange = new Rectangle( 0,3, 2, 2 ); Envelope expectedBounds = new Envelope( -180, -180+36*2, -90+36*3, -90+36*5); Envelope expectedCoverage = info.getBounds().intersection( requestBounds ); // try with expected requestRange TileRange range = set.getTileRange( requestRange ); Envelope actualBounds = range.getBounds(); // did we get what we expected? assertEquals( requestRange, range.getRange() ); assertEquals( expectedBounds, actualBounds ); // try with expected requestBounds TileRange range2 = set.getTileRange( requestBounds ); actualBounds = range2.getBounds(); assertEquals( requestRange, range2.getRange() ); assertTrue( actualBounds+ " must contain "+expectedCoverage, actualBounds.contains( expectedCoverage ) ); assertEquals( range, range2 ); } public void testLevel0TwoTiles() throws IOException { TileService service = new TileService(null,Collections.singletonMap("url",url)); TileResource topo = null; for( Iterator i=service.members(null).iterator(); i.hasNext();){ GeoResource handle = (GeoResource) i.next(); if( handle.getInfo(null).getName().equals("bmng.topo.bathy.200411")){ topo = (TileResource) handle; break; } } TileMapInfo info = (TileMapInfo) topo.getInfo(null); TileMap tileMap = topo.getTileMap( null ); ZoomLevel zero = (ZoomLevel) info.getZoomLevels().iterator().next(); TileSet set = tileMap.getTileSet( zero ); // here is our set up: Rectangle requestRange = new Rectangle(1,3,2,1); Envelope requestBounds = new Envelope(-180+36, -180+(36*3), -90+36*3, -90+36*4); Envelope2D requestBounds2D = new Envelope2D( info.getCRS(), requestBounds.getMinX(), requestBounds.getMinY(), 36*2, 36 ); TileRange tileRange = set.getTileRange( requestRange ); assertEquals( 2, tileRange.getTiles().size() ); assertEquals( requestBounds, tileRange.getBounds() ); assertEquals( requestBounds2D, tileRange.getEnvelope2D() ); Iterator iterator = tileRange.getTiles().iterator(); GridCoverage2D place1 = (GridCoverage2D) iterator.next(); String name = place1.getName().toString(); tileRange.load(null); // load both Iterator iterator2 = tileRange.getTiles().iterator(); GridCoverage2D tile1 = (GridCoverage2D) iterator2.next(); GridCoverage2D tile2 = (GridCoverage2D) iterator2.next(); assertFalse( tileRange.getTiles().contains( place1 ) ); assertTrue( tile1.getName().equals( place1.getName()) || tile2.getName().equals( place1.getName()) ); // Test zoom level two ZoomLevel one = zero.zoom(1); set = tileMap.getTileSet( one ); assertEquals( one, set.getZoomLevel() ); TileRange again = set.getTileRange( requestBounds ); assertEquals( tileRange.getRange().width*2, again.getRange().width ); assertTrue( tileRange.getBounds().contains( again.getBounds() )); } public void testLevel0SingleTile() throws IOException { TileService service = new TileService(null,Collections.singletonMap("url",url)); TileResource topo = null; for( Iterator i=service.members(null).iterator(); i.hasNext();){ GeoResource handle = (GeoResource) i.next(); if( handle.getInfo(null).getName().equals("bmng.topo.bathy.200411")){ topo = (TileResource) handle; break; } } TileMapInfo info = (TileMapInfo) topo.getInfo(null); TileMap tileMap = topo.getTileMap( null ); ZoomLevel zero = (ZoomLevel) info.getZoomLevels().iterator().next(); TileSet set = tileMap.getTileSet( zero ); // here is our request information Rectangle requestRange = new Rectangle(0,0,1,1); Envelope requestBounds = new Envelope(-180, -180+36, -90, -90+36); ReferencedEnvelope requestBounds2D = new ReferencedEnvelope( requestBounds, info.getCRS()); // request TileRange single = set.getTileRange( requestRange ); assertNotNull( single ); Envelope bounds = single.getBounds(); assertEquals( requestBounds, bounds); Envelope2D envelope2D = single.getEnvelope2D(); assertEquals( requestBounds2D.getMinX(), envelope2D.getMinX() ); assertEquals( requestBounds2D.getMinY(), envelope2D.getMinY() ); assertEquals( requestBounds2D.getMaxX(), envelope2D.getMaxX() ); assertEquals( requestBounds2D.getMaxY(), envelope2D.getMaxY() ); assertEquals( requestBounds2D.getCoordinateReferenceSystem(), envelope2D.getCoordinateReferenceSystem() ); Set tiles = single.getTiles(); assertEquals( 1, tiles.size()); GridCoverage2D placeholder = (GridCoverage2D) tiles.iterator().next(); assertFalse( single.isLoaded() ); single.load(null); assertTrue( single.isLoaded() ); Set loaded = single.getTiles(); assertEquals( 1, tiles.size()); GridCoverage2D coverage = (GridCoverage2D) loaded.iterator().next(); assertNotSame( placeholder, coverage ); assertEquals( placeholder.getEnvelope(), coverage.getEnvelope() ); assertEquals( placeholder.getName(), coverage.getName() ); TileRange again = tileMap.getTileRange( requestBounds, zero.getScaleDenominator() ); assertEquals( single, again ); assertTrue( again.isLoaded() ); // Test zoom level two ZoomLevel one = zero.zoom(1); set = tileMap.getTileSet( one ); assertEquals( one, set.getZoomLevel() ); TileRange detailed = set.getTileRange( requestBounds ); assertEquals( (again.getRange().width)*2, detailed.getRange().width ); assertEquals( again.getRange().x*2, detailed.getRange().x ); assertTrue( again.getBounds().contains( detailed.getBounds() )); ZoomLevel two = zero.zoom(2); set = tileMap.getTileSet( two ); assertEquals( two, set.getZoomLevel() ); TileRange finer = set.getTileRange( requestBounds ); assertEquals( (again.getRange().width)*8, finer.getRange().width * 2 ); assertEquals( again.getRange().x*8, finer.getRange().x ); assertTrue( again.getBounds().contains( finer.getBounds() )); } }